Desafío
Su objetivo es escribir un programa que imprima otro programa. Ese programa impreso debería imprimir otro programa, y el nuevo programa debería imprimir otro programa, hasta el final.
Reglas
- Cada programa debe tener menos de 256 bytes. (Si esto necesita ser cambiado, deje un comentario)
- El último programa debe ser un programa vacío.
- Debe haber un número finito de programas, por lo que el programa no puede ser una quine.
- Todos los programas deben ejecutarse en el mismo idioma.
- No se permite ninguna entrada.
- El programa ganador es el programa que imprime tantos programas como sea posible, contándose a sí mismo.
¡Buena suerte!
code-challenge
code-generation
La tortuga
fuente
fuente
2^2048
, o3.2317e616
.a*10^b
donde1<=a<10
yb
es un número natural.1.2673e614
.Respuestas:
CJam, 4.56 × 10 526 programas
Puntaje exacto: 254 219 + 254 192 + 254 166 + 254 140 + 254 114 + 254 88 + 254 63 + 254 38 + 254 13 + 3
Todos los programas deben guardarse utilizando la codificación ISO-8859-1 para cumplir con el límite de tamaño de archivo.
Gracias a @ChrisDrost que señaló un error y sugirió el enfoque de anidación.
Pruébelo en línea en el intérprete de CJam .
254 219 + 2 ≈ 4.56 × 10 526 programas
La línea compartida de la puntuación se puede lograr con el siguiente programa, mucho más simple 1 .
Ejecutar este programa produce el programa
y después 254 219 - 1 iteraciones más, el programa
Este último programa no vacío sale con un error 2 y no imprime nada (el programa vacío).
Cómo funciona
Suponga que la cadena ya está en la pila.
254 192 ≈ 5.35 × 10 461 más programas
Aquí es donde las cosas se ponen un poco locas.
El primer programa es altamente compresible. Al escribir un programa similar que, en lugar del programa vacío, finalmente produzca el primer programa de la sección anterior, podemos mejorar la puntuación en 254 192 programas 3 .
El programa
es similar al primer programa de la sección anterior, y ejecuta el primero y su salida para 254 192 iteraciones produce el último.
Suponga que la cadena ya está en la pila:
Programas de moar
El primer programa de la sección anterior sigue siendo altamente compresible, por lo que podemos aplicar un método similar y escribir un programa que, después de 254 166 iteraciones, produzca el programa mencionado anteriormente.
La repetición de esta técnica una y otra vez hasta que golpeó el límite de 255 bytes, podemos añadir un total de 254 166 + 254 140 + 254 114 + 254 88 + 254 63 + 254 38 + 254 13 + 1 ≈ 1,59 × 10 399 programas para los de las secciones anteriores.
1 Nueva línea agregada para mayor claridad.
2 Por consenso sobre Meta , esto está permitido por defecto.
3 o 0.0000000000000000000000000000000000000000000000000000000000000012%
fuente
JavaScript, 1000 programas
Si esto es válido depende precisamente de cómo entender la tercera regla.
fuente
Ruby, 1.628 × 10 ^ 237 programas
El mismo enfoque que mi respuesta de Perl, pero como Ruby ya maneja grandes ints, es más fácil de almacenar como hexadecimal.
Ruby, 9.277 × 10 ^ 90 programas
Por lo tanto, este intento es una variación ligeramente diferente del anterior, pero debido a todas las funciones adicionales, no obtengo el número tan alto como el otro ... ¡Sin embargo, fue interesante probar otro enfoque!
fuente
Python 2, 9.7 * 10 ^ 229 programas
fuente
C, 2.2 * 10 ^ 177 programas
No es perfecto, pero es bastante bueno. Quiero decir que tiene exactamente
255
bytes de longitud y genera programas de la misma longitud. Probablemente podría tocar un poco más para obtener más programas, pero lo dejaré como está por ahora.El programa se basa en una simple C quine. Además, hay un algoritmo de conteo bastante simple que cuenta a través de todos los valores posibles de la matriz de caracteres
n
. Tenemos tantos programas como permutaciones de la cadenan
.El rango de caracteres está limitado a un rango de
#
(= 35) a[
= (91). Eso es porque no quiero ninguno"
o\
en la cadena, porque necesitan escapar.La generación del programa finaliza cuando todos los valores en la matriz de caracteres
n
son[
. Luego genera un programa ficticio simplemain(){}
, que en sí mismo no genera nada.Como demostración de que debería funcionar, acabo de cambiar los límites, por lo que solo los caracteres entre el código ASCII
35
y36
que se utilizan y sólo 4 elementos de la matriz.Los programas resultantes son
Esto salidas
2^4 + 1 = 17
diferentes programas.Entonces, el programa anterior genera
((91-35)+1)^101 + 1 = 57^101 + 1 ~= 2.2 * 10^177
diferentes programas. No estoy completamente seguro de si esto cuenta, o si mi cálculo es correctofuente
2.2 * 10^177
(para aquellos que quieren comparar)?Perl, 1 × 10 ^ 163
De lo contrario, esta es una quine bastante básica, reducida a la menor cantidad de caracteres posible, que solo se ejecuta mientras el contador no lo es
0
.fuente
Lisp común, 10 113 -1
El número de nueves está limitado por el tamaño máximo de código, 256, teniendo en cuenta los espacios introducidos por la impresora.
fuente
Perl, 1.4 * 10 ^ 225
Enfoque similar a python; mismo resultado!
fuente
> <> , 65534 (?) Programas
Agregué un signo de interrogación al lado de 65533 ya que aún no he verificado que pueda imprimir 65533 (aunque tengo razones para creer que debería). Una vez que tenga un poco más de tiempo, voy a encontrar una manera de probarlo.
Puedes probarlo en línea aquí .
La esencia de este programa es que cambia la salida del personaje al final y luego disminuye su valor numérico antes de imprimir. Obtuve 65534 programas porque el valor ASCII del carácter al final del código es 65533, por lo que contando el primer programa tenemos 65534 (supongo que si cuenta el programa vacío 65535). El último programa "devuelto" no es nada; simplemente termina cuando el valor del carácter es 0.
Estoy bastante seguro de que podrá imprimir un carácter para todas las iteraciones: no pude encontrar una fuente definitiva para cuántos caracteres> <> pueden imprimir, pero hay caracteres directamente debajo de 65533, numéricamente.
Avíseme si hay algún problema con esta implementación; Estoy un poco inseguro sobre la validez de mi entrada.
Explicación
He robado descaradamente la idea de utilizar una comilla simple para crear una pseudoquina de la wiki> <> y un comentario que vi aquí una vez.
Lo que hace es analizar todo después de las comillas como caracteres y luego disminuir el último. A partir de ahí, simplemente invierte la pila (para imprimir en el orden correcto), coloca una comilla en la pila y luego imprime hasta que la pila esté vacía.
fuente
Python, 1 × 10 ^ 194 programas
Esto debe ejecutarse desde un archivo, no desde una respuesta interactiva. No es una quine.
¡Gracias a @The Turtle por ayudarme a ahorrar 3 bytes, que es más espacio para nueves!
¡Gracias a @poke por ayudarme a ahorrar 2 bytes, que es más espacio para nueves!
fuente
if n!=0
es redundante. Solo puedes escribirif n
.if n:
y entre losreplace
argumentos.Bash, 52 programas
Completamente sin inspiración y (con suerte) sólidamente en el último lugar.
fuente