鉴于磁带的第0个单元格中的数字已被填充,其余部分仅用作临时单元格(即它们都从0开始并且是临时的 - 我不在乎它们发生了什么),我会喜欢用0或1替换第0个单元格,如果是偶数则替换为0,如果是奇数则替换为1。
基本上,我想做的是(在C-esque伪代码中):
cell[0] = (cell[0] % 2)
我知道存在divmod algorithm定义如下:
如果不需要保留n,请使用以下变体:
# >n d [->-[>+>>]>[+[-<+>]>+>>]<<<<<] # >0 d-n%d n%d n/d
然而,由于X % 2 == X & 1
,即X mod 2是X的最右边,我认为divmod在计算的复杂性方面可能过度。
是否有更好的算法/技术来确定细胞是否均匀?
答案 0 :(得分:5)
你需要一种只保持奇偶校验的算法,你可以这样做:
result=0
while(n > 0) {
result++;
n--;
if(n > 0) {
result--;
n--;
}
}
要测试n而不丢失其值,您需要复制它:从A复制到B和C然后将C移动到A.您可以测试B并将n保持为A.这是brainfuck代码:
[->+<] # move @0 to @1
> # goto @1
[-<+ # if @1 then decrements @1 and increments @0
> # goto @1
[->+>+<<] # if @1 then move @1 to @2 and @3
>> # goto @3
[-<<+>>] # if @3 then move @3 to @1
< # goto @2
[<-<->>[-]] # if @2 then decrements @0, decrements @1 and sets 0 into @2
< # go to @1
] # continue loop if @1 is not null
< # goto @0
光形式:
[->+<]>[-<+>[->+>+<<]>>[-<<+>>]<[<-<->>[-]]<]<
答案 1 :(得分:3)
N奇数或偶数:
>, load m1 with N
[-[->]<]+ set m0 = 1 if odd
set m1 = 1 if even
答案 2 :(得分:2)
这是一个完全解决P:
的版本N是奇数还是偶数?
>, ~load m1 with N (not counted for golf scoring)
>>+>+<<< ~set 'trail of breadcrumbs' so we can figure out
where P is
[-[->]<]+ ~if N is odd set m0 = 1
>>>[>] ~figure out where P is
<[-<]<[-]< ~go back to m1 and zero out if N is even
指针P以m0结束 奇数:m0 = 1 even:m0 = 0
答案 3 :(得分:0)
你必须检查模数才能知道它是偶数还是奇数。这是最简单的方法。但我对你发布的divmod算法持谨慎态度。它应该在检查模2时起作用,但如果我没记错的话,不要试图用它除以1.
在PC上,您可以将数字与1进行比较(假设它是一个整数)。但是,brainfuck没有一个AND运算符,所以你将不得不走很长的路。你知道计算机以二进制形式存储数字,但这并不是脑筋急转弯的问题。它没有给你一个二进制值数组来操纵。它为您提供了一个数字数组,您只能递增,递减或比较为0。