Klein ist eine von mir entworfene 2D-Sprache, die auf 12 verschiedenen topologischen Oberflächen eingebettet werden kann. Ein Klein-Programm kann durch Ändern der Befehlszeilenargumente auf verschiedenen Oberflächen ausgeführt werden.
Die Topologie bestimmt, wohin der Befehlszeiger geht, wenn er den Rand des Programms verlässt. Beim Abheben von der Kante springt das ip zu einer Kante mit der entsprechenden Farbe und behält seine Position relativ zum Pfeil bei, dh der Zeiger behält seinen Abstand zur Pfeilspitze bei.
Beispielsweise 000
bewirkt die Topologie , die von den meisten 2D-Sprachen verwendet wird, dass der Anweisungszeiger auf die andere Seite umgebrochen wird, wenn er von einer Kante abweicht.
Aufgabe
Die Aufgabe ist ziemlich einfach: Schreiben Sie ein Klein-Programm, das beim Ausführen die Topologie ausgibt, in der es ausgeführt wird. Die einzelnen Zahlen können durch Leerzeichen getrennt sein. (zB 000
und 0 0 0
sind beide zulässige Ausgaben). Sie können das -A
Befehlszeilen-Flag entweder verwenden oder ignorieren, es kostet Sie keine Bytes, wenn Sie es verwenden.
Dies ist Code-Golf, also gewinnt die kürzeste Antwort.
Hier ist ein Online-Testtreiber, mit dem alle Topologien gleichzeitig getestet werden können. Um im Ganzzahlmodus zu laufen, entfernen Sie die -A
.
Antworten:
5248 BytesProbieren Sie es online!
Testfahrer
Erläuterung
In Klein beginnt die IP in der oberen linken Ecke und geht nach rechts. Der erste Schritt, den ich von meinem Programm wollte, bestand darin, die IP von der Programmspitze zu entfernen, um das erste und dritte Bit zu bestimmen. Die IP würde das Programm abhängig von der Topologie wie folgt erneut eingeben:
Ich habe beschlossen, dass mein Programm das dritte Bit der Topologie vor dem zweiten Bit aufzeichnet, sie aber
$
vor dem Ende austauscht (verwendet ). Zu diesem Zweck habe ich Code hinzugefügt, um das erste und dritte Bit jeder Topologie an den oben beschriebenen Eintrittspunkten des IP zu verschieben.Als nächstes habe ich mich auf die Topologien mit
1
oder2
als erstes Bit konzentriert. Ich entschied mich, sie neu zu kombinieren und sie auf der Seite loszuschicken, die nicht mit der Nordseite verbunden war, damit ich ihr zweites Bit bestimmen konnte.Praktischerweise gruppierte dies die Topologien nach ihrem zweiten Bit neu, so dass ich das auf den Stapel schieben konnte.
Danach musste ich nur noch das zweite und dritte Bit tauschen und das Programm beenden.
Nachdem die Topologien mit
1
oder2
als erstes funktionierten, konnte ich mich darauf konzentrieren, die Topologien mit0
der richtigen Ausgabe zu versehen. Der erste Schritt bestand darin, sie neu zu kombinieren, damit sie basierend auf ihrem zweiten Bit in zwei Gruppen aufgeteilt werden konnten.Ich habe mich zuerst auf diese Topologien konzentriert und
1
als zweites Bit. Diese stellten eine Herausforderung dar, da sich die IP auf einer Leitung befand, die bereits von den Topologien2
als erstes Bit verwendet wurde. Da es schwierig wäre, mehr als einen Befehl in diese Zeile einzufügen (ein einzelner Befehl kann mit dem!
Befehl übersprungen werden ) und mir der Platz insgesamt ausgeht, habe ich beschlossen, die IP von dieser Zeile umzuleiten und einen vorhandenen1
Befehl wiederzuverwenden das zweite Bit drücken.Nun war für die Topologien mit
1
ihrem zweiten Bit nur noch die Reihenfolge des zweiten und dritten Bits festzulegen und zu beenden.Zuletzt blieben die Topologien mit
0
als zweitem Bit. Es war nicht mehr viel Speicherplatz im Programm vorhanden, und der größte nicht genutzte Speicherplatz befand sich in der obersten Zeile. Daher habe ich dort die IP für die Topologien0
als zweites Bit umgeleitet .Ich musste immer noch auf
0
das zweite Bit drängen und die Reihenfolge des zweiten und dritten Bits festlegen sowie das Programm beenden. Glücklicherweise konnte ich eine vorhandene$
Anweisung wiederverwenden , sodass die Anweisungen0
und@
in die verbleibenden Bereiche passen.Schließlich können die Nops von den Zeilenenden entfernt werden, um das endgültige Programm zu erhalten.
quelle
1168886776961605958545350 BytesProbieren Sie es online!
quelle
-d
Flag ausführen , wird es genau das tun. Leider funktioniert es nicht in TIO.44 41 40 3837 BytesProbieren Sie es online!
Testfahrer.
Verwendet ein 6 mal 6 Quadrat. Das kürzeste, was ich mit einem 8 x 8-Quadrat erreichen kann, sind 38 Byte, wenn jemand versuchen möchte, es zu verbessern.
Erläuterung:
Einer der ersten Pass-Through-Codes codiert die ersten beiden Zahlen für die Präfixe
0
und1
. Denn2
es codiert die dritte Zahl und dann die erste.Dann leiten wir die IPs durch die dritte Kante, um die endgültige Nummer zu bestimmen. Wir kombinieren die IPs mit dem gleichen Präfix.
Für die
0
und1
Präfixe, sie kommen beide die obere Kante , um die dritte Zahl zu entscheiden.Für das
2
Präfix ragen die IPs an der Unterkante aus den Ecken heraus.Beide Kanten tauschen die erste und dritte Zahl aus, drücken die zweite Zahl und tauschen sie mit der dritten, um die richtige Reihenfolge zu erhalten.
quelle