Befunge ist eine zweidimensionale esoterische Programmiersprache. Die Grundidee ist, dass (Ein-Zeichen-) Befehle in einem zweidimensionalen Raster platziert werden. Der Kontrollfluss wandert über das Raster, führt Befehle aus, über die er geleitet wird, und ändert die Richtung, wenn er auf einen Pfeil ( >^<v
) trifft . Befehle sind stapelbasiert. siehe diese Liste . Siehe auch http://esolangs.org/wiki/Befunge .
Die Spezifikation für Befunge-98 ist verfügbar.
Problem
Schreiben Sie ein Programm, das ein Befunge-Programm in eine kompaktere Darstellung umwandelt. Das folgende Programm druckt beispielsweise 0
:
> 0 v
> @ .
^ <
In diesem Fall könnte es komprimiert werden, ohne das Verhalten des Programms zu ändern, indem Leerzeilen entfernt werden, um zu geben
>0v
>@.
^ <
Durch komplexere Transformationen können Befehlssequenzen gedreht oder gespiegelt und unnötige Steuerungsflussbefehle beseitigt werden, um das Programm zu komprimieren. Zum Beispiel mit diesem Programm:
>12345v
6
v....7<
.
.
.
@
Sie könnten das Ende des Programms in das Loch stecken:
>12345v
>...@ 6
^....7<
Für das erste Beispiel ist das kompakteste Programm möglich
>0.@
Sie können beliebige Transformationen verwenden, solange das Ausgabeprogramm das gleiche Ergebnis liefert.
Programme eingeben
Eingabeprogramme sind gültige Befunge-98-Programme.
Sie können davon ausgehen, dass das Eingabeprogramm deterministisch ist. Das heißt, es werden keine Befehle zum Lesen des externen Zustands verwendet: die Benutzereingabebefehle &
und ~
, der Randomizer ?
und die selbstmodifizierenden Codebefehle p
und g
.
Sie können davon ausgehen, dass das Eingabeprogramm beendet wird.
Wertung
Dies ist kein Codegolf, sondern ein Problem beim Schreiben eines Programms, das Codegolf ausführt.
Die Eingabe ist eine Reihe von Testfällen (Befunge-Programme, die die oben genannten Eingabebeschränkungen erfüllen). Die Gesamtpunktzahl ist die Summe der Punkte für die Testfälle.
Ergebnis für jeden Testfall
Die Punktzahl ist die Fläche der konvexen Hülle der nicht leeren Zellen im Ausgabeprogramm, wobei jede Zelle als Quadrat behandelt wird, dessen vier Ecken Gitterpunkte in der kartesischen Ebene sind. Zum Beispiel ein Programm von
> v
@ <
erhält eine Punktzahl von 9,5.
Wenn Ihr Programm bei einer bestimmten Eingabe nicht innerhalb eines angemessenen Zeitraums und Speicherplatzes beendet wird, entspricht die Bewertung der des Eingabeprogramms. (Dies liegt daran, dass Sie trivialerweise einen zeitlich begrenzten Wrapper hinzufügen könnten, der das Eingabeprogramm unverändert ausgibt, wenn Ihr Programm nicht rechtzeitig beendet wird.)
Wenn das Testfallprogramm nach der Verarbeitung mit Ihrem Programm ein anderes Ergebnis hat (oder nicht beendet wird), ist die Punktzahl die Punktzahl des Eingabeprogramms zuzüglich einer Strafe von 100 Punkten.
quelle
.
bedeutet Ausgabe-Ganzzahl, aber wenn Sie von links oben beginnen, ist im Stapel keine Ganzzahl für die Ausgabe vorhanden..
gibt eine Ganzzahl aus. Wenn jedoch nicht genügend Parameter auf dem Stapel vorhanden sind, wird vorgetragen, dass stattdessen eine ausreichende Anzahl von Nullen vorhanden ist. Das zweite Beispiel würde also ausgegeben000
.g
undp
sind nicht erlaubt (sorry, vergessen; bearbeitet).Antworten:
Ich habe eine lange Flugreise damit verbracht, diese zu verschlüsseln. Ich habe einen Pseudo-Befunge-Compiler geschrieben, der das Befunge-Programm ausführt, grundlegende Blöcke extrahiert und sie in einer kompakten Darstellung anordnet.
Link zum Programm .
Bei Ausführung mit diesem 99-Flaschen-Programm:
Es erzeugt die folgende Ausgabe:
Tatsächlich ist es nicht viel kompakter als der Quellcode, aber bei größeren / sparseren Programmen ist es wahrscheinlich besser.
Das Programm ist links mit einem Arbeitsplan und rechts mit dem Inhalt der Grundbausteine angelegt. Ein Basisblock ist normalerweise in einer geraden Anzahl von Reihen angeordnet, so dass der Ein- und Ausgang an den Routing-Bereich angrenzt. Am Ende jedes Basisblocks führen das Gadget
#^_v
und die Varianten, die von rechts nach links angeordnet sind, die bedingte Verzweigung aus und leiten den Fluss in Spalten. Zu Beginn eines jeden Basisblocks werden diese Spalten in die Zeilen des Zielbasisblocks geroutet.Wenn die Ausgabe kurz ist, wird sie außerdem explizit wie folgt generiert:
Ich habe nichts unternommen, um die Basisblöcke selbst zu optimieren, nur das Layout. Machen.
Also wo sind die Tests?
quelle
Sed, 5 Zeichen
Also, auch wenn dies kein Codegolf ist, hier ist eine Lösung, die ein ziemlich gutes Verhältnis von Codelänge zu Punktzahl hat, aber nicht unbedingt eine gute Punktzahl.
Leerzeilen werden einfach entfernt.
quelle
"
). Jede Leerzeile im Weg sollte als Leerzeichen behandelt werden. Wenn wir diesen String ausdrucken, enthält der von Ihnen generierte Code keine Leerzeichen in der Ausgabe!b a
. Nach dem Kürzen wird es gedrucktba
.