前奏,69 55 54字节
?1-(v #1)-
1 0v ^(# 0 (1+0)#)!
(#) ^#1-(0)#
如果使用符合标准的解释器,则它将输入和输出作为字节值。要在STDIN / STDOUT上实际使用十进制数,您需要带和附加选项的Python解释器。NUMERIC_OUTPUT = True
NUMERIC_INPUT = True
说明
该程序的框架是
?1-( 1 -
1 )!
我们将输入内容读到N
第一个声音上并递减以获得N-1
。我们还将第二个声音初始化为1
。然后我们循环N-1
一遍,每次迭代都会在第二个堆栈上获得序列的下一个值。最后,我们打印N
第一个数字。
该程序的想法是将序列的每个元素放入第三个声音的队列中,并在每次迭代中减小该队列的开头。当头达到时0
,我们增加序列的值并删除它0
。
现在的问题是Prelude使用堆栈而不是队列。因此,我们需要稍微移动一下堆栈以使其像队列一样使用。
v #
0v ^
(#)
这会将序列的当前值复制到第一个语音(作为临时副本),将a 0
推入第二个语音(以标记队列的结尾)。然后执行循环以将第三个堆栈移动(从而反转)到第二个堆栈上。循环之后,我们将当前序列值的副本放在第二个堆栈的顶部(这是队列的尾部)。
)
(#
^#1-
这看起来有些丑陋,但从本质上讲,这是一个循环,将堆栈移回第三个声音。由于处于)
与换档指令相同的列中,因此0
我们较早放置第二个声音的位置也会最终出现在第三个声音的位置,因此我们需要用另一个声音将其删除#
。然后减小第三个声音的顶部,即队列的开头。
现在有点烦人-我们想在该值为时运行一些代码0
,但Prelude的唯一控件结构(循环)仅响应非零值。
0 (1+0)#
(0)#
请注意,第二个声音的开头是真实的(因为Golomb序列不包含任何0
s)。因此,工作负载进入了该声音(后面的括号)。如果队列头还没有,我们只需要防止这种情况发生0
。因此,首先我们在第三个语音上有一个“循环”,0
如果队列的头部仍非零,则将“ a”推到第二个语音上。我们还将0
第三个声音设为“ a ”以立即退出循环。所述#
第三语音然后或者将删除0
,或删除队列的头部,如果那是已经为零。现在,仅当队列的开头为零(并且0
在第二个声音从未被推动)。在那种情况下,我们增加序列的当前值并按a 0
退出循环。最后,0
在堆栈的顶部总是有一个,我们需要将其丢弃。
我告诉过你《前奏曲》中的逻辑否定很烦人...
n
而不是之外,这与上一个问题相同2 - n % 1
。您是否有理由期望答案会大不相同?