Alice , 23 Bytes
/o!
\i@/e)q&w[?'`-+k3-n
Probieren Sie es online!
Die Eingabe sollte in Kleinbuchstaben erfolgen. Druckt 1
für Dollar-Wörter und 0
sonst.
Erläuterung
Es ist Zeit, Alices Band und einen fortgeschrittenen Kontrollfluss vorzuführen. Alice kann zwar ziemlich gut mit ganzen Zahlen und Strings individuell arbeiten, hat aber keine eingebauten Funktionen, um a) die Länge eines Strings zu bestimmen, b) zwischen Zeichen und ihren Codepunkten zu konvertieren. Der Grund dafür ist, dass alle Befehle von Alice entweder Ganzzahlen Ganzzahlen oder Zeichenfolgen Zeichenfolgen zuordnen. Für beide wäre es jedoch erforderlich, Zeichenfolgen Ganzzahlen zuzuordnen oder umgekehrt, sodass sie nicht in einen der beiden Modi von Alice passen.
Zusätzlich zum Stapel verfügt Alice jedoch auch über ein Band. Im Kardinal- und Ordinal-Modus werden die Daten auf dem Band auf unterschiedliche Weise interpretiert
- Im Kardinalmodus ist es ein normales Band, das aus anderen Sprachen wie Brainfuck bekannt ist. Sie können eine ganze Zahl in jeder Zelle speichern und einen Bandkopf bewegen. Das Band ist unendlich lang und enthält anfangs in jeder Zelle ein -1 . Die Zellen werden ebenfalls indiziert und der Bandkopf beginnt bei Index 0 .
- Der Ordnungsmodus hat einen eigenen Bandkopf (ebenfalls beginnend mit Index 0 ) und interpretiert das Band als eine Liste von Zeichenfolgen. Zeichenfolgen werden durch Zellen abgeschlossen, die keine Zeichen sind (dh Werte, die kein gültiger Unicode-Codepunkt sind), insbesondere -1 . Im Ordinal-Modus wird das Band also zunächst mit leeren Zeichenfolgen gefüllt.
Dieses Band kann für beide der oben genannten Operationen verwendet werden: Um eine Zeichenkettenlänge zu erhalten, schreiben wir es im Ordinal-Modus auf das Band, suchen im Cardinal-Modus nach dem Abschluss -1 und rufen die Position des Bandkopfs ab. Um Zeichen in ihre Codepunkte umzuwandeln, lesen wir sie einfach im Kardinalmodus vom Band.
Die beiden anderen wichtigen Funktionen, die in dieser Lösung verwendet werden, sind der Rückgabestapel und ein Iterator. Alice hat einen Rückgabestapel, der normalerweise mit dem Sprungbefehl gefüllt j
wird und von dem Sie eine Adresse abrufen können, mit der Sie zurückspringen können k
. Es ist jedoch auch möglich, die aktuelle Adresse auf den Rückgabestapel zu verschieben, ohne irgendwo mit zu springen w
. Wenn wir w
mit dem Befehl repeat kombinieren &
, können wir die aktuelle Adresse n- mal in den Rückgabestapel verschieben . Jetzt wird jedes Mal k
, wenn wir ankommen , eine Kopie vom Rückgabestapel entfernt und wir führen eine weitere Iteration von aus w
(beginnend mit der Zelle danach, da sich die IP bewegt, bevor ein anderer Befehl ausgeführt wird). Wenn der Rückgabestapel leer wird,k
tut gar nichts und die IP geht einfach durch. Daher wird &w...k
eine ganze Zahl n eingefügt und dann ...
n + 1- mal ausgeführt, was uns eine sehr kurze Möglichkeit gibt, eine einfache for
Schleife auszudrücken .
Weiter zum Code selbst ...
/ Reflect to SE. Switch to Ordinal.
i Read the input word as a string.
Bounce off bottom boundary, move NE.
! Store the input word on the tape.
Bounce off top boundary, move SE.
/ Reflect to E. Switch to Cardinal.
e Push -1.
) Seek right on the tape for a -1, which finds the -1 terminating
the input word.
q Push the tape head's position, which gives us the string length N.
&w Repeat this loop n+1 times (see above for an explanation)...
[ Move the tape head left by one cell.
? Retrieve the code point of the character in that cell.
'` Push 96.
- Subtract it from the code point to convert the letters to 1...26.
+ Add the result to a running total. This total is initialised to
zero, because in Cardinal mode, the stack is implicitly filled with
an infinite amount of zeros at the bottom.
k End of loop.
Note that the above loop ran once more than we have characters in the
string. This is actually really convenient, because it means that we've
added a "-1 character" to the running total. After subtracting 96 to
convert it to its "letter value" this gives 97. So dollar words will
actually result in 100 - 97 = 3, which we can check against for one
byte less than for equality with 100.
3- Subtract 3 to give 0 for dollar words.
n Logical NOT. Turns 0 (dollar words) into 1 and everything else into 0.
The IP wraps around to the beginning of the first line.
\ Reflect to NE. Switch to Ordinal.
o Implicitly convert the result to a string and print it.
Bounce off top boundary, move SE.
@ Terminate the program.