Su tarea es escribir un programa o función que:
- Cuando se ejecuta por primera vez, genera su código fuente.
En ejecuciones posteriores, debería generar lo que emitió anteriormente, pero con un cambio de carácter aleatorio (definido a continuación). No tiene que ser un cambio aleatorio uniforme, pero cada cambio posible debe tener una probabilidad distinta de cero.
Después de la primera ejecución, su programa ya no será necesariamente una quine; la salida habrá cambiado (y el programa también es libre de modificarse).
Por ejemplo, si su quine era ABCD
, ejecutarlo repetidamente podría imprimir:
ABCD
A!CD
j!CD
j!CjD
Especificaciones
Un cambio de personaje es:
- La inserción de un carácter aleatorio,
- La eliminación de un carácter aleatorio, o
- Un reemplazo de un personaje con un nuevo personaje aleatorio. Tenga en cuenta que se permite que el nuevo personaje sea el mismo que reemplaza, en cuyo caso no se realizará ningún cambio.
Por supuesto, eliminar o reemplazar un carácter de una cadena vacía no es un cambio válido.
- A pesar de que esto se etiqueta como quine , las reglas contra la lectura de su código fuente no se aplican.
Puede usar cualquier conjunto de caracteres siempre que incluya los caracteres utilizados en su código fuente.
Respuestas:
Python 3 ,
288 270 224 212 195 196 194 180 178168 bytesPruébalo en línea!
Después de imprimir el código fuente del archivo en la primera iteración, agregamos una línea adicional para establecer x en el nuevo código fuente, en lugar de m.
Explicación:
Suponiendo que
hash
devuelve un número aleatorio uniforme, hay aproximadamente 1/6 de posibilidades de insertar un nuevo personaje, 1/6 de posibilidades de cambiar un carácter existente y 2/6 de posibilidades de eliminar un carácter. ¿Cuál es la probabilidad de 2/6 restante que preguntas? ¡Por qué no hace nada 2/6 del tiempo!(Aquí hay un programa de validación adaptado de las respuestas de mbomb007 . ¡ Pruébelo en línea! )
fuente
f=__file__
que también ayudaría en el primer paso.Python 3 ,
205195 bytesPruébalo en línea!
Quería probar una versión que no lea el código fuente. Resultó que no era malo como pensaba, y solo está a unos 30 bytes detrás de la versión que lo hace . La explicación de cómo funciona es principalmente la misma que la otra respuesta, pero inicializa x de manera diferente ya que no puede leer el código fuente.
fuente
Python 2 ,
779801 bytesAunque el desafío se editó para mostrar que la lectura de su fuente está permitida, ya estaba creando mi solución sin eso. Entonces, para demostrar que es posible, lo terminé. Sin lectura del archivo fuente:
Pruébalo en línea! (Tenga en cuenta que esto no modificará la fuente. Debe ejecutarlo localmente para que funcione)
Para demostrar que las transformaciones funcionan, aquí es un programa de prueba (actualmente configurada para recoger siempre
100
parar
, y se imprime el resultado para cada combinación den
yp
para la lista inicial.)Explicación:
La primera línea es su quine clásico, pero mucho más para dar cuenta de lo que viene después.
Importar para enteros aleatorios.
L
se convertirá en una lista de ordinales del código fuente, pero inicialmente es un número entero que no se usa en ningún otro lugar de la fuente para permitir el reemplazo de una cadena. Abra el archivo para escribir la nueva fuente. En ejecuciones posteriores, se abrirá para agregar en su lugar.Elimina la primera y tercera línea de código. Reemplace lo
4
anterior con la lista de ordinales.En pedazos:
if L>5:
- Omite esta línea en la primera ejecución. Más tarde,L
habrá una lista, y esto se ejecutará. Explicaré loexec
último, porque no se ejecuta la primera vez.n
- Un número aleatorio 0-2. Esto determina qué modificación ocurre (0 = insertar, 1 = reemplazar, 2 = eliminar).p
- Una posición aleatoria en la lista en la que ocurrirá la modificación.r
- Un número aleatorio para insertar o reemplazar en la listaf.write("%03d"*3%(n,p,r))
- Agregue los 3 randoms al final del archivo fuente. En cada ejecución, esto se agregará a un número entero que codifica todos los cambios en la fuente inicial que se han producido.exec'b=[];h=%d...'%1...
- Obtenga los números aleatorios (que se encuentran después%1
en ejecuciones posteriores), aplique los cambios a la lista e imprima.while~-h:b+=[h%%1000];h/=1000
- Construya una lista de los randoms generados hasta el momento, teniendo en cuenta el inicio1
, lo que evita problemas con los ceros iniciales.while b:r,p,n=b[-3:];b=b[:-3]
- Asignar los randoms para esta iteración.L=[L[:p]+L[p+1:],L[:p]+[r]+L[p+n:]][n<2if L else 1]
- (0 = insertar, 1 = reemplazar, 2 = eliminar)print"".join(map(chr,L))
- Imprime la fuente modificada.fuente
p
puede ser la longitud de la cadena. Además, ¿cuál es el comportamiento con una cadena vacía?Of course, deleting or replacing a character from an empty string is not a valid change
Java 10, 370 bytes
Pruébalo en línea.
Explicación:
Explicación general:
quine -parte:
s
contiene el código fuente sin formato.%s
se utiliza para ingresar esta cadena en sí misma con els.format(...)
.%c
,%1$c
y34
se usan para formatear las comillas dobles.%%
se usa para formatear el módulo%
).s.format(s,34,s)
lo pone todo juntoAquí un programa básico de Java Quine.
Parte del desafío:
String s;
es el código fuente que modificaremos a nivel de clase.int r=s.length();r*=Math.random();
se usa para seleccionar un índice aleatorio del código fuente en el rango[0, length_of_modified_source_code)
.char c=127;c*=Math.random();
se utiliza para seleccionar un carácter ASCII aleatorio (incluidos los no imprimibles) en el rango unicode[0, 126]
.c%3
se usa para seleccionar una opción aleatoria de 0, 1 o 2. La opción 0 agregará el carácter aleatorio antes del índicer
; la opción 1 reemplazará el carácter en el índicer
con el carácter aleatorio; y la opción 2 eliminará el carácter en el índicer
.fuente