Ciclador automático quine

11

Haga una quine pero con un giro.

Declaración

La quine imprime su código pero pone su primer carácter al final.
(Puede hacerlo a la inversa, pero incluya esa nota en su respuesta)
El resultado debe ser un programa que también sea una solución.

Ejemplo: suponga que su código estaba foobarfuncionando, lo devolverá oobarfy será otro programa válido.

foobar -> oobarf
oobarf -> obarfo
obarfo -> barfoo
barfoo -> arfoob
arfoob -> rfooba
rfooba -> foobar

Reglas

  • Su código no debe ser una salida de alguna generación del código de otra persona que obviamente está robando
  • Su código debe tener más de 2 caracteres (por lo que el código corto no es divertido)
  • Su código debe contener al menos dos caracteres diferentes (ej .: +++no es válido)

Puntuación

Como un desafío de gana el código más corto.

IQuick 143
fuente
2
Bueno, eso es molesto: codegolf.meta.stackexchange.com/a/14104/9365
Dom Hastings
3
@DomHastings Has tenido meses para publicar eso.
mbomb007
2
@ IQuick143 Creo que> 2 caracteres es un buen requisito por la razón que usted dijo
dylnan
55
¿Contaría esto como una 'quine giratoria'? ; p
Kevin Cruijssen
3
@ mbomb007 Encontrar un lenguaje en el que esto sea posible es parte del desafío
IQuick 143

Respuestas:

19

Befunge-98 (PyFunge) , 2600 bytes

