Null eine beliebig große Zelle in Brainf ***

28

Ihre Aufgabe ist es, einen Code zu schreiben, der die aktuelle Zelle in der Brainfuck-Variante auf Null setzt. Dabei kann jede Zelle anstelle der normalen 0 bis 255 eine vorzeichenbehaftete Ganzzahl von beliebig großer Größe enthalten .

Sie können davon ausgehen , gibt es l Zellen links und r Zellen rechts von der aktuellen Zelle , die anfänglich Null ist. Ihr Programm darf nur auf diese l + r + 1-Zellen zugreifen . Nachdem Ihr Code beendet ist, sollten die l + r zusätzlichen Zellen Null und der Zeiger auf die aktuelle Zelle an der ursprünglichen Position belassen.

Sie dürfen keine Ein- / Ausgänge verwenden.

Der Code mit dem kleinsten l + r gewinnt. Bei Gleichstand gewinnt der kürzeste Code. Es wird empfohlen, auch die zeitliche Komplexität Ihres Programms als Referenz anzugeben, wobei n der absolute Wert der ursprünglichen Ganzzahl in der aktuellen Zelle ist.

Nützliche Hilfsmittel

Sie können ein Brainfuck-Programm in dieser Variante mit diesem Interpreter auf TIO von mbomb007 testen .

Sie können in dieser Antwort auch den Interpreter von boothby verwenden (andere Python-Antworten funktionieren wahrscheinlich auch, aber ich habe nicht getestet).

jimmy23013
quelle
Ich habe es mit Code-Golf markiert, weil ich denke, dass wir das optimale L + R schnell erreichen werden.
Jimmy23013
2
Es hört sich so an, als hätten Sie in Ihrem Kommentar eine Ganzzahl beliebig großer Größe gemeint, die positiv oder negativ sein kann. Dies ist ein Unterschied im englischen Dialekt für einige Leute, daher kann es hilfreich sein zu verdeutlichen, dass es sehr positiv oder sehr negativ sein kann.
isaacg
4
@ jimmy23013 Hast du einen BF-Interpreter mit signierten Zellen, die wir dafür verwenden können?
mbomb007
@ mbomb007 codegolf.stackexchange.com/a/3085/25180 aber wahrscheinlich zu golfig ...
jimmy23013
1
@Mego Warum? In der "echten" Herausforderung müssen Sie auch das optimale l + r erhalten, was es wahrscheinlich schwieriger macht, die Codegröße zu reduzieren.
Jimmy23013

Antworten:

17

l + r = 0 + 2 = 2, 55 53 51 Bytes

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

l + r = 1 + 2 = 3, 46, 44 Bytes

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

Mein eigener Algorithmus. Der Zeiger sollte an der Zahl beginnen, die auf Null gesetzt werden muss. Die zeitliche Komplexität ist O (n ^ 2).

Wie es funktioniert:

  • Wir beginnen mit der Nummer n.
  • Wir erhöhen eins, damit die Zahl wird n+1.
  • Wir dekrementieren zwei, damit die Zahl wird n+1-2 = n-1
  • Wir erhöhen drei, damit die Zahl wird n-1+3 = n+2.
  • Wir dekrementieren vier, damit die Zahl wird n+2-4 = n-2.

Wir wiederholen den Vorgang und erhöhen die In- / Dekrementierung bei jedem Schritt, bis wir null bekommen.

JungHwan min
quelle
2
Genau an den Algorithmus habe ich gedacht, nachdem ich die Phase "Das ist gar nicht möglich" hinter mir gebracht hatte: P
ETHproductions
9

l + r = 0 + 2 = 2; 58 Bytes

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

Die Komplexität ist O (n ^ 2).

Das Folgende ist mein Testprogramm-Generator, so dass Sie sehen können, dass ich tatsächlich versucht habe, es zu testen, falls es nicht funktioniert ...

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))
Feersum
quelle
Sie können es mit dem soeben erstellten Interpreter testen. Siehe Kommentar
mbomb007
Es sieht so aus, als würde es bei mir funktionieren.
mbomb007
2
Dies muss das optimale L + R sein. Schneller Beweis, dass 1 unmöglich ist: An jedem Punkt, an dem die Ersatzzelle Null erreicht, können Sie nur eine begrenzte Datenmenge zusätzlich zum Wert der Originalzelle (in der Position des Bandkopfs und des Befehlszeigers) speichern, was bedeutet, dass Sie haben nur eine eingeschränkte Möglichkeit, die Hauptzelle von diesem Punkt aus in mindestens eine Richtung anzupassen.
@ ais523 Es könnte andere gleichwertige geben. Es wäre interessant, wenn jemand l + r = 1 + 1 schafft.
mbomb007