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.
.
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 ausgegeben 000
.
g
und p
sind nicht erlaubt (sorry, vergessen; bearbeitet).