/o!
\i@/e)q&w[?'`-+k3-n
Çevrimiçi deneyin!
Giriş küçük harf olmalıdır. 1
Dolar kelimelerini ve 0
diğerlerini yazdırır .
açıklama
Alice'in kasetini ve bazı gelişmiş kontrol akışını gösterme zamanı. Tamsayılarla ve karakter dizileriyle bireysel olarak çalışmakta oldukça iyi olmasına rağmen, Alice'in a) bir dizgenin uzunluğunu belirleme, b) karakterleri ve kod noktaları arasında dönüşüm yapmalarını sağlamıştır. Bunun nedeni, Alice'in tüm komutlarının ya tamsayıları tamsayılara ya da dizeleri dizelere eşlemektir. Ancak bunların ikisi de tamsayıya eşlemek veya tam tersi için eşleme dizgileri gerektirir, bu yüzden Alice'in hiçbirine uymazlar.
Bununla birlikte, yığına ek olarak, Alice'in bir kaseti de vardır ve Kardinal ve Sıra modu, kasetteki verileri farklı şekillerde yorumlar.
- Kardinal modunda, Brainfuck gibi diğer dillerden aşina olduğunuz normal bir kasettir. Her hücrede bir tam sayı saklayabilir ve bir bant kafasını hareket ettirebilirsiniz. Bant sonsuz uzundur ve başlangıçta her hücrede -1 tutar . Hücreler de indekslenir ve teyp kafası 0 dizininde başlar .
- Ordinal modun kendi bant başı vardır (ayrıca dizin 0'dan başlar ) ve bandı bir dizi listesi olarak yorumlar. Dizeler karakter olmayan hücreler (yani geçerli bir Unicode kod noktası olmayan değerler), özellikle de -1 ile sonlandırılır . Yani Ordinal mod için, bant başlangıçta boş dizelerle doldurulur.
Bu bant, yukarıdaki işlemlerin her ikisi için de kullanılabilir: bir dize uzunluğu elde etmek için, Ordinal modda banda yazacağız , Kardinal modda -1 sonlandırmasını arayacağız ve bant kafasının pozisyonunu alacağız . Karakterleri kod noktalarına dönüştürmek için, basitçe bunları Kardinal modda banttan okuduk.
Bu çözümde kullanılan diğer iki önemli özellik, iade yığını ve bir yineleyicidir. Alice'in genellikle jump komutunu kullanırken doldurulan j
ve geri atlamak için bir adres açabileceğiniz bir dönüş yığını vardır k
. Bununla birlikte, geçerli adresi hiçbir yere atlamadan geri dönüş yığınına itmek de mümkündür w
. Biz birleştirirseniz w
ile tekrar komutu &
, biz dönüş yığınına güncel adres zorlayabilir n zamanlarda. Şimdi her ulaştığımızda k
, bir yığın geri dönüş yığından atılıyor ve başka bir yineleme yapıyoruzw
(bundan sonra hücreden başlayarak, çünkü IP başka bir komut çalıştırmadan önce hareket eder). İade yığını boşaldığında,k
hiçbir şey yapmaz ve IP basitçe geçer. Bu nedenle n&w...k
bir tamsayı ve daha sonra çalıştırır...
n + 1bize basit bir for
döngüyü ifade etmenin çok özlü bir yolunu verir .
Kodun kendisinde ...
/ 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.