Аліса , 23 байти
/o!
\i@/e)q&w[?'`-+k3-n
Спробуйте в Інтернеті!
Вхід має бути малим. Принти 1
для доларових слів та 0
іншим способом.
Пояснення
Час показати стрічку Аліси та деякий просунутий потік управління. Незважаючи на те, що вона досить добре працює з цілими числами та рядками окремо, Аліса не має вбудованих модулів: а) визначати довжину рядка; b) конвертувати між символами та їх кодовими точками. Причиною цього є те, що всі команди Аліси або відображають цілі числа до цілих чисел, або рядки до рядків. Але обом потрібно буде відображення рядків на цілі числа чи навпаки, тому вони не вписуються в жоден з режимів Аліси.
Однак, крім своєї стеки, Аліса також має стрічку, а режим Кардинала та Ординала інтерпретує дані на стрічці різними способами
- У режимі Кардинал це звичайна стрічка, знайома з інших мов, таких як Brainfuck. Ви можете зберігати одне ціле число у кожній комірці, а можна переміщати стрічку навколо. Стрічка нескінченно довга і спочатку вміщує -1 у кожній комірці. Осередки також індексуються, і головка стрічки починається з індексу 0 .
- У звичайному режимі є своя стрічка (також починаючи з індексу 0 ), і вона трактує стрічку як список струн. Рядки завершуються не символьними клітинками (тобто будь-якими значеннями, які не є дійсною кодовою точкою Unicode), зокрема -1 . Так для звичайного режиму стрічка спочатку заповнюється порожніми струнами.
Ця стрічка може бути використана для обох вищезазначених операцій: щоб отримати довжину рядка, ми записуємо її на стрічку в ординарному режимі, шукаємо закінчення -1 у режимі Кардинала та повертаємо положення голови стрічки. Для перетворення символів у їхні кодові точки ми просто зчитуємо їх із стрічки у режимі Кардинала.
Інші дві важливі особливості, які використовуються в цьому рішенні, - це зворотний стек і ітератор. Аліса має зворотний стек, який, як правило, заповнюється при використанні команди стрибок j
, і з якого ви можете відображати адресу, з якої можна перейти назад k
. Однак також можна натиснути поточну адресу до стеку повернення, не перестрибуючи звідкись w
. Якщо ми з'єднаємо w
з повтору команди &
, ми можемо натиснути на поточний адреса в стек повернень п раз. Тепер кожного разу, коли ми доходимо k
, одна копія вискакує з повернення стека і ми виконуємо іншу ітерацію з w
(починаючи з комірки після неї, тому що IP рухається перед виконанням іншої команди). Коли стек повернення стає порожнім,k
взагалі нічого не робить і IP просто проходить через. Отже, &w...k
з'являється ціле n, а потім виконується ...
n + 1 разів, що дає нам дуже стислий спосіб виразити просту for
петлю.
Про сам код ...
/ 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.