Der geliebte Fisch, der durch den Code von > <> (eine esoterische Programmiersprache) schwimmt , wurde aus seiner natürlichen Umgebung entfernt. Diese Änderung hat es unfähig gemacht, sich in der gewohnten Weise zu bewegen: Was früher eine toroidale Bewegung war, wurde auf eine einfache Bewegung von links nach rechts beschränkt. Aber> <> Programme werden immer noch so geschrieben, als ob der Fisch in der Lage wäre, sie zu durchlaufen. Es ist Ihre Aufgabe, lieber Programmierer, ein Programm zu schreiben, um ein> <> Programm zu linearisieren. Und mach es in so wenigen Bytes wie möglich; Fische haben keine großen Erinnerungen.
Bewegung in> <>
In> <> ist die Bewegung toroidal und erfolgt jeweils zeichenweise. Dies bedeutet, dass der Fisch (der Zeiger) vom Ende einer Linie zurück zum Anfang "herumlaufen" kann. In> <> kann sich der Fisch auch von oben nach unten, von unten nach oben und von rechts nach links bewegen, im Gegensatz zu den meisten Zeigern. Also wäre dieses Bewegungsmuster gültig:
>>>^ >>>v
>>>^ v
und es würde in einer Endlosschleife enden (zurück zur obersten Zeile, sobald es unendlich über die unterste hinausgeht).
Der Fisch bewegt sich in einem Raster, dessen Länge maximal (Zeilenlänge) und dessen Höhe der Anzahl der Zeilen entspricht.
Wie findest du heraus, in welche Richtung sich der Fisch bewegt? Diese Befehle ändern den Bewegungsvektor (zB (-1,0)
bedeutet von rechts nach links):
Command | Direction Change
---------------------------
> | (1,0) (default)
< | (-1,0)
^ | (0,1)
v | (0,-1)
/ | (x,y) -> (y,x)
\ | (x,y) -> (-y,-x)
| | (x,y) -> (-x,y)
_ | (x,y) -> (x,-y)
# | (x,y) -> (-x,-y)
; | (0,0)
Wie bereits erwähnt, bewegt sich der Fisch von links nach rechts, dh mit dem Richtungsvektor (1,0)
. Der Fisch beginnt mit dem Parsen von Befehlen, beginnend mit dem ersten Befehl, den er sieht, und ändert seine Richtung, wenn ein Befehl mit einem der oben genannten Richtungswechsler übereinstimmt.
Der Fisch bleibt stehen, als er ein sieht ;
und beendet das Programm.
Eingang
Die Eingabe ist ein gültiges Programm (z. B. keine Endlosschleife), das über STDIN übergeben wird. Sie können auch eine Datei lesen, wenn Sie möchten. Die Zeilen der einzelnen Programme müssen nicht unbedingt gleich lang sein.
Die Eingabe erfolgt als Zeichenfolge, wobei Zeilenumbrüche jede Zeile im Programm trennen.
Programme werden nicht wiederholt, dh sie werden immer mit einem beendet ;
.
Ausgabe
Ausgabe wird das Programm linearisiert. Das heißt, Sie sollten alle Zeichen (einschließlich Richtungswechslern) zurückgeben, die der Fisch sehen würde, wenn das Programm "normal" ausgeführt würde. Dies sind alle Zeichen auf dem Weg zum ;
.
Wenn die Eingabe Zeilen ungleicher Länge enthält und der Fisch sich entlang einer Linie bewegt, die kürzer als die Länge der längsten Linie ist, sollten Sie dies so behandeln, als ob sich der Fisch über ein Leerzeichen bewegt (siehe Testfälle).
Wer mit> <> vertraut ist, weiß, dass Richtungswechsler nicht die einzige Möglichkeit sind, Bewegungen auszuführen. Der Einfachheit halber wird die Eingabe so behandelt, als ob sie die einzige Möglichkeit darstellt, Bewegungen zu beeinflussen.
Regeln
- Es gelten Standardlücken
- Sie können entweder ein vollständiges Programm oder eine Funktion schreiben
- Die Eingabe erfolgt über STDIN oder eine Datei als Zeichenfolge, die die durch newlines (
\n
) getrennten Programmzeilen enthält.- Sie können die Eingabe innerhalb des vorgegebenen Rahmens anders verstehen (zögern Sie nicht, mich zu fragen, ob Sie eine bestimmte Art von Eingabe beabsichtigen). Sie dürfen die Eingabe nicht mit Leerzeichen auffüllen, damit die Zeilenlängen übereinstimmen.
- Siehe dazu flexiblen Eingabe finden Metapost. Ein allgemeiner Konsens ist aus heutiger Sicht im Rahmen des Zumutbaren so flexibel wie möglich zu gestalten.
- Die Ausgabe ist eine einzelne Zeichenfolge über STDOUT oder wird von der Funktion zurückgegeben (je nachdem, was Sie tun möchten, siehe Regel 2).
Testfälle
v >v
>abcv//;
gfed<^ih
v>abcv<defghi^//>v;
v >v
>abcv//;
gfed<^
v>abcv<defg ^//>v;
abcdef;
abcdef;
abcd|;
abcd|dcba;
abcd#;
abcd#dcba;
abcd\;
_
abcd\_\dcba;
^;
>abcde/
^jihg<
^ >abcde/ <ghij^a;
;
;