Brainf ***の任意の大きなセルをゼロにします***


28

あなたの仕事は、各セルが通常の0から255の代わりに任意の大きさの符号付き整数を含むことができるBrainfuckバリアントの現在のセルをゼロにするコードを書くことです。

現在のセルの左側にl個、右側にr個のセルがあり、それらは最初はゼロであると想定できます。プログラムは、これらのl + r +1セルにのみアクセスできます。コードが終了すると、l + r個の余分なセルはゼロのままになり、現在のセルへのポインタは元の位置に残ります。

入出力を使用することはできません。

最小のl + rを持つコードが優先されます。同点の場合、最短のコードが優先されます。参照用にプログラムの時間の複雑さも記載することをお勧めします。nは、現在のセルの元の整数の絶対値です。

便利なツール

mbomb007によるTIOでこのインタープリターを使用して、このバリエーションのBrainfuckプログラムをテストできます。

boothbyによるこの回答でインタープリターを使用することもできます(他のPythonの回答もおそらく機能しますが、テストしませんでした)。


最適なl + rにすぐに到達すると思うので、コードゴルフにタグを付けました。
jimmy23013

2
あなたのコメントから、あなたは正または負の任意の大きさの整数を意味したように聞こえます。これは一部の人々にとって英語の方言の違いであるため、非常に肯定的または非常に否定的である可能性があることを明確にすることが役立つ場合があります。
isaacg

4
@ jimmy23013これに使用できる署名付きセルを備えたBFインタープリターはありますか?
mbomb007

@ mbomb007 codegolf.stackexchange.com/a/3085/25180おそらくあまりにもgolfy ...
jimmy23013

1
@Mego Why?「実際の」課題では、最適なl + rも取得する必要があります。これにより、おそらくコードサイズを小さくすることが難しくなります。
jimmy23013

回答:


17

l + r = 0 + 2 = 2、55 53 51バイト

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

l + r = 1 + 2 = 3、46 44バイト

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

私自身のアルゴリズム。ポインターは、ゼロにする必要がある番号から開始する必要があります。時間の複雑さはO(n ^ 2)です。

使い方:

  • 番号から始めnます。
  • 1をインクリメントするため、数はになりn+1ます。
  • 2を減らすため、数は n+1-2 = n-1
  • 3をインクリメントするため、数はになりn-1+3 = n+2ます。
  • 4をデクリメントするため、数はになり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

うまくいくようです。
mbomb007

2
これは最適なl + rでなければなりません。1が不可能であることの迅速な証明:スペアセルがゼロに達する各ポイントでは、元のセルの値(テープヘッドの位置と命令ポインター)に加えて、有限量のデータのみを保存できます。そのポイントから少なくとも1つの方向にメインセルを調整できる範囲が制限されます。

@ ais523他の同等のものがある可能性があります。誰かがl + r = 1 + 1を作成すると面白いでしょう。
mbomb007
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.