我刚刚发现了一种编程语言,叫做Brainfuck。
我的问题是如何在Brainfuck中写一个if-else语句?
通过比较两个细胞来完成吗?如果是,那么如何比较该程序中的两个单元格?
谢谢
答案 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