Alice , 23 bajty
/o!
\i@/e)q&w[?'`-+k3-n
Wypróbuj online!
Dane wejściowe powinny być pisane małymi literami. Drukuje 1
dla słów dolara i 0
nie tylko.
Wyjaśnienie
Czas pochwalić się taśmą Alice i zaawansowanym sterowaniem. Pomimo tego, że jest dość dobra w pracy z liczbami całkowitymi i łańcuchami indywidualnie, Alice nie ma wbudowanych a) określających długość łańcucha, b) konwersji między znakami i ich punktami kodowymi. Powodem tego jest to, że wszystkie polecenia Alice albo mapują liczby całkowite na liczby całkowite, albo ciągi znaków na ciągi znaków. Ale oba z nich wymagają mapowania ciągów na liczby całkowite lub odwrotnie, więc nie pasują do żadnego z trybów Alice.
Jednak oprócz stosu Alice ma również taśmę, a tryb kardynalny i porządkowy interpretują dane na taśmie na różne sposoby
- W trybie kardynalnym jest to zwykła taśma znana z innych języków, takich jak Brainfuck. Możesz przechowywać jedną liczbę całkowitą w każdej komórce i przesuwać głowicę taśmy. Taśma jest nieskończenie długa i początkowo mieści -1 w każdej komórce. Komórki są również indeksowane, a głowa taśmy zaczyna się od indeksu 0 .
- Tryb porządkowy ma własną głowicę taśmy (również rozpoczynającą się od indeksu 0 ) i interpretuje taśmę jako listę ciągów znaków. Łańcuchy są zakończone komórkami niebędącymi znakami (tj. Dowolnymi wartościami, które nie są prawidłowymi punktami kodowymi Unicode), w szczególności -1 . Tak więc w trybie zwykłym taśma jest początkowo wypełniona pustymi łańcuchami.
Taśma może być używana do obu powyższych operacji: aby uzyskać długość łańcucha, zapisujemy ją na taśmie w trybie porządkowym, szukamy zakończenia -1 w trybie kardynalnym i wyszukujemy pozycję głowicy taśmy. Aby przekonwertować znaki na punkty kodowe, po prostu odczytujemy je z taśmy w trybie kardynalnym.
Pozostałe dwie ważne funkcje zastosowane w tym rozwiązaniu to stos zwrotny i iterator. Alicja ma stos zwrotny, który zwykle jest wypełniany podczas korzystania z polecenia skoku j
, i z którego można wstawić adres, aby skoczyć z powrotem k
. Możliwe jest jednak również przesunięcie bieżącego adresu na stos zwrotny bez skakania gdziekolwiek w
. Jeśli połączymy to w
z poleceniem powtarzania&
, możemy przesunąć bieżący adres do stosu zwrotnego n razy. Teraz za każdym razem, gdy docieramy k
, jedna kopia jest usuwana ze stosu zwrotnego i wykonujemy kolejną iterację w
(zaczynając od komórki po niej, ponieważ adres IP przesuwa się przed wykonaniem kolejnego polecenia). Kiedy stos zwrotny staje się pusty,k
nic nie robi, a własność intelektualna po prostu przechodzi. Dlatego &w...k
pojawia się liczba całkowita n, a następnie wykonuje ...
n + 1 razy, co daje nam bardzo zwięzły sposób na wyrażenie prostej for
pętli.
Do samego kodu ...
/ 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.