Прелюдия , 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
второй голос , который мы добавили ранее, также окажется в третьем голосе, поэтому нам нужно удалить его другим #
. Затем уменьшите начало 3-го голоса, то есть главы очереди.
Теперь это немного раздражает - мы хотим запустить некоторый код, когда это значение 0
, но единственная управляющая структура Prelude (цикл) реагирует только на ненулевые значения.
0 (1+0)#
(0)#
Обратите внимание, что верхняя часть второго голоса является правдивой (поскольку последовательность Голомба не содержит никаких 0
s). Таким образом, рабочая нагрузка переходит в этот голос (последняя пара скобок). Нам просто нужно предотвратить это, если глава очереди 0
еще не существует. Итак, сначала у нас есть «петля» на третьем голосе, которая выдвигает 0
на второй голос, если заголовок очереди все еще не равен нулю. Мы также добавили 0
третий голос, чтобы сразу выйти из цикла. #
На третий голос затем либо удаляет это 0
, или удаляет главу очереди , если что уже ноль. Теперь этот второй цикл вводится только в том случае, если заголовок очереди равен нулю (а0
на второй голос никогда не давил). В этом случае мы увеличиваем текущее значение последовательности и нажимаем a, 0
чтобы выйти из цикла. Наконец, всегда будет 0
верхняя часть стека, которую мы должны отбросить.
Я говорил вам, что логическое отрицание раздражает в Prelude ...
n
а не2 - n % 1
. Есть ли у вас основания ожидать, что ответы будут существенно отличаться?