迷宫,18字节
+(+"#(!@
: :
%2_,
在线尝试!这个答案是与@MartinBüttner合作的结果。
说明
普通的迷宫引物(我说“通常”,但实际上每次都重写):
- 迷宫是一种基于堆栈的2D语言,其执行从第一个有效字符(此处为左上方)开始。在每个结点处,有两个或更多条指令指针可以通过的路径,将检查堆栈的顶部以确定下一步的位置。负向左转,零向前进,正向右转。
- 堆栈是无底的,并填充有零,因此从空堆栈弹出不会出错。
- 源代码中的数字不会压入相应的数字,而是弹出堆栈顶部并压入
n*10 + <digit>。这使得容易建立大量。要开始一个新的数字,请使用_,按0。
这段代码有点怪异,因为出于高尔夫目的,主循环将两个任务组合为一个。对于第一遍的前半部分,将发生以下情况:
+(+ Add two zeroes, decrement, add with zero
This leaves -1 on the stack
" NOP at a junction. -1 is negative so we try to turn left, fail, and
turn right instead.
: Duplicate -1
现在,栈顶已初始化为-1,可以开始实际的处理了。这是主循环的作用。
, Read a byte of input
_2% Take modulo 2.
:+ Duplicate and add, i.e. double
( Decrement
This maps "(" -> -1, ")" -> 1
+ Add to running total
" NOP at a junction. Go forward if zero, otherwise turn right.
: Duplicate the top of the stack
最后一个副本为我们执行的每个迭代将一个元素添加到堆栈中。这很重要,因为当我们达到零并在NOP前进时,我们会:
# Push stack depth
( Decrement
! Output as num
@ Terminate