/o!
\i@/e)q&w[?'`-+k3-n
在线尝试!
输入应为小写。打印1
美元字等0
。
说明
是时候炫耀爱丽丝的录音带和一些高级控制流程了。尽管Alice擅长分别处理整数和字符串,但Alice并没有内置功能来a)确定字符串的长度,b)在字符及其代码点之间进行转换。原因是所有Alice的命令要么将整数映射为整数,要么将字符串映射为字符串。但是这两个都需要将字符串映射到整数,反之亦然,因此它们都不适合Alice的任何一种模式。
但是,除了堆栈之外,Alice还拥有一个磁带,并且Cardinal和Ordinal模式以不同的方式解释磁带上的数据
- 在Cardinal模式下,它是Brainfuck等其他语言所熟悉的常规磁带。您可以在每个单元格中存储一个整数,并且可以左右移动磁带头。磁带无限长,最初在每个单元格中都为-1。单元也被索引,并且磁带头从索引0开始。
- 顺序模式具有自己的磁带头(也从索引0开始),它将磁带解释为字符串列表。字符串以非字符单元(即不是有效Unicode代码点的任何值)终止,尤其是-1。因此对于“序数”模式,磁带最初填充有空字符串。
该磁带可用于以上两种操作:要获得字符串长度,我们以“序数”模式将其写入磁带,在“基数”模式下寻找终止-1并获取磁带头的位置。要将字符转换为它们的代码点,我们只需在基数模式下从磁带上读取它们即可。
此解决方案中使用的其他两个重要功能是返回堆栈和迭代器。爱丽丝有一个返回栈,该栈通常在使用jump命令时填满j
,您可以从中弹出一个地址跳回k
。但是,也可以将当前地址压入返回堆栈,而无需使用跳转到任何地方w
。如果我们w
与repeat命令结合使用&
,我们可以将当前地址压入返回栈n次。现在,每次到达时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.