ab*1'3:*2+*0pnd3*:::::::::::::::1'3:*3+*0p1'3:*5+*0p1'3:*d+*0p1'3:*f+*0p1'3:*fa++*0p1'3:*fd++*0p1'4'3*f-*0p1'4'3*7-*0p1'4'3*5-*0p6:*:*4-1p6:*:*4+1p6:*:*8+1p6:*:*a+1p6:*:*8+2p6:*:*f1++2p6:*:*f3++2pn75*1-:1'3:*4+*0p6:*:*f2++2pnaa*:::::::::::::::::1'3:*6+*0p1'3:*7+*0p1'3:*f1++*0p1'3:*f2++*0p1'3:*fe++*0p1'3:*ff++*0p1'4'3*e-*0p1'4'3*d-*0p1'4'3*4-*0p1'4'3*3-*0p6:*:*3-1p6:*:*2-1p6:*:*b+1p6:*:*c+1p6:*:*9+2p6:*:*a+2p6:*:*f4++2p6:*:*f5++2pn67*::::::::::1'3:*8+*0p1'3:*a+*0p1'3:*f4++*0p1'3:*f5++*0p1'4'3*f-5-*0p1'4'3*c-*0p1'4'3*2-*0p6:*:*1-1p6:*:*d+1p6:*:*b+2p6:*:*f6++2pna5*::1'3:*9+*0p1'3:*f3++*0p6:*:*1pn68*:::::1'3:*b+*0p1'3:*f8++*0p1'4'3*f-2-*0p1'4'3*9-*0p1'4'3*1+*0p6:*:*f7++2pne8*:::::::1'3:*c+*0p1'3:*f9++*0p1'4'3*f-1-*0p1'4'3*8-*0p1'4'3*2+*0p6:*:*f2++1p6:*:*f+2p6:*:*f8++2pnf4*:1'3:*e+*0p1'4'3*3+*2pn77*::::1'3:*f6++*0p1'4'3*f-4-*0p6:*:*f1++1p6:*:*c+2p6:*:*e+2pnb4*1-::1'3:*f7++*0p6:*:*f+1p6:*:*d+2pnf4*1-::1'3:*fb++*0p6:*:*7+2p1'3:*1+*2pnf4*2-1'3:*fc++*0pn95*:::1'4'3*f-3-*0p1'4'3*a-*0p1'4'3**0p6:*:*1+1pn87*1'4'3*b-*0pnac*2-:1'4'3*6-*0p1'4'3*3+*0pnf4*3-1'4'3*1-*0pn88*2-6:*:*5-1pnc9*1-6:*:*2+1pnb4*:6:*:*3+1p6:*:*6+1pn88*6:*:*9+1pnd4*1-6:*:*e+1pnc8*2-:1'3:**1p1'3:**2pnd7*2+6:*:*4+2pn75*6:*:*6+2pn>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>ab*1'3:*2+*0pnd3*:::::::::::::::1'3:*3+*0p1'3:*5+*0p1'3:*d+*0p1'3:*f+*0p1'3:*fa++*0p1'3:*fd++*0p1'4'3*f-*0p1'4'3*7-*0p1'4'3*5-*0p6:*:*4-1p6:*:*4+1p6:*:*8+1p6:*:*a+1p6:*:*8+2p6:*:*f1++2p6:*:*f3++2pn75*1-:1'3:*4+*0p6:*:*f2++2pnaa*:::::::::::::::::1'3:*6+*0p1'3:*7+*0p1'3:*f1++*0p1'3:*f2++*0p1'3:*fe++*0p1'3:*ff++*0p1'4'3*e-*0p1'4'3*d-*0p1'4'3*4-*0p1'4'3*3-*0p6:*:*3-1p6:*:*2-1p6:*:*b+1p6:*:*c+1p6:*:*9+2p6:*:*a+2p6:*:*f4++2p6:*:*f5++2pn67*::::::::::1'3:*8+*0p1'3:*a+*0p1'3:*f4++*0p1'3:*f5++*0p1'4'3*f-5-*0p1'4'3*c-*0p1'4'3*2-*0p6:*:*1-1p6:*:*d+1p6:*:*b+2p6:*:*f6++2pna5*::1'3:*9+*0p1'3:*f3++*0p6:*:*1pn68*:::::1'3:*b+*0p1'3:*f8++*0p1'4'3*f-2-*0p1'4'3*9-*0p1'4'3*1+*0p6:*:*f7++2pne8*:::::::1'3:*c+*0p1'3:*f9++*0p1'4'3*f-1-*0p1'4'3*8-*0p1'4'3*2+*0p6:*:*f2++1p6:*:*f+2p6:*:*f8++2pnf4*:1'3:*e+*0p1'4'3*3+*2pn77*::::1'3:*f6++*0p1'4'3*f-4-*0p6:*:*f1++1p6:*:*c+2p6:*:*e+2pnb4*1-::1'3:*f7++*0p6:*:*f+1p6:*:*d+2pnf4*1-::1'3:*fb++*0p6:*:*7+2p1'3:*1+*2pnf4*2-1'3:*fc++*0pn95*:::1'4'3*f-3-*0p1'4'3*a-*0p1'4'3**0p6:*:*1+1pn87*1'4'3*b-*0pnac*2-:1'4'3*6-*0p1'4'3*3+*0pnf4*3-1'4'3*1-*0pn88*2-6:*:*5-1pnc9*1-6:*:*2+1pnb4*:6:*:*3+1p6:*:*6+1pn88*6:*:*9+1pnd4*1-6:*:*e+1pnc8*2-:1'3:**1p1'3:**2pnd7*2+6:*:*4+2pn75*6:*:*6+2pn>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

Pruébalo en línea!

Esto hizo que esto fuera un infierno.

Cómo funciona esto:
el programa es un conjunto de sentencias put que ensamblan un programa B alrededor de sí mismo que luego imprime la mitad del byte fuente desplazado dos veces.
El programa es en realidad 2 copias de un programa de 1300 bytes, por lo que se garantiza que todo el programa de 1300 bytes siempre se ejecute como un todo.

Mejor explicación:
cada quine Befunge-98 debe contener símbolos como @o qy ,
Problema : ninguno de esos símbolos es un buen punto de partida, especialmente desde entonces, @y qtermina el programa al instante.
Solución : deshazte de esos caracteres en el código fuente

Problema : ¿Cómo?
Solución : use los pcomandos (poner) para modificar el código fuente para incluir los caracteres requeridos que imprimirán los contenidos del código fuente desplazados en un byte y no usar el gcomando que está haciendo trampa.

