Brainfuck比较两个数字的大小

22

如何使用不等式比较两个数字?(大于或小于)

我想比较单个数字。 例如:

1 2
5 3
9 2

等等。

6个回答

26

这是比较两个数字的最佳方法。为什么呢?因为如果您足够聪明,可以在更大的程序中使用相同的代码。它非常便携。

假设我们有两个数字a和b。 我们有两个块:if( a>=b )else, 希望这已经足够了。

    0 1 0 a b 0
让数组变成这样。指向 (4) 即指向 a

让数组变成这样。指向 (4) 即指向 a

    +>+<                   This is for managing if a=0 and b=0
    [->-[>]<<]             This is a magic loop. if a is the one which 
                           reaches 0 first (a<b),then pointer will be at(4).
                           Else it will be at (3)
    <[-  
         //       BLOCK (a>=b)
         //You are at (2) and do whatever you want and come back to (2).
         //Its a must
    ]
    <[-<
         //       BLOCK(a<b)
         //You are at (1) and do whatever you want and come back to (1).
         //Its a must
    ]

这不会影响以下程序代码,因为两个代码块最终都会在 (1) 处结束。你可以进一步编写代码,假设指针将到达 (1)。

如果复制代码,请删除文档,因为代码包含一些有效的Brainfuck符号,如< . ,等等。


它不会影响以下的程序代码,因为两个代码块最终都会到达(1) 您可以编写代码,假设指针将到达(1) - Dheeraj Ram
1
你知道吗?你可以随时编辑自己的帖子以添加信息,只需使用帖子末尾的“编辑”链接按钮即可。我还建议您查看我们的常见问题解答:http://stackoverflow.com/faq :) - ForceMagic
在你的“魔法循环”中,[>] 实际上是一个无限循环。它应该是 [>[-]] 才能终止。 - Timtech
2
@Timtech 不是的。是代码让这个工作起来。如果 b 是零, [>] 将终止,然后 << 将停留在 a 之前的单元格上,该单元格为零。如果 b 不为零,则将停留在其旁边的零处,并且循环将继续,直到 ab 为零为止。 - Sylwester
是的,它有效。我使用相同的代码来查找两个多位数的总和...就像我之前说的那样,您可以重用此代码。请查看此链接.. https://dev59.com/wWgv5IYBdhLWcg3wVfZ6#19412942 - Dheeraj Ram
显示剩余2条评论

10

一旦你知道两个数字之间的距离,你应该在同一次循环迭代中递减它们两个,然后检查两个数字是否都为零:这样你就可以知道哪一个更小。

例如:

+++++ > +++ < [->-< check is first is zero, then second]

(这只是给您一个提示,您需要注意相等数字和类似问题。)


4

我也在思考这个问题,虽然我确定这不是最好的解决方案,但至少它可以回答哪个数字更大的问题 =)

该程序要求输入两个字符,如果第一个字符小于第二个字符,则输出'<',如果第一个字符大于第二个字符,则输出'>',如果它们相等,则输出'='。在输出一个字符后,该程序通过请求额外的输入来停止。

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

希望更加清晰明了:

+                                   init (0) to 1
>,                                  read (1)
>,                                  read (2)
<<[                                 loop forever
  >-[>>>]                           decrement (1) going to (4) if (1) != 0
  <[                                goto (0) == 1 if (1) reached 0 (otherwise goto (3))
    >>-[>++++++++++[->++++++<]>.,]  decrement (2) printing lessthan if larger than 0
    ++++++++++[->++++++<]>+.,       if (2) == 0 print '='
  ]
  <-[>>>]                           decrement (2) going to (5) if (2) != 0
  <<[                               goto (0) == 1 if (2) reached 0 (otherwise goto (3))
    >>>++++++++++[->++++++<]>++.,   print largerthan since (2) reached 0 first
  ]
  <<<                               goto(0)
]

1
我制作了一个解决方案,它会返回一个布尔值,并且指针始终在相同的位置。
这是初始状态:
0 0 0 a b 0 0
      p

这是可能的两个输出:

0 0 0 0 0 1 0   #true
            p

0 0 0 0 0 0 0   #false
            p

代码:

 >>>>
    [                 # while cell != 0
      -               #   decrement a
      [               #   if a != 0
        >-            #     decrement b 
        [             #     if b != 0
          <           #       go left
          <-<         #       undo the finally-block;
        ]             #     finally-block
        <[-]>         #       clear a
        >+>           #       res = 1; move to end-position
        <<<           #       undo the finally-block
      ]               #   finally-block
      >[-]>>          #     clear b; res = 0; move to end-position
    ]                 #

压缩版本:

 >>>>[-[>-[< <-<]<[-]>>+><<<]>[-]>>]

-2

给定两个数字A和B,以下代码将打印A,如果A大于B,则打印B,如果B大于A,则打印C,如果两者相等。

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


-13
在BF中不存在这样的东西。BF中的><分别将指针向右和向左移动。

18
据我所知,OP希望在BF中实现运算符的功能。 - ArjunShankar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接