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 foobar
funcionando, lo devolverá oobarf
y 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 código de golf, gana el código más corto.
Respuestas:
Befunge-98 (PyFunge) , 2600 bytes
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
@
oq
y,
Problema : ninguno de esos símbolos es un buen punto de partida, especialmente desde entonces,
@
yq
termina el programa al instante.Solución : deshazte de esos caracteres en el código fuente
Problema : ¿Cómo?
Solución : use los
p
comandos (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 elg
comando que está haciendo trampa.Problema : (suspira cuándo terminarán)
Un comando put muestra 3 valores
n x y
que 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 quiningSolució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 :
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:
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ácter0
que 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í:
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
fuente
p
argumentos incorrectos es genial.