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

Finding out if a number in a cell is even or odd

假设磁带的第 0 个单元格中的数字已填满,其余的都只是用作临时单元格(即它们都从 0 开始并且是临时的——我不在乎它们会发生什么),我想用 0 或 1 替换第 0 个单元格。偶数为 0,奇数为 1。

基本上,我想做的是(在 C 风格的伪代码中):

cell[0] = (cell[0] % 2)

我知道存在一个divmod algorithm定义如下:

If one does not need to preserve n, use this variant:

# >n d
[->-[>+>>]>[+[-<+>]>+>>]<<<<<]
# >0 d-n%d n%d n/d

但是,由于X % 2 == X & 1,即X mod 2是X的最右边的位,我认为divmod在计算复杂度方面可能有点过分了。

有没有更好的方法algorithm/technique判断单元格是否均匀?

您必须检查模数才能知道它是偶数还是奇数。这是最简单的方法。但我会对您发布的 divmod 算法保持警惕。它应该在检查模 2 时起作用,但如果我没记错的话,请不要尝试使用它除以 1。

在 PC 上,您可以将数字与 1 相加(假设它是一个整数)。但是 brainfuck 没有 AND 运算符,所以你将不得不走很长的路。您知道计算机以二进制形式存储数字,但这是 none brainfuck 关心的问题。它不会为您提供要操作的二进制值数组。它为您提供了一个数字数组,您只能递增、递减或与 0 进行比较。

你需要一个只保持奇偶校验的算法,你可以这样做:

result=0
while(n > 0) {
  result++;
  n--;
  if(n > 0) {
    result--;
    n--;
  }
}

要在不丢失其值的情况下测试 n,您需要复制它:从 A 复制到 B,然后将 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

轻型:

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

N个奇数或偶数:

>,             load m1 with N

[-[->]<]+      set m0 = 1 if odd
               set m1 = 1 if even

这里是完全解析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 偶数:m0 = 0