Schreiben Sie in einer beliebigen Programmier- oder Skriptsprache x ein Programm, das einen gültigen Brainfuck-Quellcode aus stdin entnimmt und in stdout ausgibt, den Quellcode eines Programms, das in der Sprache x geschrieben ist und genau dasselbe ausgibt wie das Brainfuck-Programm.
Ihr Programm muss für jedes gültige Brainfuck-Programm funktionieren, einschließlich der leeren Datei.
Ihre Punktzahl entspricht der Byteanzahl Ihres Quellcodes plus der Byteanzahl Ihrer Ausgabe bei folgender Eingabe:
+++++ [-]
+++++ +++++ [
> +++++ ++
> ++ +++ ++++ +
> +++
<<< -
]
> ++ . H
> + . e
++ +++ ++. l
. l
+++ . o
> ++ . space
< +++++ +++ . w
----- --- . o
+++ . r
---- - - . l
----- --- . d
> + . exclamation mark
------lol; useless code :-)--------------------------[.............................................][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]<-<<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><
Beispielsweise ist für eine Eingabe von [-]
die Ausgabe von *p=0;
viel günstiger alswhile(*p) *p--;
Wenn Sie Nicht-ASCII-Zeichen verwenden, muss die Byteanzahl mit der UTF-8-Codierung berechnet werden.
Die niedrigste Punktzahl gewinnt. Kreative Lösungen, die versuchen, den Output zu minimieren, sollen jedoch durch Upvotes gefördert werden.
byte count of source + (byte count of output)^2
Würde dies die Leute dazu ermutigen, sich mehr auf die Vereinfachung der Ausgabe zu konzentrieren?Antworten:
Perl - 177 (Quelle) + 172 (Ausgabe) = 349
Zählen Sie den Shebang als 2 Byte, eines für jede Option. Zunächst wird jeder der acht Befehle in den Bereich übersetzt
p-w
, während gleichzeitig alle anderen Zeichen entfernt werden. Diese Zeichenfolge wird dann lauflängencodiert und mit einem minimalen Decoder / Interpreter ausgegeben. Ein paar Dinge sind weg optimiert: Der String macht><
offensichtlich nichts, und eine for-Schleife, die direkt nach der anderen folgt, kann vollständig entfernt werden, da sie niemals eingegeben wird.Ausgabe für das Testprogramm:
Ein Probelauf:
Perl - 232 (Quelle) + 21 (Ausgabe) = 253
Diese basiert auf der Beobachtung von FIQ , dass die Ausgabe statisch ist und daher auf eine einzige
print
Anweisung reduziert werden kann, wenn das ursprüngliche Programm keine Eingabeanweisung enthält . Wenn Ihnen dieser gefällt, geben Sie seiner Antwort eine +1.Was wir also tun können, ist
stdout
, eine Pipe an eine Variable zu senden,eval
den Code , den wir ausgegeben hätten, und das Ergebnis in a zu verpackenprint
.... das wird aber nicht immer funktionieren. Wann immer der zu übersetzende Code zu einer Endlosschleife geführt hätte (zB
+[.]
), kann diesprint
aus offensichtlichen Gründen nicht auf eine einzige Anweisung reduziert werden. Stattdessen starten wir deneval
in-a-child-Prozess mit einer kurzen Zeitüberschreitung. Wenn die Ausführung nicht innerhalb dieser Zeit abgeschlossen ist, geben wir das übersetzte Programm wie zuvor aus.Strukturiert und kommentiert:
Ausgabe für Beispielprogramm:
Ausgabe für
,[.]
:Ausgabe für
+[.]
(nach 9 Sekunden):quelle
wv.*?(?=w)
ist falsch. Ich denke, es wird nur den Code bis zum nächsten entfernen]
, aber Sie brauchen ihn, um den passenden zu finden]
. Sie müssen sich um die Verschachtelung kümmern ...wv[^v]*(?=w)
, was erheblich kürzer ist als die Alternative.Brainfuck, 5 + 540 = 545 Bytes
5 Byte Code, 540 Byte von der Ausgabe der angegebenen Testdatei (vorausgesetzt, ich habe die Anzahl richtig aus meiner Einfügung des Codes ermittelt).
Angenommen, EOF ist 0.
quelle
bfi
( github.com/susam/bfi ). Kompilieren und installieren Sie es einfach und führen Sie es folgendermaßen aus:bfi input.bf
Woinput.bf
ist die zu interpretierende Brainfuck-Datei?PHP, 553 + 27 = 580 Bytes
(553 Bytes mit allen Leerzeichen, dh Zeilenumbrüchen und Leerzeichen, entfernt)
Ich mag es nicht, PHP zu spielen, daher kann dieser Ansatz stark optimiert werden. Ich wollte meine Herangehensweise an die Lösung hauptsächlich in etwas zeigen, das nicht BF ist.
Die Fehlerberichterstattung muss ausgeschaltet sein, sonst hasst Sie PHP. Verwendung: Wirf dies als Seite auf und starte es mit script.php? C = CODE (wenn das resultierende Skript Eingaben erfordert, starte es als out.php? I = INPUT). Denken Sie daran, die Eingabe zu verlassen!
Dies bedeutet im Grunde Folgendes: Wenn das BF-Skript "," enthält, bettet es sich als resultierendes Skript mit einem angehängten $ b = 1 ein. oben. Wenn es NICHT "," enthält, wird es auf "echo '<BF output>'" optimiert. Praktischerweise benötigt das Testskript im OP KEINE Eingabe. Die zusätzlichen Schrägstriche () sind nur zum Entkommen von 'und \ da.
quelle
C ++, 695 + 510 = 1205 Bytes
Code:
Ausgabe:
Originalcode:
quelle
Python - 514 + 352 = 866
Code:
Ausgabe:
quelle
io
659 + 553 = 1212
Dinge wie
File standardInput readBufferOfLength(1)
wirklich töten die Byteanzahl, aber ich kann es nicht umgehen. Ich habe keine Optimierungen für wiederholte Symbole oder fehlende Eingaben im BF-Programm vorgenommen, werde aber weiterhin daran arbeiten und auch an einer, die die Metaprogrammierungsfunktionen von io nutzt.Testen
Ausbeuten
quelle
Brainfuck , 109 + 407 = 516
Probieren Sie es online!
Es werden nur Nicht-BF-Operationen entfernt und andere Optimierungen nicht berücksichtigt.
quelle
Lua - 328 + 2256 = 2584
(Oh, mir ist nur klar geworden, dass Sie auch die Länge des Ergebnisses addieren müssen, schlechte Punktzahl, wie es aussieht)
Entnommen aus dieser Antwort von mir.
quelle
Lua - 319 + 21 = 340
Dies ist höchstwahrscheinlich der kürzeste Code von allen, aber er akzeptiert keine Eingaben, ist also ein bisschen betrügerisch. Ich habe eine Idee für eine andere Version mit Input, siehe Ende dieses Kommentars.
Lua - 376 + 366 = 742
Diese Version soll beweisen, dass lua mehr kann als 2584: D
Beide Versionen fügen 30000 Datenbytes hinzu. Meine zweite Version basiert auf Eingabe / Ausgabe: alles nach einem '.' oder ',' wird entfernt. Meine zweite Version erlaubt keine Endlosschleifen ([.,], [] Usw.)
Meine Idee ist es:
Aus Ihrer Eingabe mit einem zusätzlichen ', +.'
quelle