Beschäftigter Gehirn-Biber

13

Schreiben Sie ein Brainfuck-Programm mit maximal 256 Zeichen, das so viele Schritte wie möglich ausführt, aber keine Endlosschleife ausführt. Das Programm darf keine Eingaben machen.

Genauer:

  • Nehmen Sie eine unendliche Anzahl von Zellen rechts an.
  • Eine <Zelle ganz links tut nichts.
  • A, -wenn der Zellenwert Null ist, setzt die Zelle auf 255.
  • +-<>.Alle Anweisungen zählen bei der Ausführung als ein Schritt.
  • Wenn ein [oder ]angetroffen wird, zählt es als ein Schritt. Wenn jedoch die Bedingung wahr ist und Steuerfluß springt, die entsprechende ]oder [sich nicht wieder als Schritt zählen.
  • Die Lösung mit den meisten Schritten gewinnt.
  • Wenn Ihre Lösung eine Art Muster enthält, ist die Angabe einer Funktion für die Anzahl der Schritte, die ein ähnliches Längenprogramm ausführen nwürde, erwünscht, jedoch nicht zwingend.
  • Um Anweisungen zu zählen, können Sie diesen modifizierten Interpreter verwenden :

Beispiel:

++[-]

Die gefundenen Anweisungen lauten ++[-]-]und das Programm wurde in 7 Schritten ausgeführt.

Anton Golov
quelle
6
Es würde mich wundern, wenn der Gewinner kündigt, ohne die Anzahl der Dolmetscher zu überschreiten. Beachten Sie, dass der 6-State-TM-Busy-Beaver mindestens 10 ** 36534 Schritte ausführt.
Peter Taylor
Genau. Scheint sehr wahrscheinlich, dass Sie ein BF-Programm mit <50 Zeichen schreiben könnten, das jahrelang laufen könnte. Ich werde anfangen.
captncraig
Unterzeichnet. Die Forschungsseite von Busy Beaver unter drb.insel.de/~heiner/BB ist sehr interessant, insbesondere die Tatsache, dass die Aufnahmeprogramme extrem lange laufen und immer noch genaue Ergebnisse liefern (siehe drb.insel.de/~heiner/BB/bb -xlist.txt ) - Simulationen erinnern sich an Zustände, erstellen "Makros" zum Speichern von Simulationsschritten usw.
Schnaader
4
@AntonGolov: leider in diesem Universum, RAMs und HDs konvertiere nicht auf unendliche Speichergeräte , wenn Sie zum Speichern bignums versuchen größer als 256 ^ Größe in Bytes auf sie ...
aufgehört wiederum counterclockwis
1
@boothby Es ist durchaus möglich, exakte Berechnungen mit transzendentalen Auswirkungen auf aktuelle Computer durchzuführen. Die Komponenten der Werte müssen nur in einer abstrakteren Darstellung gespeichert werden als die normalen floatoder doubleprimitiven Elemente, die für die allgemeine alltägliche Datenverarbeitung verwendet werden. (Zu diesem Zeitpunkt manipuliert der Computer meist nur Zeichenfolgen, die die Gleichung darstellen.)
AJMansfield

Antworten:

15

Hier ist ein Programm mit 41 Zeichen, das schließlich anhält und mehr als 10 ↑ (10 ↑ 28) zusammenhängende Zellen auf 1 setzt (die Anzahl der ausgeführten Anweisungen ist also sehr viel größer als diese):

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

