Novas linhas adicionadas para maior clareza:
(a(:^)*(!()):#(}:(:)~^a((::*:**:*)*)~*(~*)*~(*)~^a*(*)*{)>(0)(!()){:^}(1)(){:^}(2)(:*){:^}(
3)(::**){:^}(4)(:*:*){:^}(5)(::*:**){:^}(6)(:*::**){:^}(7)(::*::***){:^}(8)(:*:*:*){:^}(9)(
::**::**){:^}R^^S):^
Dei-me a restrição de que ele deveria ler do STDIN, e não do topo da pilha, como faria normalmente uma resposta do Underload. Também usei entrada decimal adequada, que compõe a maior parte do código.
Explicação:
Envolvo o programa em um invólucro de quine: (a(:^)*
e ):^
. Isso significa que todo o código dentro do Quine Wrapper terá o código-fonte do programa na parte inferior da pilha.
Para converter dígitos em um numeral normal da Igreja, uso a técnica de substituir cada dígito pelo código para multiplicar por 10 e adicionar esse dígito:
0 -> (::*:**:*)*
1 -> (::*:**:*)*(:)~*(*)*
2 -> (::*:**:*)*(::)~*(**)*
3 -> (::*:**:*)*(:::)~*(***)*
Há muita repetição aqui, então vamos empacotá-lo em um subprograma que pegará um número da Igreja do topo da pilha e o usará para construir a "sequência de dígitos:"
:(:)~^a((::*:**:*)*)~*(~*)*~(*)~^a*(*)*
Coloquei isso em um novo ambiente para que ele possa ser acessado rapidamente:
#(}:(:)~^a((::*:**:*)*)~*(~*)*~(*)~^a*(*)*{)>
Agora eu posso criar o código de substituição para R
. R
usa os elementos principais da pilha para formar uma tabela de pesquisa para substituir uma sequência de STDIN pelo código Betaload. Funciona assim:
()
(0)(code for 0)
(1)(code for 1)
(2)(code for 2)
...
R
No entanto, podemos usar o subprograma que acabamos de criar para gerar os segmentos de código:
(0)(!()){:^}
(1)(){:^}
(2)(:*){:^}
(3)(::**){:^}
...
Quando R
executado, ele transforma a entrada em uma série de subprogramas que compõem um numeral da Igreja. Quando esse subprograma é executado, ele cria o número da Igreja no próximo elemento da pilha (0, que foi colocado anteriormente). Isso significa que, depois R^
, o valor mais alto na pilha será o numeral da igreja. Mais ^
uma vez, aplicamos o número da Igreja ao elemento final da pilha (o código-fonte do programa) para obter a resposta.
Curiosidade: eu tenho o MD dessa submissão há vários meses. Eu o mantive após entender mal uma pergunta (que parece que não consigo mais encontrar). Eu tive que desenterrá-lo da minha Lixeira para publicá-lo aqui.