找出单元格中的数字是偶数还是奇数
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
假设磁带的第 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