Cubix, 94 83 82 79 63 56 Bytes
p>q'-?w.uh'e@U7.'hqi?oqB-!ul.-..$WWu_q<o'\;>....6t?.../!@
Erweitert:
p > q '
- ? w .
u h ' e
@ U 7 .
' h q i ? o q B - ! u l . - . .
$ W W u _ q < o ' \ ; > . . . .
6 t ? . . . / ! @ . . . . . . .
. . . . . . . . . . . . . . . .
. . . .
. . . .
. . . .
. . . .
Anmerkungen
- Der Interpreter deaktiviert das Eingabefeld beim Programmstart. Als solches ist ein unendlicher Strom von Eingaben unmöglich. Dieses Programm nimmt die Eingabe zeichenweise vor. Ohne diese Einschränkung würde es also ordnungsgemäß funktionieren.
- Dieses Programm räumt den Stapel nicht auf und es wird sehr schnell chaotisch. Da die Maschine, auf der dies verwendet wird, anscheinend unendliche Eingabeströme liefern kann, scheint es vernünftig anzunehmen, dass sie auch unendlichen Speicher hat.
- Jegliche Golfhilfe wird sehr geschätzt.
Probieren Sie es online aus
Sie können das Programm hier ausprobieren .
Erläuterung
Grund Idee
Die allgemeine Idee ist, dass wir ein Zeichen lesen und es dann mit unterschiedlichen Zeichen vergleichen möchten (zuerst h, dann e, lusw.). Um den Überblick über den vermissten Charakter zu behalten, halten wir ihn ganz unten im Stapel. Wenn wir es brauchen, können wir es leicht wieder nach oben bringen.
Lese- / Schreibschleife
Die Schreib-Lese-Schleife ist einfach die 5 th Linie. Alle nicht verwendeten Zeichen werden durch no-ops ( .) ersetzt:
. . . .
. . . .
. . . .
@ . . .
' h q i ? o q B - ! u l . - . .
. . . . _ . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . .
. . . .
. . . .
. . . .
Dies kann in zwei Teile unterteilt werden: Lesen und (Schreiben und Prüfen). Der erste Teil enthält die Anweisungen bis einschließlich des Fragezeichens. Der zweite Teil ist der Rest der Linie. Da dies eine Schleife darstellt, gehen wir davon aus, dass wir mit einem Stapel von beginnen[...]
@
'hqi?
_
Explanation
'h Push the character code of the h
Stack: [..., 104]
q Send it to the bottom
Stack: [104, ...]
i Read one character of the input (-1 for EOF)
Stack: [104, ..., input]
? Start of condition:
if (input < 0):
@ execute '@', ending the program
if (input = 0):
continue going right
if (input > 0):
_ turn to the right, reflect back ('_') and
turn right again, effectively not changing
the direction at all
Der zweite Teil (Schreiben und Prüfen) ist wieder linear. Der Stapel beginnt als [next-char, ..., input]. Wir haben das nächste Zeichen abstrahiert, weil sich das später im Programm ändert.
oqB-!ul.- Explanation
o Output the character at the top of the stack
q Send the input to the bottom of the stack
Stack: [input, next-char, ...]
B Reverse the stack
Stack: [..., next-char, input]
- Push the difference of the top two characters, which
is 0 if both are equal, something else otherwise
Stack: [..., next-char, input, diff]
! if (diff = 0):
u make a u-turn to the right
else:
l. execute two no-ops
- push [input - next-char - input], which is disregarded
later, so it effectively is a no-op as well.
Jetzt beginnt die IP wieder am Anfang dieser Schleife und setzt das nächste zu überprüfende Zeichen zurück h.
Matching das nächste Zeichen
Wenn die IP eine Kehrtwende gemacht hat (dh das gelesene und gedruckte Zeichen stimmt mit dem nächsten Zeichen überein 'hello'), müssen wir überprüfen, welches Zeichen die Eingabe war, und in Abhängigkeit davon das nächste Zeichen zum Ende des Stapels schieben. Danach müssen wir in die Lese- / Schreibschleife zurückkehren, ohne hzum Stapel zu wechseln, also brauchen wir einen anderen Weg, um dorthin zu gelangen.
Das Wichtigste zuerst: Bestimmen Sie, welches Zeichen die Eingabe war. Der Stapel sieht wie folgt aus : [..., prev-char, input, 0].
. . . .
- ? . .
u h ' e
. . . .
. . . . . . . . . ! u . . . . .
. . . . . . . . . \ ; . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . .
. . . .
. . . .
. . . .
Um die Eingabe zu vergleichen, verwenden wir wieder den Zeichencode von h. Das lag anfangs daran, dass ich nicht genau wusste, wie ich damit umgehen sollte, und hes war das erste Zeichen in der Zeichenfolge, nach dem gesucht werden musste, aber es erwies sich als recht praktisch. Wenn wir den Zeichencode von h von der Eingabe subtrahieren, erhalten wir, -3ob die Eingabe ist e, 0ob die Eingabe ist h, 4ob die Eingabe ist lund 7ob die Eingabe ist o.
Dies ist nützlich, da mit dem ?Befehl negative Werte leicht von positiven Werten und Null getrennt werden können. Wenn sich die IP nach links dreht, war die Differenz negativ, die Eingabe ealso, und das nächste Zeichen sollte ein sein l. Wenn die IP weiter geradeaus geht, war der Unterschied 0, also war die Eingabe h, also sollte das nächste Zeichen ein sein e. Wenn der Eingang ein loder ein ist o, wird die IP nach rechts gedreht.
Alle Anweisungen, die vor dem oben genannten Fragezeichen ausgeführt werden, sind:
;!e'h- Explanation
; Delete the top of the stack
Stack: [..., prev-char, input]
! if (input = 0):
e execute 'e' (no-op)
'h Push the character code of h
Stack: [..., prev-char, input, 104]
- Push the difference of the input and 104
Stack: [..., prev-char, input, 104, diff]
Jetzt ändert die IP ihre Richtung wie oben beschrieben. Gehen wir die verschiedenen Möglichkeiten durch.
Eingang 'e'
Zuerst betrachten wir die Eingabe e, die bewirkt, dass sich die IP von der nach oben bewegt ?, da der Unterschied 3 beträgt. Alle irrelevanten Zeichen wurden aus dem Cube entfernt.
. > q '
. ? . .
. . . .
. . . .
. . q . . . . . . . . l . . . .
$ W W . . . . . . . . > . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . .
. . . .
. . . .
. . . .
Die Zeichen werden in dieser Reihenfolge ausgeführt (mit Ausnahme einiger Kontrollflusszeichen):
q'l$WWq
q Save the difference (-3) to the bottom of the stack so
we can tell whether the l on the bottom of the stack is
the first or the second l in hello
Stack: [-3, ...]
'l Push the character code of l to the stack
Stack: [-3, ..., 108]
$W no-op
W Sidestep into the loop
q Send the character code to the bottom
Stack: [108, -3, ...]
Jetzt hat die IP die Lese- / Schreibschleife wieder erreicht.
Eingang 'h'
Wenn die Eingabe war 'h', ist die Differenz 0, sodass die IP ihre Richtung nicht ändert. Hier ist noch einmal der Würfel, bei dem alle irrelevanten Zeichen entfernt sind. Da dieser Pfad einige No-Ops enthält, wurden alle übergebenen No-Ops durch ersetzt &. Die IP beginnt am Fragezeichen.
. . . .
. ? w .
. . ' e
. . . .
. . . . . . . . . ! . . . . . .
. . . u _ q < . . \ . . . . . .
. . ? & & & / . . & . . . . . .
. . & . . . . . . & . . . . . .
. . . .
& & & &
. . . .
. . . .
Die ausgeführten Anweisungen sind:
'e!\?q_
'e Push the character code of the e
Stack: [..., 101]
! if (101 = 0):
\ reflect away (effectively a no-op)
? if (101 > 0):
turn right (always happens)
q Move 101 to the bottom of the stack
Stack: [101, ...]
_ No-op
Und jetzt treten wir wieder in die Lese- / Schreibschleife ein, also sind wir fertig.
Andere Eingänge
Alle anderen Eingaben führen zu einer positiven Differenz, sodass die IP am Fragezeichen nach rechts wechselt. Wir müssen immer noch das lund das trennen o, also werden wir das als nächstes tun.
Trennen der 'l'und'o'
Denken Sie daran, dass der Unterschied 7 für ound 4 für ist lund dass wir das Programm beenden müssen, wenn die Eingabe eine war o. Hier ist noch einmal der Würfel, wobei die irrelevanten Teile durch a .und die No-Ops durch Et-Zeichen ersetzt wurden.
. . q .
. ? w .
. h ' .
. U 7 .
. . . . . . . . . . . . . - . .
. . . . . . . . . . . . . & . .
. . . . . . / ! @ . . . . & . .
. . . . . . & . . . . . . & . .
. . & .
. . & .
. . & .
. . & .
h7'wq-!@
h no-op
7 Push 7 to the stack
Stack: [..., diff, 7]
'wq Push w to the stack and send it to
the bottom. We don't care about it,
so it's now part of the ellipsis.
Stack: [..., diff, 7]
-! if (diff = 7):
@ End the program
Unterscheidung zwischen den beiden 'l's
Jetzt wissen wir also, dass es sich um eine Eingabe handelte l, aber wir wissen nicht, welche l. Wenn es der erste ist, müssen wir einen anderen lauf den Boden des Stapels schieben , aber wenn es der zweite ist, müssen wir einen schieben o. Erinnerst du dich, dass wir -3am Ende des Stapels gespeichert haben , kurz bevor wir den ersten gepusht haben l? Damit können wir die beiden Zweige trennen.
. . . .
. . . .
. . . .
. . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
6 t ? . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . .
. . . .
. . . .
. . . .
Der Stapel beginnt als [..., -3 or 140, ...]
Explanation
6t?
6t Take the 6th item from the top and move
it to the top (which is either -3 or 140)
? If that's positive, turn right, otherwise,
turn left
Zuerst 'l'
Wenn dies der erste war 'l', müssen wir einen anderen drängen 'l'. Um Bytes zu sparen, verwenden wir dieselben Zeichen wie für das erste 'l'. Wir können den Stack zu vereinfachen [...]. Hier ist der relevante Teil des Cubes, bei dem No-Ops durch kaufmännisches Und ersetzt werden.
p > q '
. . . .
. . . .
. . . .
' . q . . . . . . . . l . . . .
$ W W . . . . . . . . > & & & &
. . ? . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . .
. . . .
. . . .
. . . .
Die folgenden Anweisungen werden ausgeführt:
$'pq'lq
$' no-op
pq no-op
'l Push the character code of l
Stack: [..., 108]
q Send it to the bottom
Stack: [108, ...]
Wir treten in die Lese- / Schreibschleife ein, also sind wir mit diesem Zweig fertig.
Zweite 'l'
Wenn die Eingabe der zweite war 'l'in 'hello'wandte sich die IP - Recht auf das Fragezeichen. Wieder einmal können wir den Stack vereinfachen [...]und die IP beginnt bei ?und zeigt diesmal nach Süden.
. . . .
. . . .
. . . .
. . . .
. . . . . . . . . . . . . . . .
. . . u _ q < o ' \ . . . . . .
. . ? . . . . . . & . . . . . .
. . & . . . . . . & . . . . . .
. . . .
& & & &
. . . .
. . . .
Die ausgeführten Anweisungen sind:
'oq_
'o Push the character code of 'o'
Stack: [..., 111]
q Move the top item to the bottom
Stack: [111, ...]
_ No-op
Und die IP tritt gleich wieder in die Lese- / Schreibschleife ein, sodass wir auch mit diesem Zweig fertig sind.