Problema : (suspira cuándo terminarán)
Un comando put muestra 3 valores n x yque determinan los caracteres, x-coord, y-coord; sin embargo, cuando la inicialización de estos valores se divide por la mitad, puede escribir caracteres incorrectos en el código fuente inicial haciéndolo inútil para quining
Solución : (la última lo prometo)
Use 2 copias del código fuente, siendo la última la "correcta", esto soluciona accidentalmente otro problema que es que una instrucción put (comando p + inicializadores constantes) que se divide por la mitad no se ejecuta, esto se soluciona teniendo 2 copias de cada declaración. Lo último que esto necesita funcionar es cómo hacemos que todo el código fuente sea la mitad.

Respuesta :
Dicen que una imagen vale más que 1000 palabras.  Luego hicieron Piet.

Esta es una prueba visual de por qué dos copias de un byte de cadena desplazado == Dos copias de una cadena de byte desplazado. Eso significa que podemos tomar la mitad del código, byte shift, luego imprimirlo dos veces (O tomar la mitad del código, byte shift, imprimir, repetir [Eso es lo que realmente sucede])

Cómo se implementa esto : supongamos que 0123456789abcdef es la fuente

Pseudocódigo Befunge:

0123456789abcv;;"123456789abcdef" < go this way <--
             >PS'0,   repeat 2x   ^

PS significa Print Stack (no es una instrucción real). Empujamos la mitad del código fuente hacia atrás en la pila usando, ""luego imprimimos la pila y luego buscamos ( 'ordenamos) el primer carácter 0que movemos delante del 'e imprimimos el último que causa el cambio de bytes, luego repetimos el ciclo una vez más para imprimir la segunda copia. Un tecnicismo con el que lidiar son los símbolos dentro de la fuente, esto puede causar problemas si lo escribimos mientras ejecutamos el código fuente, evité esto agregando más sentencias put que se ocupan de él externamente.

Esto hace que el código se vea más o menos así: Código

Explicación :
resaltado verde: código que se encarga de agregar caracteres a las
letras grises de origen (es probable que tenga poca visibilidad): código que se agrega mediante el código verde
resaltado rojo: código que mueve el primer carácter de la segunda mitad del código fuente al área azul .
Highlight azul: vea Highlight rojo
Orange Highlight: código que asegura que finalicemos después de que escribimos copias desplazadas de 2 bytes colocando un @comando (terminar) en el área amarilla.

Con suerte, las flechas deberían aclarar cómo va el flujo del código.

Aquí viene la última parte difícil:
¿De dónde viene el código fuente de los bebés ?

Respuesta corta: C # Magic
Respuesta larga: más de 100 fragmentos de código Befunge hechos a mano compilados por código C #. Escribí manualmente alrededor de 100 inicializadores constantes (una pieza de código de inicio que empuja un cierto número para apilar) a mano y luego usé un programa C # personalizado para compilarlo en la salida de Befunge de 1300 bytes, que luego copié pegado dos veces e hice el final programa.

¿Sigues aquí? Genial, gracias por leer! (o al menos desplazarse hasta el final)
Espero que mis chistes sean divertidos y no molestos.

Nota: Ninguna instrucción put en este código crea un comando ag que sería una trampa.

EDITAR: He verificado el código usando el siguiente código Javascript en TIO usando herramientas de desarrollador

setInterval(()=>{document.getElementById("code").value = 
document.getElementById("output").value; 
document.getElementById("run").click();}, 2000);
IQuick 143
fuente
Realmente espero con ansias la explicación completa, ¡pero esto parece un gran logro y ciertamente merece la recompensa!
Nathaniel
1
@Nathaniel Ahí va la explicación completa ¡espero que les guste! : D
IQuick 143
1
Esa parte de tratar con pargumentos incorrectos es genial.
leo3065
@ leo3065 Gracias :)
IQuick 143
@lQuick de hecho lo hago!
Nathaniel