zoukankan      html  css  js  c++  java
  • Brainf**k(一位数求max)

    题目大意:给你两个一位数,要你求出其中的较大值(使用$Brainf**k$)

    ($Brainf**k$简介,相当于有一个数组和一个指针,","为把数组当前位赋值为读入的数,"."为输出当前位置的值,"<"为指针左移一位(最左端为$0$),">"为指针右移一位,"+"数组当前位置的值加一,"-"数组当前位置的值减一,"[]"循环,每次运行到"["或"]"时判断一下当前位置是否为$0$,是,退出循环,否,继续循环)

    题解:我还是太菜,想了$20$分钟。我构造了一个序列(标号从$0$开始),如下(上面的数字表示这一位的值,$a$为输入的第一个数,$b$为输入的第二个数;下面的数字表示这个位置的标号)

    读入时的数列(>+>,>,,):

    $$0qquad 1qquad 0qquad bqquad 0qquad 0qquad 0\
    0qquad 1qquad 2qquad 3qquad 4qquad 5qquad 6$$

    然后把$b$在第$6$位建一个备份(先把$b$复制到位置$5,6$,再把位置$5$复制到位置$3$)([->>+>+<<<]>>[-<<+>>]<<<):

    $$0qquad 1qquad aqquad bqquad 0qquad 0qquad b\
    0qquad 1qquad 2qquad 3qquad 4qquad 5qquad 6$$

    这时,我们把$a,b$循环$-1$,但是每次往回移动指针时,若该位置有值,就一直左移,然后向右移动两位([->-[<]>>]):

    分类讨论(记$M$为$max(a,b)$,$A$为$M-a$,$B$为$M-b$):

    1.正常情况(即$a,b$都不为零),那么指针会先移动到位置$0$,再移动到位置$2$(即$a$的位置),然后继续:

    $$0qquad 1qquad aqquad bqquad 0qquad 0qquad b\
    0qquad 1qquad 2qquad 3qquad 4qquad 5qquad 6$$

    2.若$a$为零,即$a<b$,那么指针会先移动到位置$2$(即原来$a$的位置),再移动到位置$4$,循环就会结束:

    $$0qquad 1qquad 0qquad Bqquad 0qquad 0qquad b\
    0qquad 1qquad 2qquad 3qquad 4qquad 5qquad 6$$

    3.若$b$为零,即$ageq b$,那么指针就先会停在位置$3$(即原来$b$的位置),再移动到位置$5$,循环结束:

    $$0qquad 1qquad Aqquad 0qquad 0qquad 0qquad b\
    0qquad 1qquad 2qquad 3qquad 4qquad 5qquad 6$$

    现在,原来$a,b$的位置存的值为$A$和$B$,

    所以这时的指针就会停在位置$4,5$,这时把指针向左移动$4$格,也就是说指针会停在位置$0,1$(<<<<),

    然后若这个位置有值(也就是在位置$1$),就继续向左移动([<]),

    所以现在指针停在位置$0$,再向右移动$3$格,就停在了位置$3$,即$max(a,b)-b$(>>>)。

    最后把位置$3$的值(值为$max(a,b)-b$)加到位置$6$(值为$b$)就行了。
    $$0qquad 1qquad 0qquad 0qquad 0qquad 0qquad M\
    0qquad 1qquad 2qquad 3qquad 4qquad 5qquad 6$$

    卡点:我竟然一次过???

    Brainf**k Code:

    >+>,>,,[->>+>+<<<]>>[-<<+>>]<<<[->-[<]>>]<<<<[<]>>[->>>>+<<<<]>>>>.
    

      

  • 相关阅读:
    探索数据
    Python基础15
    Jupyter Notebook 打开方法
    03-目录结构
    02-安装 CentOS7
    12-EndWithEstore
    11-Upload&Download
    10-Listener&Filter
    09-JDBC
    08-MVC&JavaBean
  • 原文地址:https://www.cnblogs.com/Memory-of-winter/p/9476810.html
Copyright © 2011-2022 走看看