Quine endurecida por mutación

14

Su tarea es hacer un programa que imprima su propia fuente.

"¡Oye, ya tenemos este desafío, y toneladas de variaciones! ¿Por qué estás haciendo otro?" puede preguntar, pero este será uno de los más difíciles (con suerte, de todos modos).

Su quine debe estar "endurecido por mutación", lo que significa que la quine, incluso cuando cualquiera de sus caracteres está duplicado en su lugar, debe generar el código fuente del programa original.

Por ejemplo, si tiene una quine (el siguiente ejemplo no está escrito en ningún idioma, es solo pseudocódigo):

abcd

Todos estos programas deben generar abcd:

aabcd
abbcd
abccd
abcdd

(En cada uno de esos programas, a, b, cy dson cada duplicado en el lugar, lo que significa que el personaje duplicada se coloca directamente después del carácter original).

Reglas:

  • Se aplican las reglas estándar de quine.
  • Un carácter de varios bytes cuenta como un carácter, y el carácter no se "divide" en sus bytes respectivos cuando se duplica.

Este es el , por lo que gana el código más corto en bytes.

clismique
fuente
¿Esto cuenta? 0y 00en CJam ambas salidas 0.
geokavel
No, 0no es una quine adecuada.
Dennis
2
Creo que sería mucho más interesante como el juego de bolos de código
Sr. Xcoder
¿Es el problema de la mutación del código solucionable en general? a menos que la mutación le ocurra a un personaje dentro de una cadena entre comillas, normalmente corrompería el programa.
hasen
¿No es el título un poco engañoso? "Mutación" sugiere alterar un personaje, no repetirlo
Luis Mendo

Respuestas:

18

> <> , 56 bytes

^
.
+
8
f
0
o
a
o
~
:
?
~
:
?
:
-
*
4
8
:
^
^
}
*
3
d
'

Pruébalo en línea! o verificar todas las mutaciones .

Cómo funciona el programa original (obsoleto)

El intérprete comienza en la celda (0, 0) . ^establece la dirección hacia arriba , por lo que el puntero de instrucción (IP) se ajusta a la celda (0, 20) .

'activa el modo de cadena: hasta que 'se encuentre el siguiente , todos los caracteres debajo de la IP se insertan en la pila. Lo mismo 'se encuentra nuevamente después de envolver, así que empujamos

d3*}^^:84*=?~oao0f.^

El IP aterriza en (0, 19) , aún hacia arriba. La ejecución d3*}empuja 13 = 0xd , luego 3 , multiplica ambos valores ( 39 / comilla simple ), luego gira la pila hacia la derecha. Esto deja la pila de la siguiente manera.

'd3*}^^:84*=?~oao0f.^

Las siguientes dos instrucciones ( ^) no hacen nada en este momento.

:84*=duplica la parte superior de la pila, empuja 8 y 4 , los multiplica ( 32 / espacio ), luego prueba el carácter duplicado para la igualdad con el espacio . Para el programa inalterado, esto siempre empujará 0 .

?omite la siguiente instrucción si la parte superior de la pila es falsa. Para el programa original, siempre lo es, por ~lo que siempre se omite.

oaoaparece e imprime la parte superior de la pila, empuja un avance de 10 / línea , luego abre e imprime el avance de línea .

Finalmente 0f.salta a la celda (0, 15) (la más baja ^), comenzando de nuevo con el siguiente personaje en la pila.

Una vez que la pila está vacía, se ha impreso todo el código fuente. :fallará y el programa se cerrará.

Cómo funcionan los programas mutados (obsoletos)

Duplicar cualquier carácter sin salto de línea solo extenderá el programa horizontalmente. Como el programa se ejecuta verticalmente, estas instrucciones adicionales nunca se ejecutarán.

Duplicar cualquier salto de línea antes del fondo inferior ^desplazará las celdas (0, 14) y (0, 15) a (0, 15) y (0, 16) . 0f.ahora saltará a la celda antes de la parte inferior ^, que también es a ^, por lo que el cambio no afecta al programa.

Finalmente, cualquier carácter de salto de línea duplicado también alterará la cadena. Las líneas cortas se rellenan con espacios, por lo que se insertará un 32 / espacio en la posición del salto de línea. 84*=presionará 1 por espacio, por lo ?que no omite la siguiente instrucción. En este caso, ~aparece y descarta el espacio , por lo que lo siguiente oimprimirá el carácter sobre el espacio en su lugar.

Dennis
fuente
Puede duplicar cualquier nueva línea y seguirá funcionando.
Dennis
3
Oh, no leí la publicación correctamente: P (Maldita sea Dennis, por qué eres tan bueno)
clismique
44
Agrietado.
jimmy23013
@ jimmy23013 Se debe corregir.
Dennis