En pocas palabras, su objetivo es crear un programa completo que modifique su propio código fuente hasta que cada carácter de la fuente sea diferente de como comenzó.
Incluya la fuente inicial, así como la fuente final en su publicación, así como una descripción. Por ejemplo, describa qué (más) hace su programa, el lenguaje que utilizó, su estrategia, etc.
Reglas
- Su programa debe detenerse en algún momento después de que se complete la modificación.
- En realidad, debe modificar su propio código fuente actualmente en ejecución (no necesariamente el archivo que le pasó al intérprete, modifica sus instrucciones), no imprimir un nuevo programa o escribir un nuevo archivo.
- Las lagunas estándar no están permitidas.
El programa más corto gana.
Si su idioma puede modificar su propio archivo y ejecutar un nuevo proceso de compilación, pero no puede modificar su propio código fuente (actualmente en ejecución), puede escribir dicho programa en su lugar con una penalización de + 20% bytes, redondeado. Los lenguajes auto modificables reales deberían tener una ventaja.
Editar : si su programa se detiene con errores, especifíquelo como tal (y tal vez diga cuáles son los errores).
fuente
Respuestas:
/// , 1 byte
El programa encuentra un
/
(el inicio de un grupo de reemplazo de patrones) y lo elimina en preparación para realizar el reemplazo. Luego llega a EOF, por lo que se rinde y se detiene.fuente
Laberinto , 2 bytes
El
>
gira la fuente para que se conviertaEl puntero de instrucciones ahora está en un callejón sin salida y se da vuelta para golpear el
@
que termina el programa.Por supuesto,
<@
también funcionaría.fuente
Python 2, 225 bytes
El código fuente final es una cadena de
"0"
s cuya longitud es igual al número de bytes en el objeto de código compilado original.El código encuentra el objeto de código en ejecución
sys._getframe().f_code.co_code
, y crea una estructura que representa los objetos de cadena de Python. Luego obtiene la memoria que el código realmente toma y lo reemplaza"0"*len(c)
.Cuando se ejecuta, el programa sale con el siguiente rastreo:
Esto muestra que la sobrescritura fue exitosa y el programa muere porque
0
no es un código de operación válido.Me sorprende que esto sea incluso posible en Python, los objetos de marco son de solo lectura, no puedo crear otros nuevos. Lo único complicado que esto hace es cambiar un objeto inmutable (una cadena).
fuente
"1"
cadena en el código no es realmente parte del 'código', es solo una constante a la que se hace referencia en el código de bytes. Lo que realmente estoy cambiando son los códigos de operación compilados de la máquina virtual de Python, no las constantes o variables. Entonces, lo que estoy cambiando no es el código fuente por ejemplo, solo el código compilado. Podría cambiar el código fuente tal como está almacenado, pero eso en realidad no afectaría el código en tiempo de ejecución porque ya se habría compilado. Si quisieras, podría publicar esto en un 'código de operación compilado de Python 2.7 con constantes', pero eso sería una OMI tonta."1"
que<backtick>1+1<backtick>
sólo el 2 más bytes1+1
de mi sugerencia se convierte en un2
en la versión compilada ... ¡El compilador es demasiado inteligente por su propio bien!mal , 1 byte
evil tiene varios almacenes de memoria: uno es el código fuente en sí y otro es la rueda, que es una cola circular que se inicializa en un solo cero.
q
intercambia el código fuente y la rueda, por lo que reemplaza la fuente con un byte nulo. Sin embargo, solo las letras minúsculas son operadores reales en el mal, por lo que ese personaje es simplemente un no-op y el programa termina.fuente
MSM , 8 bytes
Transforma el código fuente a
pqpqpqpq
MSM opera en una lista de cadenas. Los comandos se toman desde la izquierda y tratan el lado derecho como una pila. MSM siempre funciona en su propia fuente.
Seguimiento de ejecución:
fuente
Malbolge, 1 o 2 bytes.
El lenguaje Malbolge "encripta" cada instrucción después de ejecutarla, por lo que esta letra (Malbolge NOP) se convertirá en un
!
(que también es un nop), y luego terminará. Por alguna razón, el intérprete de Malbolge que uso requiere dos bytes para ejecutarse, lo que da lugarDC
(ambos son nops)!U
(ambos son también nops)Editar: El estado inicial de la memoria Malbolge depende de los últimos dos caracteres en el código, por lo que no está bien definido para los programas de un carácter. (Aunque a este código no le importa el estado inicial de la memoria)
fuente
x86 asm - 6 bytes
no estoy seguro si "hasta que cada carácter de la fuente sea diferente de como comenzó" se refiere a cada byte, cada modificación nemónica o general. si no soy válido, puedo cambiar el xor a un rep xor para que cada bit cambie los valores, pero esperaba no hacer eso para ahorrar 6 bytes más y permanecer al menos un poco comparable a estos idiomas de golf especializados.
Todo lo que hace es cambiar un c2 a un c3 retn obteniendo la dirección en vivo de eip y enviando 5 bytes al frente.
fuente
SMBF , 92 bytes
Se puede jugar al golf, y probablemente trabajaré más en eso más tarde.
Explicación
El programa genera los siguientes comandos al final de su cinta para borrarse, por lo que debe generar los siguientes valores en la cinta:
Haga un montón de
91
s, con_
valores nulos (mostrados como ) entre para usar para valores temporales.Ajusta los valores por las diferencias
La cinta que sigue a la ejecución será todo ceros, con la excepción del código generado
[_[_-_]_<_]
.Nota:
Este programa me hizo darme cuenta de que mi intérprete de Python para SMBF tiene un error o dos,
y aún no he descubierto una solución.Ya está arreglado.fuente
Emacs Lisp 22 bytes
Ejecutar desde REPL:
La función ahora se evalúa como
nil
.Alternativamente (desvincularse) 30 bytes
Evaluar y errores como
void-function
. La función existía antes de ejecutarse.fuente
Código rojo , 7 bytes, 1 instrucción (solo un ejemplo. No compite)
Este es un ejemplo trivial.
Mueve la siguiente ubicación de memoria sobre sí mismo, luego se detiene (porque se inicializa toda la memoria
DAT 0 0
, lo que detiene el programa cuando se ejecuta).fuente
Powershell 65 bytes
Defina una función que se reescribe en nula.
Evaluarlo una vez y se elimina a sí mismo.
Alternativamente (se elimina de la memoria) 36 bytes
Llamarlo primero lo elimina y luego intenta evaluarlo recursivamente. Error como un comando desconocido.
fuente
MIXAL, 6 bytes (contando 2 pestañas)
El programa comienza en la ubicación de memoria 0 y luego escribe 0 en la ubicación de memoria 0, borrándose así mismo. La máquina se detiene automáticamente.
Este es el lenguaje ensamblador para la hipotética computadora MIX de Donald Knuth, que puede ensamblarse y ejecutarse utilizando el kit de desarrollo GNU MIX ( https://www.gnu.org/software/mdk/ ).
fuente
> <> ,
403430 bytesPruébalo aquí!
Explicación:
Básicamente, esto pone un montón de 3 bloques de caracteres en la pila de la siguiente manera: (ypos, xpos, carácter ASCII) que se invierte al final para que el comando final 'p' lea (carácter, xpos, ypos) y establezca esa posición en el código para ese personaje. El primer carácter se establece manualmente como '<', de modo que el código termina siendo '> p <' al final para repetir el comando. Luego, todos los demás caracteres se sobrescriben como un '', incluido el carácter p. El '' es en realidad "ASCII CHAR 0", que NO es un NOP y dará un error cuando se lea.
También tiene que haber un número impar (?) De caracteres antes del comando 'p' o, de lo contrario, no se colocará en una última vez y se sobrescribirá.
fuente
Lote, 11 bytes
Modifica el código fuente a
ECHO is on.
El
@
está allí para que el comando no se repita, pero sobre todo para que los dosecho
s no se alineen.fuente
@
puede quitar, porqueECHO
(en mayúsculas) =!echo
(minúsculas)echo
s no pueden alinearse.Jolf, 4 bytes, sin competencia
Esto proporciona
₯S
el₯C
valor del elemento oda a la entrada,undefined
ya que no se proporciona ninguno. Pruébalo aquí!fuente
(Sistema de archivos) Befunge 98, 46 bytes
Tenga en cuenta que este programa crea y manipula un archivo llamado
a
. Cómo funciona:a
contiene el código completo (hasta 256 caracteres en cada dimensión) desplazado un espacio hacia arriba y dos hacia la izquierda.a
como una línea, reemplazando toda la primera línea con el contenido dea
archivo.a
archivo en la segunda línea se desplazó dos lugares a la derecha.Como efecto secundario, ¡el código fuente final ni siquiera es válido Befunge! (porque contiene nuevas líneas como datos en una sola línea)
fuente
Python 2, 238 bytes + 20% = 285.6
Básicamente, esto alterna la codificación de archivo actual de la fuente de Python entre
ascii
yutf-8
, por lo tanto, ¡esencialmente cambia cada carácter de la fuente!fuente
) as
->)as
,) else
->)else
,"utf-8"if
,'w',encoding
.