Sie sollten ein 100 Byte langes Brainfuck-Programm (BF) schreiben.
Ein Zeichen entfernt auf jede erdenkliche Weise die 100 neuen (99 Byte langen) Programme. ZB für das Programm++.>.
der 5 Unterprogramme sind +.>.
, +.>.
, ++>.
, ++..
und ++.>
.
Ihre Punktzahl ist die Anzahl der eindeutigen Ausgaben, die die 100 Programme generieren. Eine höhere Punktzahl ist besser.
Einzelheiten
- Ihre Programme werden nach der Ausgabe des ersten Zeichens beendet.
- Ungültige oder nicht beendete Programme und Programme, die leere Ausgaben erzeugen, werden nicht in die Punktzahl eingerechnet.
- Die BF-Zellen sind 8-Bit-Wrapping-Zellen. (255 + 1 = 0, 0-1 = 255)
- Ihr Programm erhält keine Eingabe. Wenn Sie
,
im Code verwenden, wird die aktuelle Zelle auf gesetzt0
. - Auf der linken Seite der Startposition befinden sich keine Zellen. ZB
<.
ist ungültig, aber.<
gültig, da die Ausführung um beendet wird.
. Das Band ist in die andere Richtung ungebunden. - Programme mit unsymmetrischen Klammern (
[
und]
) sind ungültig. - Ihr ursprüngliches Programm kann kürzer als 100 Bytes sein, da es leicht auf 100 Bytes erweitert werden kann, ohne die Punktzahl zu ändern.
- Ihr ursprüngliches Programm muss kein gültiger BF-Code sein.
Sie können dieses python3-Programm (ideone link) verwenden , um die Bewertung Ihrer Antwort zu ermitteln. (Bei Programmen mit langer Laufzeit müssen Sie möglicherweise die maxstep
Variable ändern .)
Beispiel
(Der Einfachheit halber ist dieses Programm kürzer als 100 Bytes.)
Solution: ++,+[-]+><.-,-.
Score: 3
Explanation:
Subprogram => Output
+,+[-]+><.-,-. => 1
+,+[-]+><.-,-. => 1
+++[-]+><.-,-. => 1
++,[-]+><.-,-. => 1
++,+-]+><.-,-. => None
++,+[]+><.-,-. => None
++,+[-+><.-,-. => None
++,+[-]><.-,-. => 0
++,+[-]+<.-,-. => None
++,+[-]+>.-,-. => 0
++,+[-]+><-,-. => 255
++,+[-]+><.,-. => 1
++,+[-]+><.--. => 1
++,+[-]+><.-,. => 1
++,+[-]+><.-,- => 1
Unique outputs are [0, 1, 255]
Score is 3 for ++,+[-]+><.-,-. (length = 15)
Bei Gleichstand gewinnt derjenige mit dem kürzeren Code. (Ihr Programm kann kürzer als 100 Byte sein, wie im Abschnitt Details angegeben.) Wenn die Codes gleich lang sind, ist der Gewinner das frühere Poster.
Bonus-Rätsel: Können Sie ohne die fett gedruckte Einschränkung ein Programm mit 100 Punkten finden?
quelle
Antworten:
Prüfungsergebnis:
354169787983(Entfernen Sie den Zeilenvorschub.)
Probieren Sie es online!
Ich weiß nicht genau, warum es funktioniert ...
Prüfungsergebnis: 79
Probieren Sie es online!
Es sollte 2 * mem [i] * i summieren und die Anzahl der Zellen (+ const) addieren, in denen die Adressen von rechts nach links gezählt werden. Der Multiplikator 2 und die Anzahl der Zellen können bewirken, dass + und> mit unterschiedlicher Parität entfernt werden.
In der 69-Punkte-Version hat es in der Tat so geklappt. Aber die neueste Version hat das gebrochen und durch Zufall etwas anderes bekommen. Es berechnet die Summe (mem [i] * i + i + 1) und das Entfernen von + und> bewirkt fast dasselbe, mit Ausnahme der Summe (i), die eine Differenz der Anzahl der Zellen aufweist, die auch die Anzahl der verschiedenen Ausgaben ist Zum Entfernen von + und>.
Für den Bonus:
quelle
maxstep
Wert (indef evaluate(r,maxstep=20000):
) erhöhen, da einige Unterprogramme über einen längeren Zeitraum ausgeführt werden.79
durch Ersetzen->+>+> ...
durch->,>+> ...
Prüfungsergebnis:
3743EDIT: Jetzt erlaubt mein Programm einige eckige Klammern. Ich werde damit keine Preise gewinnen, aber das bekomme ich dafür, dass einige gewichtete RNGs die anstrengende Arbeit für mich erledigen.
Dies wurde durch ein Programm erzeugt, das ich in C geschrieben habe.
Für jedes
N
entfernte Zeichen sind hier die Ausgaben:Es gibt insgesamt 37 eindeutige Ausgaben, die (in numerischer Reihenfolge) sind:
Ich bin zu
90% zu100% sicher, dass diese Lösung nicht optimal ist, aber zu beweisen, dass dies äußerst schwierig sein kann. Es gibt ein paar Dinge, die klar sind..
Bis zum letzten Zeichen keine Symbole zu haben, scheint der richtige Weg zu sein, und eckige Klammern (. Ich habe hier ein wenig nachgedacht, was ich kurz umreißen möchte:[]
) scheinen eher nutzlos zu seinSei
L
die Länge des Codes in Bytes (in der Challenge100
) undn
die Anzahl der eindeutigen Ausgaben der Unterprogramme.Für
L=3
gibt es mehrere optimale Lösungen der Form+-.
, in dern=2
(in diesem Fall sind die Ausgänge 1 und 255 für+.
und-.
jeweils.) Dies stellt das beste Verhältnis fürL = 3
ann/L = 66.67%
. Beachten Sie, dass dieses Verhältnis zumindest nicht zu übertreffen istL<10
.Denn
L=10
die Lösungen sind einfach genug, um sie zu brachialisieren. Hier finden Sie die besten Lösungenn = 6
:Welches ergibt ein Score-Verhältnis von
n/L = 60%
.Da
L->infinity
ist klar, dass sich das Verhältnis 0 annähern muss, da es nur 255 mögliche Ausgänge für eine potenziell unendliche Zahl gibtL
.Das Verhältnis nimmt jedoch NICHT gleichmäßig ab. Es ist nicht möglich , eine Lösung zu konstruieren
n=6, L=9
, so das bestmögliche Verhältnis fürL=9
ist5/9 = 55.56% < 60%
.Dies wirft die Frage auf, wie schnell und in welcher Hinsicht das Verhältnis abnimmt. Denn
L = 100
und um10^9 checks/second
, es würde mehrere Größenordnungen länger dauern als die Lebensdauer des Universums, um eine optimale Lösung zu erzwingen. Gibt es einen eleganten Weg, dies zu tun?Ich bezweifle sehr , dass es nach unten, ist37%
fürL = 100
.Das Verhältnis steigt tatsächlich bis zu
L=100
. Zeigen Sie zur Bestätigung andere Antworten an.Ich würde gerne Ihre Bewertungen der oben genannten hören. Ich
konntemich schrecklich geirrt haben.quelle