迷宫,28 25 24 23 22字节
" >
?!?:|}\{@
@\?"":)!
这太疯狂了!:)那是到目前为止我编写的最密集的迷宫程序。我有20个和21个字节的太多版本,几乎可以正常工作了,我仍然怀疑这是最佳的...
这会将输入作为正整数列表(带有任意定界符),并将结果以换行分隔的整数打印到STDOUT。
寻找20/21字节:我已经检查了所有形式的程序
" XX
?!?X}\{@
@\?XX)!
X
用蛮力在哪里有任何合理的品格,却没有找到有效的解决方案。当然,这并不意味着不存在一个更短的解决方案,但是在没有相当多的结构假设的情况下,不可能强制执行20字节的程序。
说明
(解释有些过时,但是我仍然不相信该解决方案是最佳的,因此我将等待更新。)
因此,通常迷宫程序看起来像迷宫。当指令指针在走廊中时,它将跟随该走廊。当IP遇到任何类型的连接时,将根据Labyrinth主堆栈的最高值来确定方向(Labyrinth有两个堆栈,底部有无限数量的零)。这通常意味着任何非平凡的循环都会非常昂贵,因为如果您到处都是非墙单元,那么所有东西都是结点,并且在大多数情况下,堆栈顶部的IP值不正确走你想走的路。因此,您要做的是放大循环,使它们在中心具有一个整体,每个循环只有一个定义明确的入口和出口点。
但这一次我真的很幸运,一切都很好地融合在一起,以至于我可以将它们压成一团。:)
控制流始于_
向南。所述_
推零到主堆叠。这看起来像是无操作,但是这增加了(非隐式)堆栈深度1
,我们以后需要使用该深度。
?
从STDIN读取一个整数。如果没有更多的整数要读取,则将其推为零。在这种情况下,IP继续向南移动并立即@
终止程序(因为输入列表为空)。否则,IP向东。
我们现在进入一个非常紧密的循环,有两个出口点:
!?;
\?
;
!
将整数打印回STDOUT,仅在堆栈上保留零。IP继续向东移动,并?
读取下一个整数。如果那不是零,我们就向右移动并向南移动。?
读取另一个(下一个偶数索引)。再说一次,如果那不是零,我们就向右移动并向西移动。
然后\
在不更改堆栈的情况下打印换行符,因此我们向右移,向北移动。!
打印下一个偶数索引整数。由于现在堆栈上至少有一个(正)奇数索引整数,因此我们一直向右转,循环重复进行。
一旦其中任何一个?
到达列表的末尾,它们便将零推入并直接移至相应的;
,从而丢弃该零。
在列表中只有一个元素的情况下,我们已经完成了(因为我们已经立即打印了该元素),所以IP会一直向东移动到@
,再次终止程序(打印尾随换行)。
否则,我们还需要打印奇数索引整数。在这种情况下,两条路径(从第一个循环的两个出口点开始)在中间合并"
,在两种情况下都向东。
_
推送零以避免将左移@
,并;
丢弃该零。现在我们进入一个新循环:
"}
""
IP在左下角的单元格中进入此地址,向北移动,以顺时针方向绕环行。将}
主堆栈的顶部移至辅助堆栈。尽管堆栈中仍然有一个元素,但IP仍在继续其工作。一旦一切都转移到辅助堆栈(并在过程中反转),IP继续向东移动,进入最后一个循环:
\{@
#!
\
再次打印换行符,{
将项目从辅助纸叠移回主纸叠。如果那仍然是列表中的一项,它将为正,并且IP转向南(在该处打印该项)!
。然后#
推入堆栈深度(现在这是初始位置_
很重要的位置,因为这#
确保了正的堆栈深度),这样IP 便会通过\
和{
再次右移。
在我们打印{
完所有内容之后,从辅助堆栈的底部拉零,IP继续向东,并@
终止程序。