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;
;
;
Antworten:
Röda ,
405393392391371366361236234232230223200 BytesProbieren Sie es online!
Ausgänge prüfen!
Erklärung (veraltet)
Bearbeitungen
%
überprüft wird, ob x oder y die Grenzen überschreiten. Dies ebnete den Weg für weitere 2 Bytes !`\`
anstelle von verwendet"\\"
c=""
die zweite Zeile verschoben und die darauf folgende neue Zeile entferntwhile
(danke an @fergusq für das Erkennen)a=X
aus den if-Aussagen+1
am Ende stehendeindexOf
und restrukturierte Code wurde entfernt, um 2 Bytes zu sparenuntil[c=";"]
anstelle von gespeichertwhile[c!=";"]
l.=[" "]*L
quelle
x=((x+X)%#l)
anstelle vonx+=X
. Kommt leider(-1)%#l
noch zurück-1
.y
zu:y=y%#f
.key
anstelle voncmp
und Verwenden{...}while[...]
anstelle vonwhile[...]do ... done
.Python 2,
262243237235234233231221219218217 BytesÜbernimmt die Eingabe als
['<line_1>', '<line_2>', ...]
Probieren Sie es online!
-19 Bytes dank @math_junkie
-6 Bytes dank @ThisGuy
-2 Bytes durch Extrahieren
max(map(L,i))
in eine Variable (weil sie theoretisch zweimal verwendet wird).-1 Byte durch Verringern der Anzahl der
i[y][x]
Auftritte.-1 Byte mit,
'\x00'
damit ich nicht den[1:]
Teilo[1:]
der Ausgabe mit-2 Byte
\0
anstelle von\x00
-10 Byte erledigen muss, dank @KritixiLithos, um zu erkennen, dass ich auf der rechten Seite so viel auffüllen kann, wie ich will, weil der extra wird ignoriert
(keine Byte-Änderung). Behobener Fehler, da die extrahierte Variable außerhalb der Schleife
-2 Byte lag, da ich jetzt nur
len
2-mal verwende. Das erneute Zuweisen benötigt 2 zusätzliche Bytes-2 Byte,
while';'not in o
anstattwhile o[-1]!=';'
und verwendeno=''
statto='\0'
. Dies spart nicht nur 2 Bytes, sondern beseitigt auch das führende Null-Byte, das technisch nicht wirklich gültig war.Erläuterung
quelle
try
seitfind
Rückkehr,-1
wenn nicht gefunden: TIOlen
einer Variablen z. B.L
3 Bytes und weitere 4 Bytes zuweisen , indem Sie die Mehrzeilenzuordnung0
in 1 Zeile ändernx=y=k=0
.Ruby,
274200187183Sie haben nur ein paar weitere Zeichen durch Ablegen des Impuls-Arrays entfernt
d
.Ich bin ziemlich stolz auf diesen. Das hat Spaß gemacht! Es nimmt ein Array von Zeichenfolgen auf und gibt die richtige Zeichenfolge zurück.
Unten kommentiert.
quelle
PHP 7,
291260 Bytesquelle
JavaScript,
242236235231220 BytesProbieren Sie es online!
quelle