将Brainf中的任意大单元归零***


28

您的任务是编写一段代码,将Brainfuck变体中的当前单元格清零,每个单元格可以包含任意大数值的有符号整数,而不是正常的0到255。

您可以假设当前单元格的左边有l个单元格,而右边的r个单元格最初为零。您的程序只能访问这些l + r +1个单元。代码结束后,应将l + r个额外的单元格保留为零,并将指向当前单元格的指针保留在原始位置。

您不得使用任何输入/输出。

l + r最小的代码获胜。如果有平局,则以最短的代码为准。建议还声明程序的时间复杂度以供参考,其中n是当前单元格中原始整数的绝对值。

有用的工具

您可以使用mbomb007在TIO上使用此解释器来测试此版本中的Brainfuck程序。

您还可以通过廷比此答案中使用解释器(其他Python答案也可能有效,但我没有测试)。


我将其标记为代码高尔夫,因为我认为我们将迅速达到最佳l + r。
jimmy23013

2
从您的评论中听起来,您的意思是任意大的整数,它可以是正数或负数。对于某些人来说,这是英语方言的不同之处,因此弄清它可能是正面的还是负面的可能会有所帮助。
isaacg '17

4
@ jimmy23013您是否有一个带符号单元格的BF解释器可用于此目的?
mbomb007 '17

@ mbomb007 codegolf.stackexchange.com/a/3085/25180,但可能太高尔夫球了……
jimmy23013

1
@Mego为什么?在“实际”挑战中,您还必须获得最佳的l + r,这可能会使减小代码大小变得更加困难。
jimmy23013

Answers:


17

l + r = 0 + 2 = 2,55 53 51字节

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

l + r = 1 + 2 = 3,46 44字节

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

我自己的算法。指针应从需要清零的数字开始。时间复杂度为O(n ^ 2)。

怎么运行的:

  • 我们从数字开始n
  • 我们加一,所以数字变为n+1
  • 我们递减二,所以数字变成 n+1-2 = n-1
  • 我们增加三,所以数字变为n-1+3 = n+2
  • 我们递减四,所以数变为n+2-4 = n-2

我们重复此过程,增加/减少每一步,直到得到零。


2
正是经过了“这甚至是不可能的”阶段之后,我想到的算法:P
ETHproductions

9

l + r = 0 + 2 = 2; 58个字节

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

复杂度为O(n ^ 2)。

以下是我的测试程序生成器,因此您可以看到我实际上尝试对其进行测试,以防其无法正常工作...

p='''
>+<
[
>
[<->>+<-]
>+<
<[>]>
[<<+>+>-]
<
[->+<]
>[<]>
+ [-<+>]
<<
]
> [-] <
'''

p = ''.join(p.split())

cpp = '''
#include <bits/stdc++.h>
using namespace std;
void test(int q) {
long long t[3] = {q, 0, 0};
int i = 0;
ZZZ
printf("q=%d %lld %lld %lld\\n", q, t[0], t[1], t[2]);
}
int main() {
while(true) {
    int q; cin >> q; test(q);
}
}
'''

d = {
'>': '++i; assert(i<3);',
'<': '--i; assert(i>=0);',
'+': '++t[i];',
'-': '--t[i];',
'[': 'while(t[i]){',
']': '}',
}

print cpp.replace('ZZZ', ''.join(d[c] for c in p))

您可以使用我刚做的解释器对其进行测试。查看评论
mbomb007 '17

看来对我有用。
mbomb007 '17

2
这必须是最优的l + r。快速证明1是不可能的:在备用单元为零的每个点上,除了原始单元的值(在磁带头位置和指令指针中),您只能存储有限数量的数据,这意味着您在至少一个方向上可以从该点调整主单元的距离有限。

@ ais523可能还有其他等效的内容。如果有人创建l + r = 1 + 1会很有趣。
mbomb007 '17
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.