Hexagony , 920 722 271 Bytes
Sechs verschiedene Arten von Fruchtschleifen, sagst du? Dafür wurde Hexagony gemacht .
){r''o{{y\p''b{{g''<.{</"&~"&~"&<_.>/{.\.....~..&.>}<.._...=.>\<=..}.|>'%<}|\.._\..>....\.}.><.|\{{*<.>,<.>/.\}/.>...\'/../==.|....|./".<_>){{<\....._>\'=.|.....>{>)<._\....<..\..=.._/}\~><.|.....>e''\.<.}\{{\|./<../e;*\.@=_.~><.>{}<><;.(~.__..>\._..>'"n{{<>{<...="<.>../
Okay, das war es nicht. Oh Gott, was habe ich mir angetan ...
Dieser Code ist jetzt ein Sechseck mit der Seitenlänge 10 (es begann bei 19). Es könnte wahrscheinlich noch ein bisschen mehr Golf gespielt werden, vielleicht sogar bis zur Größe 9, aber ich denke, dass meine Arbeit hier erledigt ist einen Befehl von einem Kreuzungspfad aus ausführen).
Trotz der offensichtlichen Linearität ist der Code tatsächlich zweidimensional: Hexagony ordnet ihn in ein reguläres Sechseck um (dies ist auch gültiger Code, in Hexagony sind jedoch alle Leerzeichen optional). Hier ist der entfaltete Code in all seinen ... nun, ich möchte nicht "Schönheit" sagen:
) { r ' ' o { { y \
p ' ' b { { g ' ' < .
{ < / " & ~ " & ~ " & <
_ . > / { . \ . . . . . ~
. . & . > } < . . _ . . . =
. > \ < = . . } . | > ' % < }
| \ . . _ \ . . > . . . . \ . }
. > < . | \ { { * < . > , < . > /
. \ } / . > . . . \ ' / . . / = = .
| . . . . | . / " . < _ > ) { { < \ .
. . . . _ > \ ' = . | . . . . . > {
> ) < . _ \ . . . . < . . \ . . =
. . _ / } \ ~ > < . | . . . . .
> e ' ' \ . < . } \ { { \ | .
/ < . . / e ; * \ . @ = _ .
~ > < . > { } < > < ; . (
~ . _ _ . . > \ . _ . .
> ' " n { { < > { < .
. . = " < . > . . /
Erläuterung
Ich werde nicht einmal versuchen, alle verworrenen Ausführungspfade in dieser Golf-Version zu erklären, aber der Algorithmus und der gesamte Kontrollfluss sind identisch mit dieser nicht Golf-Version.
) { r ' ' o { { \ / ' ' p { . . .
. . . . . . . . y . b . . . . . . .
. . . . . . . . ' . . { . . . . . . .
. . . . . . . . \ ' g { / . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . > . . . . < . . . . . . . . .
. . . . . . . . . . . . . . > . . ) < . . . . .
. . . . . . . . . . / = { { < . . . . ( . . . . .
. . . . . . . . . . . ; . . . > . . . . . . . . . <
. . . . . . . . . . . . > < . / e ; * \ . . . . . . .
. . . . . . . . . . . . @ . } . > { } < . . | . . . . .
. . . . . / } \ . . . . . . . > < . . . > { < . . . . . .
. . . . . . > < . . . . . . . . . . . . . . . | . . . . . .
. . . . . . . . _ . . > . . \ \ " ' / . . . . . . . . . . . .
. . . . . . \ { { \ . . . > < . . > . . . . \ . . . . . . . . .
. < . . . . . . . * . . . { . > { } n = { { < . . . / { . \ . . |
. > { { ) < . . ' . . . { . \ ' < . . . . . _ . . . > } < . . .
| . . . . > , < . . . e . . . . . . . . . . . . . = . . } . .
. . . . . . . > ' % < . . . . . . . . . . . . . & . . . | .
. . . . _ . . } . . > } } = ~ & " ~ & " ~ & " < . . . . .
. . . \ . . < . . . . . . . . . . . . . . . . } . . . .
. \ . . . . . . . . . . . . . . . . . . . . . . . < .
. . . . | . . . . . . . . . . . . . . . . . . = . .
. . . . . . \ . . . . . . . . . . . . . . . . / .
. . . . . . > . . . . . . . . . . . . . . . . <
. . . . . . . . . . . . . . . . . . . . . . .
_ . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
Ehrlich gesagt, im ersten Absatz habe ich nur einen halben Scherz gemacht. Die Tatsache, dass es sich um einen Zyklus von sechs Elementen handelt, war tatsächlich eine große Hilfe. Das Speichermodell von Hexagony ist ein unendliches hexagonales Gitter, bei dem jede Kante des Gitters eine vorzeichenbehaftete Ganzzahl mit willkürlicher Genauigkeit enthält, die auf Null initialisiert ist.
Hier ist ein Diagramm des Layouts des Speichers, den ich in diesem Programm verwendet habe:
Das lange gerade Bit auf der linken Seite wird als 0-terminierte Zeichenfolge a
beliebiger Größe verwendet, die dem Buchstaben r zugeordnet ist . Die gestrichelten Linien der anderen Buchstaben repräsentieren die gleiche Art von Struktur, jede um 60 Grad gedreht. Zu Beginn zeigt der Speicherzeiger auf die mit 1 bezeichnete Kante in Richtung Norden.
Das erste, lineare Bit des Codes setzt den inneren "Stern" der Kanten auf die Buchstaben roygbp
sowie die Anfangskante auf 1
, sodass wir wissen, wo der Zyklus endet / beginnt (zwischen p
und r
):
){r''o{{y''g{{b''p{
Danach sind wir wieder am Rande mit der Bezeichnung 1 .
Nun lautet die allgemeine Idee des Algorithmus wie folgt:
- Lesen Sie für jeden Buchstaben im Zyklus weiterhin die Buchstaben aus STDIN und hängen Sie sie an die diesem Buchstaben zugeordnete Zeichenfolge an, falls sie sich vom aktuellen Buchstaben unterscheiden.
- Wenn wir den Brief lesen, den wir gerade suchen, speichern wir einen
e
in der Ecke mit der Aufschrift ? , denn solange der Zyklus nicht abgeschlossen ist, müssen wir davon ausgehen, dass wir auch diesen Charakter essen müssen. Danach bewegen wir uns im Ring zum nächsten Zeichen im Zyklus.
- Es gibt zwei Möglichkeiten, wie dieser Vorgang unterbrochen werden kann:
- Entweder haben wir den Zyklus abgeschlossen. In diesem Fall machen wir eine weitere kurze Runde durch den Zyklus und ersetzen alle diese
e
s im ? Kanten mit n
s, weil wir jetzt wollen, dass dieser Zyklus an der Kette bleibt. Dann fahren wir mit dem Drucken von Code fort.
- Oder wir drücken EOF (was wir als negativen Zeichencode erkennen). In diesem Fall schreiben wir einen negativen Wert in das ? Kante des aktuellen Zeichens (damit wir es leicht von beiden
e
und unterscheiden können n
). Dann suchen wir nach der 1 Kante (um den Rest eines möglicherweise unvollständigen Zyklus zu überspringen), bevor wir ebenfalls zum Drucken von Code übergehen.
- Der Druckcode durchläuft den Zyklus erneut: Für jedes Zeichen im Zyklus wird die gespeicherte Zeichenfolge gelöscht, während
e
für jedes Zeichen eine gedruckt wird . Dann bewegt es sich zum ? Kante, die dem Zeichen zugeordnet ist. Wenn es negativ ist, beenden wir einfach das Programm. Wenn es positiv ist, drucken wir es einfach aus und fahren mit dem nächsten Zeichen fort. Sobald wir den Zyklus abgeschlossen haben, kehren wir zu Schritt 2 zurück.
Interessant ist auch, wie ich Strings mit beliebiger Größe implementiert habe (da ich zum ersten Mal unbegrenzten Speicher in Hexagony verwendet habe).
Stellen Sie sich vor, wir lesen irgendwann noch Zeichen für r (also können wir das Diagramm so verwenden, wie es ist) und eine [0] und eine 1 wurden bereits mit Zeichen gefüllt (alles nordwestlich von ihnen ist immer noch Null) ). Vielleicht haben wir gerade die ersten beiden Zeichen og
der Eingabe in diese Kanten eingelesen und lesen jetzt a y
.
Das neue Zeichen wird in die Lese in Kante. Wir benutzen die ? edge, um zu überprüfen, ob dieses Zeichen gleich ist r
. (Hier gibt es einen raffinierten Trick: Hexagony kann nur leicht zwischen positiv und nicht positiv unterscheiden. Daher ist die Überprüfung der Gleichheit durch Subtraktion ärgerlich und erfordert mindestens zwei Zweige. Aber alle Buchstaben sind weniger als einen Faktor von 2 voneinander entfernt.) Wir können die Werte vergleichen, indem wir das Modulo nehmen, das nur dann Null ergibt, wenn sie gleich sind.)
Aufgrund y
von verschieden ist r
, bewegen wir den (unmarkiert) Rand links in und kopieren die y
dort. Wir bewegen uns nun weiter um das Sechseck herum und kopieren das Zeichen jedes Mal um eine Kante weiter, bis wir y
die Kante gegenüber von in haben . Aber jetzt gibt es bereits ein Zeichen in einer [0], das wir nicht überschreiben möchten. Stattdessen "ziehen" wir das y
um das nächste Sechseck und überprüfen eine 1 . Aber es gibt auch eine Figur, also gehen wir ein weiteres Sechseck weiter hinaus. Nun ist a [2] immer noch Null, also kopieren wir dasy
hinein. Der Speicherzeiger bewegt sich nun entlang der Zeichenkette zurück zum inneren Ring. Wir wissen, wann wir den Anfang der Zeichenkette erreicht haben, weil die (unbeschrifteten) Kanten zwischen dem a [i] alle Null sind, wohingegen ? ist positiv.
Dies wird wahrscheinlich eine nützliche Technik zum Schreiben von nicht-trivialem Code in Hexagony im Allgemeinen sein.