Nuevas líneas agregadas para mayor claridad:
(a(:^)*(!()):#(}:(:)~^a((::*:**:*)*)~*(~*)*~(*)~^a*(*)*{)>(0)(!()){:^}(1)(){:^}(2)(:*){:^}(
3)(::**){:^}(4)(:*:*){:^}(5)(::*:**){:^}(6)(:*::**){:^}(7)(::*::***){:^}(8)(:*:*:*){:^}(9)(
::**::**){:^}R^^S):^
Me di la restricción de que debe leer desde STDIN en lugar de desde la parte superior de la pila como lo haría normalmente una respuesta de baja carga. También utilicé la entrada decimal correcta, que constituye la mayor parte del código.
Explicación:
Envuelvo el programa en un quine-wrapper: (a(:^)*
y ):^
. Esto significa que todo el código dentro del contenedor de quine tendrá el código fuente del programa en la parte inferior de la pila.
Para convertir dígitos en un número normal de la Iglesia, utilizo la técnica de reemplazar cada dígito con el código para multiplicar por 10 y agregar ese dígito:
0 -> (::*:**:*)*
1 -> (::*:**:*)*(:)~*(*)*
2 -> (::*:**:*)*(::)~*(**)*
3 -> (::*:**:*)*(:::)~*(***)*
Aquí hay mucha repetición, así que empaquételo en un subprograma que tomará un número de la Iglesia de la parte superior de la pila y úselo para construir la "cadena de dígitos":
:(:)~^a((::*:**:*)*)~*(~*)*~(*)~^a*(*)*
Puse esto en un nuevo entorno para que se pueda acceder rápidamente:
#(}:(:)~^a((::*:**:*)*)~*(~*)*~(*)~^a*(*)*{)>
Ahora puedo crear el código de reemplazo para R
. R
usa los elementos superiores de la pila para formar una tabla de búsqueda para reemplazar una cadena de STDIN con código Betaload. Funciona así:
()
(0)(code for 0)
(1)(code for 1)
(2)(code for 2)
...
R
Sin embargo, podemos usar el subprograma que acabamos de hacer para generar los segmentos de código:
(0)(!()){:^}
(1)(){:^}
(2)(:*){:^}
(3)(::**){:^}
...
Cuando R
se ejecuta, transformará la entrada en una serie de subprogramas que construyen un número de Iglesia. Cuando se ejecuta este subprograma, crea ese número de Iglesia en el siguiente elemento de la pila (0, que se colocó anteriormente). Esto significa que, después R^
, el valor superior en la pila será el número de la Iglesia. Luego, ^
una vez más, aplicamos el número de la Iglesia al elemento final en la pila (el código fuente del programa) para obtener la respuesta.
Dato curioso: he tenido el MD para esta presentación durante varios meses. Lo guardé después de haber malinterpretado una pregunta (que parece que ya no puedo encontrar). Tuve que desenterrarlo de mi Papelera de reciclaje para publicarlo aquí.
x
ser0
o podemos restringirlo a enteros positivos?x
tal vez cualquier entero entero mayor o igual a 0