找出单元格中的数字是偶数还是奇数

时间:2015-07-17 19:37:42

标签: algorithm brainfuck

鉴于磁带的第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在计算的复杂性方面可能过度。

是否有更好的算法/技术来确定细胞是否均匀?

4 个答案:

答案 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。