如何在Brainfuck中编写if else语句

时间:2017-09-05 13:56:19

标签: if-statement brainfuck

我刚刚发现了一种编程语言,叫做Brainfuck。

我的问题是如何在Brainfuck中写一个if-else语句?

通过比较两个细胞来完成吗?如果是,那么如何比较该程序中的两个单元格?

谢谢

2 个答案:

答案 0 :(得分:2)

你需要一个[x,1]结构,其中x可以是0或其他。解释它的最简单方法是创建一个循环,你知道指针不会结束它开始的循环。

假设这些单元格被命名为cell1和cell2

您执行的操作会更改cell1的值,而cell2的值不会更改。

操纵值后,让指针指向cell1然后再做其他选择。

[-]> cell1 = 0
[-]+ cell2 = 1
|manipulations that change cell1 value
|goto to cell1
[                          // if cell1 != 0
    [-]>[-]                // both cell1 and cell2 now equal 0 
                              if you want the loop to end and want to prevent the 
                              next loop from starting
    |do something
    |goto cell1            // Make sure you point again to cell1 to exit the loop
]>[                        // else
    |do something else
    |goto cell1            // Make sure you point again to cell1 to exit the loop
]

在这个例子中,我使用//来标记注释,我使用|标记操作 失去对指针的跟踪是你最大的敌人,所以它可能有助于分离你的代码并发表一些评论。

所以最后回答你的问题:不,你不比较两个单元格,你做的结果为0或其他的操作,然后你检查那个单元格== 0。

你做的操作可以比较两个单元格,但是你必须按照自己的顺序进行比较

这是Brainfuck的维基百科页面,你可以看到很多简单而复杂的Brainfuck算法,欢迎来到社区:)

https://esolangs.org/wiki/Brainfuck_algorithms#if_.28x.29_.7B_code1_.7D_else_.7B_code2_.7D

答案 1 :(得分:0)

编辑:我在上一篇文章中弄乱了 @e 位置;默认应该是 1。


感谢@Sirmyself 的回答。但是,有一个问题:如果你这样做

# reimplementation of @Sirmyself's answer, bare
>+
<[
    [-]>-
    # if block
<]>[
    -
    # else block
]

# same as above, address-annotated
@0
>@1 +1
<@0 [
    @0 [-]0  # problem
    >@1 -1
    # if block
<@0 ] >@1 [
    @1 -1
    # else block
@1 ]

然后 @0 处的值被消耗。更重要的是,如果解释器未优化,它会尝试一次将值递减 @0 一个,并且需要很长时间才能运行。

更好的方法是使用两个额外的常量 @k@2k 和一个额外的变量 @e,如下所示:(我使用的是 @1 {{1} } @2,分别)

@3

更详细的解释:

@0
>@1 [-]0 >@2 [-]+1 >@3 [-]+1
<<<@0 [
    # if block
>>>@3 -1 <<@1 ] >@1|2 [ <@1 ] >>@3 [
    # else block
@3 -1 ] +1

请注意,这会保留原始值,并且不会冒重复递减值的风险。

重要:原始值 @0 # original value >@1 [-]0 >@2 [-]+1 >@3 [-]+1 # @1 and @2 are constants; (@3)=1 indicates else <<<@0 [ # go in from the original value # if block >>>@3 -1 <<@1 ] # if executes: (@3)=0; (ptr=@1)==0 no loop >@1|2 # @1 into @2 (if); @0 into @1 (else) [ <@1 ] # @2 back to (@1)==0 and exits; restabilize at @1 >>@3 [ # enter block at else flag # else block @3 -1 ] +1 # reset else flag; exit 和常量 @o@k 在内存中必须均匀分布 - 即地址方向,@2k。这是滑过和返回工作所必需的。

我遇到这个 Stack Overflow 页面是因为我想加快 if-else 的速度,但最终我还是不得不想出我自己的解决方案。

用于复制粘贴的裸代码:(虽然我真的推荐地址注释)

@k - @o == @2k - @k