Ahora, todos sabemos que la mayoría de los idiomas tienen formas muy simples de "auto modificar" el código. Sin embargo, ¿qué pasaría si realmente modificara el código y editara partes de él ... en el disco?
Su objetivo es crear un código que imprima un número, luego edite su propio archivo para reemplazar el número con el siguiente en la secuencia de Fibonacci de la siguiente manera:
$ ./program
1
$ ./program
1
$ ./program
2
$ ./program
3
$ ./program
5
[etc...]
Reglas
- No puede almacenar los números "fuera" del código. Sin comentarios, sin decirle al script que salga, sin EOF, etc.
- Si su código funciona con cualquier nombre de archivo, reste 2 de la cantidad de bytes y escriba
$BYTESNOW ($ORIGINALBYTES - 2)
su título. (Se supone que los nombres de archivo están dentro del rango de cualquier ruta de archivo alfanumérica). - Su código debe escribir la salida en el archivo por sí mismo, sin ninguna ayuda de tubería externa.
- Su código puede comenzar desde uno o cero. No importa.
perl6 program
), o tiene que incluir la línea shebang para que pueda llamarse como./program
?program
, y podemos suponer que se encuentra en el directorio de trabajo actual?"a"
lugar de hacerloarg[0]
. No parece que valga la pena.Respuestas:
Golpetazo,
5247 (49-2) bytesEDICIONES:
Golfed
Prueba
fuente
-?
de la expresión regular. Y como estás allí, también puedes eliminar el primer grupo de captura :)Python 2,
118111bytes (113 - 2)Funciona con cualquier nombre de archivo válido. No hay mucho que explicar aquí, el código en sí es muy detallado.
Gracias a FlipTack por recordármelo,
close()
no es obligatorio.fuente
f=open(...)
lugar de lawith
declaración?Lote, 81 bytes
Nota: la nueva línea final es significativa. Requiere que se invoque el script utilizando su nombre completo, incluida la extensión. La salida comienza en 0.
Como Batch no puede editar un archivo de manera realista, solo agrego líneas adicionales al final del archivo, para que eventualmente sepa cuál es el siguiente número para imprimir. La
>>%0
ubicación guarda un byte porque no puedo precederlo con un dígito.fuente
C, 142 bytes (144 - 2)
Es bastante sencillo. Primero lee y luego guarda los dos caracteres en la posición 0x1A en el encabezado. Probablemente podría haber buscado más profundamente para encontrar un lugar más seguro para guardar los datos, pero me funciona en mi máquina con OSX, compilada con GCC 4.2ish y dudo que sea muy portátil. Además, dado que se basa en caracteres, se desborda después de la 13ª iteración.
Da la salida:
fuente
Node.js,
152137 bytes (139 - 2)Separado con líneas nuevas para mayor claridad, no forma parte del recuento de bytes.
Explicación:
Uso:
fuente
Python 3.6,
9691 (93-2) bytescodificar el nombre del archivo ahorraría 5 bytes (88 bytes):
Guardado algunos bytes gracias a @Artyer
fuente
a,b=0,1
f=open('f','r+');next(f);f.write(f'a,b={b,a+b}\n{next(f)}{f.seek(0)}');print(b)#
bash + utilidades Unix, 43 bytes (45-2)
La primera vez que se ejecuta esto, usa dc para calcular el primer número de Fibonacci a través de la fórmula de Binet. Cada llamada a sed modifica el programa cambiando la cadena pasada a dc; este cambio le dice a dc que agregue un 1 adicional al exponente en la fórmula, lo que hace que calcule el siguiente número en la secuencia de Fibonacci cada vez.
Prueba
Para ilustrar cómo funciona, en este punto, después de que se imprime el 55, el programa se ha modificado para que lea:
así que ejecutarlo nuevamente produce
y el programa ahora lee:
fuente
SmileBASIC 3, 99 bytes (101 -2)
Bono de -2 bytes porque funciona con cualquier nombre de archivo.
¡Este sí funciona, y de alguna manera terminó siendo del mismo tamaño que mi roto!
fuente
PRGEDIT
comandos para reemplazar la primera línea (y agrega un salto de línea despuésA=0B=1
) Y tampoco necesitaA=0
la primera vez.R, 145 bytes (147 - 2)
(Tiene una nueva línea al final). Funciona con cualquier nombre de archivo válido.
fuente
Perl 6 ,
6762 bytes (64 - 2)fuente
Apilados, no competitivos, 65 (67 - 2) bytes
Algunos problemas relacionados con el archivo IO se solucionaron en la serie más reciente de confirmaciones. Por lo tanto, sin competencia.
Aquí hay un enlace al github.
Ejecución de ejemplo
(Omití el camino real para mayor claridad).
Explicación
Cómo funciona esto es tomando un par de números para comenzar la secuencia (
2:>
en este caso es el rango entero[0, 2)
, que es(0 1)
), y luego realizando la transformación de Fibonacci en ellos, así:En cada ejecución, esta transformación se ejecuta en la parte superior de la pila. Luego, la pila se empuja a la pila, se duplica y se obtiene su primer miembro (
stack:0#
). Este elemento se emite y es el número de Fibonacci deseado.repr
luego toma la representación de la pila y agrega una nueva línea. Luego, el programa se empuja a la pila y se divide en nuevas líneas. Luego, tomamos el último miembro (la última línea) y lo agregamos a la cadena mencionada anteriormente. Finalmente, empujamosd0
(el archivo en sí; piense end
ollar sign0
==$0
.) Y le escribimos.fuente
Ruby, 68 bytes (70-2)
fuente
Clojure,
209204195 bytes-5 bytes cambiando para analizar los números como largos en lugar de enteros, y eliminando un par de espacios perdidos.
-9 bytes eliminando el espacio entre el segundo número y
(let...)
(¡el espacio más caro de la historia!).Vea los comentarios del código pregolfed para una descripción.
Probado de nuevo, y ya no arroja errores de paréntesis sin igual. Funciona hasta 7540113804746346429, momento en el que arroja una excepción de desbordamiento de entero.
También tenga en cuenta que esto supone que el código fuente se encuentra en "./src/s.clj".
fuente