Новые строки добавлены для ясности:
(a(:^)*(!()):#(}:(:)~^a((::*:**:*)*)~*(~*)*~(*)~^a*(*)*{)>(0)(!()){:^}(1)(){:^}(2)(:*){:^}(
3)(::**){:^}(4)(:*:*){:^}(5)(::*:**){:^}(6)(:*::**){:^}(7)(::*::***){:^}(8)(:*:*:*){:^}(9)(
::**::**){:^}R^^S):^
Я дал себе ограничение, что он должен читать из STDIN, а не из верхней части стека, как обычно бы получал ответ с недогрузкой. Я также использовал правильный десятичный ввод, который составляет большую часть кода.
Объяснение:
Я обертываю программу в обёртку от quine: (a(:^)*
и ):^
. Это означает, что весь код внутри оболочки quine будет иметь исходный код программы в нижней части стека.
Чтобы преобразовать цифры в обычную церковную цифру, я использую технику замены каждой цифры на код для умножения на 10 и добавления этой цифры:
0 -> (::*:**:*)*
1 -> (::*:**:*)*(:)~*(*)*
2 -> (::*:**:*)*(::)~*(**)*
3 -> (::*:**:*)*(:::)~*(***)*
Здесь много повторений, поэтому давайте скомпилируем его в подпрограмму, которая возьмет церковную цифру с вершины стека и использует ее для построения «строки цифр:»
:(:)~^a((::*:**:*)*)~*(~*)*~(*)~^a*(*)*
Я поместил это в новую среду, чтобы к ней можно было быстро получить доступ:
#(}:(:)~^a((::*:**:*)*)~*(~*)*~(*)~^a*(*)*{)>
Теперь я могу создать код замены для R
. R
использует верхние элементы стека для формирования таблицы поиска, чтобы заменить строку из STDIN на код Betaload. Это работает так:
()
(0)(code for 0)
(1)(code for 1)
(2)(code for 2)
...
R
Однако мы можем использовать только что созданную подпрограмму для генерации сегментов кода:
(0)(!()){:^}
(1)(){:^}
(2)(:*){:^}
(3)(::**){:^}
...
Когда R
он запускается, он преобразует входные данные в серию подпрограмм, которые образуют церковную цифру. Когда эта подпрограмма выполняется, она создает эту церковную цифру на следующем элементе в стеке (0, который был размещен ранее). Это означает, что после R^
этого верхним значением в стеке будет церковная цифра. Затем ^
мы еще раз применим числительную церковь к последнему элементу в стеке (исходный код программы), чтобы получить ответ.
Забавный факт: у меня был доктор медицины для этого представления в течение нескольких месяцев. Я сохранил его после недопонимания вопроса (который я больше не могу найти). Я должен был выкопать это из моей Корзины, чтобы отправить это здесь.