Wenn ich mich nicht irre, ist das eine korrekte Übersetzung des folgenden Programms in die BF-Variantensprache, die ein einzelnes Bit für jede Speicherzelle verwendet (dh Zelleninhalt 0..1 statt 0..255, also '+' Dient dazu, den Bitwert einfach umzudrehen.

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

Der genaue Wert (die Anzahl der benachbarten 1-Bits), die von dem letzteren Programm erzeugt werden, ist

3 * (2 ↑ 118842243771396506390315925503 - 1) + 1.


Das obige Programm initialisiert und berechnet eine Funktion, die wie folgt wächst: 2 ↑↑ x (in Knuth-Aufwärtspfeilnotation ). Eine ähnliche Konvertierung eines Varianten-BF-Programms, das eine Funktion initialisiert und berechnet, die wie 2 ↑ 23 x wächst, bietet das folgende 256-Zeichen-Programm:

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

Das hält schließlich an und lässt mehr als 2 ↑ 23 6 benachbarte Zellen gleich 1 (die Anzahl der Schritte ist also enorm höher).

NB-1 : 2 ↑ 23 6 ist eine "unvorstellbar große" Zahl; ZB übertrifft bereits 2 ↑ 4 6 = 2 ↑↑↑↑ 6 den ersten Term (3 ↑↑↑↑ 3) in der Sequenz, die zur Berechnung von Grahams Zahl verwendet wird .

NB-2 : Ich denke, es ist wahrscheinlich, dass 256 Zeichen für ein BF-Programm ausreichen, um eine Funktion zu initialisieren und zu berechnen, deren Ausgabe viel größer als Grahams Zahl ist. Wenn ich Zeit finde, werde ich vielleicht versuchen, eine zu schreiben.

NB-3 : Falls sich jemand für die Herkunft der oben genannten Programme interessiert, finden Sie hier einige Programmierressourcen für "Brainf * ck F" mit verschiedenen in Python geschriebenen Programmen. ("Brainf * ck F", oder einfach "F", nannte ich eine Turing-vollständige Variante der Smallf * ck- Sprache.) Ich habe gerade diese Dateien hochgeladen, die seit mehreren Jahren offline sind, und jetzt die Die verlinkte Webseite ist nur ein "Archiv" - in der Datei Busy_Beavers.txt finden Sie eine ausführliche Beschreibung der oben genannten Programme.

res
quelle
Dies ist im Moment ein klarer Gewinner (es sei denn, ich unterschätze nur die anderen). Weitere Vorschläge sind sehr willkommen, aber ich werde es vorerst als akzeptiert markieren. Wenn jemand anderer Meinung ist, bitte kommentieren.
Anton Golov
Wenn Sie dieses Level erreichen, wird es unrealistisch anzunehmen, dass Sie einen Interpreter mit unendlich viel Speicher haben. Ich fange an zu glauben, dass dies eine bessere Herausforderung bei endlichem Wrapping-Speicher wäre, damit wir die Antworten tatsächlich ausführen können.
Captncraig
9

Hier ist eine schöne 39 Zeichen:

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

Es macht im Grunde genommen einen 3 Felder breiten "Schlitten", der sich nach rechts bewegt und um eins dekrementiert. Abgeschlossen in 31.919.535.558 Anweisungen, wobei die innerste Schleife 256 ^ 3-mal ausgeführt wird. Ich habe immer noch viel Platz, um dies mit einer Geschwindigkeit von 14 Zeichen auf eine andere Größenordnung zur Laufzeit zu erweitern.

Funktioniert auf jedem Interpreter mit unbegrenztem Speicher oder mit Wrapping Memory.

Ich überlasse es dem Leser, zu bestimmen, wann die um 2 Schleifen verbesserte Version fertig sein wird:

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

Es ist jetzt über Nacht gelaufen und hat mehr als 3.000.000.000 Schritte. Immer noch nicht durch eine einzige Iteration der äußeren Schleife gekommen. Hat es kaum über 15% der zweiten Schleife geschafft.

captncraig
quelle
2

Dieses Programm arbeitet in unendlich vielen Zellen. Am Anfang werden zwei Werte mit ASCII-Werten 255 initialisiert. Der erste Wert bei der ersten Drehung der Hauptschleife wird auf 255 Zellen aufgeteilt und sie werden mit jeweils 255 initialisiert, bei der zweiten Drehung der Hauptschleife wird jeder Wert in 255 Zellen erneut aufgeteilt Bis zu 255 * 255 Zellen. In der gleichen Weise werden für die Drehung der Hauptschleife 255 Zellen mit insgesamt 255 ^ 255 initialisiert. Der zweite Wert bestimmt, wie oft die Hauptschleife wiederholt werden soll.

>->>-[<<[<]>[[[>]>>>[>]-[<]<<<[<]>-]>]>[>>[>]>+<<[<]<-]>>[>]>-]
Albert
quelle
2

Dieses Programm ist fast identisch mit meinem vorherigen Programm. Der Unterschied besteht darin, dass der Wert, der die äußere Schleife bestimmt, in einer bestimmten Zelle festgelegt bleibt, sodass sowohl die Anzahl der initialisierten Zellen als auch die Gesamtanzahl der Schritte am Ende des Programms erhöht werden können

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

Zellen initialisiert am Ende des Programms 255 ^ 255

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

Zellen, die am Ende des Programms initialisiert wurden 255 ^ 255 ^ 3

Ich habe es weiter modifiziert, um noch mehr Schritte ausführen zu können.

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

Es initialisiert 255 ^ 255 Zellen während der ersten Drehung der Hauptschleife 255 ^ (255 ^ 255 * 255) Zellen während der zweiten Drehung der Hauptschleife 255 ^ {255 ^ (255 ^ 255 * 255) * 255} Zellen während der dritten Drehung der Hauptschleife in Auf diese Weise wird die Schleife 255 Mal wiederholt

Albert
quelle
Sieht großartig aus! Es tut mir leid, dass ich eine Antwort noch nicht akzeptiert habe. Ich muss mir einige Zeit nehmen, um diese zu betrachten und die Reihenfolge des Wachstums herauszufinden. Wenn Sie "255 ^ 255 * 255" sagen, meinen Sie "255 ^ (255 * 255)"? (Ich würde sonst "255 ^ 256" erwarten.)
Anton Golov