?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 ^
(#)
Це копіює поточне значення послідовності в перший голос (як тимчасова копія), натискає 0
на другий голос (щоб позначити кінець черги). А потім виконує цикл для переміщення (і тим самим зворотного) третього стека на другий. Після циклу ми поміщаємо копію поточного значення послідовності поверх другого стека (який є хвостом нашої черги).
)
(#
^#1-
Це виглядає трохи некрасиво, але по суті це петля, яка зміщує стек назад на третій голос. Оскільки значення )
знаходиться в тому ж стовпці, що й інструкції з переміщення, 0
ми ставимо другий голос раніше і в кінці третього голосу, тому нам потрібно видалити його з іншим #
. Потім декрементуйте верхню частину 3-го голосу, тобто голову черги.
Тепер це стає трохи прикро - ми хочемо запустити якийсь код, коли це значення 0
, але єдина контрольна структура (цикл) Prelude відповідає лише на ненульові значення.
0 (1+0)#
(0)#
Зауважте, що вершина другого голосу є правдоподібною (оскільки послідовність Голомба не містить жодних 0
s). Тож навантаження переходить у цей голос (остання пара дужок). Нам просто потрібно не допустити цього, якщо голова черги ще не 0
є. Отже, спочатку у нас є "петля" на третьому голосі, яка натискає 0
на другий голос, якщо голова черги ще не дорівнює нулю. Ми також ставимо 0
третій голос, щоб негайно вийти з циклу. Тоді #
третій голос або видаляє це 0
, або видаляє голову черги, якщо це вже було нульовим. Тепер цей другий цикл вводиться лише в тому випадку, якщо голова черги була нульовою (і0
на другий голос ніколи не штовхався). У цьому випадку ми збільшуємо поточне значення послідовності і натискаємо a, 0
щоб вийти з циклу. Нарешті, 0
на вершині стеку завжди буде вершина, яку нам потрібно відкинути.
Я сказав вам, що логічне заперечення дратує в Прелюдії ...
n
а не2 - n % 1
. Чи є у вас якісь причини очікувати, що відповіді будуть суттєво різними?