Su trabajo es crear la quine iterativa de período más largo , donde la longitud de cada programa en la secuencia está limitada por 500 bytes.
Es decir, si repite los siguientes pasos:
- Comience con su programa inicial
- Ejecuta el programa actual
- Regrese al paso 2
Eventualmente volverá a su programa original. El número de programas en el ciclo es su puntaje, que está tratando de maximizar.
Ninguno de los programas puede generar errores. Cada programa también debe ejecutarse de la misma manera (por ejemplo, no hay diferentes versiones, implementaciones, opciones de compilación, plataformas, etc.) (EDITAR: Sí, cualquier estado externo como el de un generador de números pseudoaleatorios se incluyó en el último declaración. El estado externo debe "restablecerse" después de cada ejecución. Si utiliza números aleatorios verdaderos, se supone el peor de los casos).
Lo que separa este desafío del Quine iterativo de período más largo (que no sea 100 vs 500) es que cada programa en el ciclo también debe tener 500 bytes o menos. Esto significa que el ciclo más largo posible es (256 ^ 501 - 1) / 255 o menos. Eso, por supuesto, es un gran número, pero no tan grande en términos de cuánto código se necesita para calcular. Por lo tanto, el desafío consiste en utilizar tantas posibilidades (256 ^ 501 - 1) / 255 como sea posible, no un desafío de castores ocupados.
Los programas no pueden acceder a su propio código fuente. Sin embargo, se permite un programa vacío si lo desea (siempre y cuando siga las otras reglas).
Dado que verificar los programas manualmente sería difícil, puede calcular el puntaje utilizando métodos teóricos. Debe incluir una explicación del puntaje y la corrección con su programa. Si no puede calcular el puntaje, puede utilizar un límite inferior del número de programas en el ciclo como puntaje de facto. Puede actualizar esto a medida que encuentre mejores límites inferiores, o si encuentra el puntaje real exacto.
Este es un desafío de código , por lo que gana la puntuación más alta.
EDITAR: Se recomienda que escriba cuál es su puntaje en notación científica, para que las respuestas sean más fácilmente comparables. Está perfectamente bien tener otras formas de puntuación, especialmente si están más claramente conectadas a su programa. Además, se alienta a los lectores a editar respuestas anteriores para cumplir con esto.
fuente
Respuestas:
Perl 6 ,126398≈ 8.86 × 10835 iteraciones
Pruébalo en línea!
Esto itera a través de todas las combinaciones posibles de los primeros 126 bytes de longitud 398 y menos (excluyendo cadenas con bytes NUL iniciales). Si desea ver que realmente vuelve a la primera iteración, puede reducir la longitud a 1 cambiando el límite de esta manera .
Explicación:
Cada iteración incrementa la cadena, almacenada en forma de base 126, y luego la convierte de nuevo en base 126. Hace esto hasta que alcanza una cadena con longitud 399, y luego restablece la cadena para vaciarla nuevamente. Si tiene problemas para conceptualizar el número, imagínelo con diez bytes. A partir de104 - 1 iteraciones (incluyendo
0
, incremente hasta 4 dígitos1000
y reinicie. Esto es0
o cadena vacía en el caso de mi programa).fuente
Encantamientos rúnicos ,
64654 106; 122 387 -1 ≈ 2.638 × 10 807 iteracionesPruébalo en línea!
Alerta:
€
se muestra incorrectamente, debería ser `` (0x80).En lugar de la pila, use una cadena y los operadores de pila modificados con
͍
para modificar una cadena en lugar de la pila (ver revisión previa). Como tal, cada carácter está limitado a 1 byte (rango de 0-127, menos los caracteres problemáticos), pero con más de 3 veces más (debido a que hay menos repetitivo de procesamiento debido a que no tiene que omitir los caracteres de combinación Unicode, como así como otros ahorros de bytes) logra un mayor número de iteraciones.Si se permite la codificación como un verdadero big endian (es decir, tener valores de byte superiores a 127 sin interponer
0x00
bytes), esto puede lograr 251 387 -1 ≈ 4.717 × 10 928 iteraciones. Sin embargo, la codificación latina de TIO evita esto, como lo señaló Erik the Outgolfer en su respuesta de Python 2. Necesitaría verificar si funciona localmente antes de reclamar este puntaje.Debería poder reemplazar
f1+0B
con'0B
(hay una impronta0x16
allí), pero estaba luchando contra mí (las cosas no querían ramificarse / saltar / regresar correctamente), así que lo dejé solo. Esto elevaría la estructura big-endian de 387 a 388.fuente
DOS COM, 49 bytes, período 2 ^ 3608
Ensamblaje original para crear:
Esta pequeña joya escribe la siguiente fase en q.com en lugar de la salida estándar debido a nulos y otras cosas que el terminal no puede manejar. La técnica de quine de raíz es equivalente a la stringificación y la sala de carga se utiliza como un contador de 3608 bits. Debido a la forma en que funciona DOS, el estado inicial del contador contiene restos de lo que haya en la memoria antes de su primera ejecución.
La entrada original de 49 bytes es inalcanzable, por lo que si desea anotar esto como 500 bytes, continúe.
fuente
C # (compilador interactivo de Visual C #) , marcas:
/u:System.Numerics.BigInteger
y/r:System.Numerics
Puntuación: 10 332
¡Gracias a JoKing que aumentó mi puntaje de 10 255 * 2 - 1 hasta ahora!
Pruébalo en línea!
Explicación
Incrementa un BigInteger cada iteración, hasta que su longitud se vuelve demasiado grande, lo que en ese caso volvemos instantáneamente a la quine original.
fuente
Tenga en cuenta que hay una nueva línea final. Podría eliminarse arriba si el resaltador de sintaxis se abre paso.
Desafortunadamente, no puede ejecutar este programa en TIO, ya que está codificado en Latin-1.
Arriba,
s
contiene 219 0x01 bytes. Después de que se ejecuta el programa, se imprime su fuente, excepto por una diferencia:s
se ha incrementado como un número big-endian base-252, por lo que su carácter más a la izquierda se ha "incrementado" a 0x02. Se evitan los bytes 0x00, 0x22, 0x25 y 0x5C, por lo tanto, si algún carácter de la cadena se convierte en uno de esos después del incremento, el carácter en sí mismo se incrementa nuevamente."
): existe el peligro de que se formen tres bytes 0x22 en una fila, es decir"""
, o que el último carácter de la cadena se convierta"
, por lo que la cadena se cerraría prematuramente.%
): printf-como formato de cadenas se usa antes de la finalización del esqueleto quine, por lo que un%
no adyacente a otra%
ens
causará problemas. Desafortunadamente, no es posible reordenar el formato para evitar esta advertencia.\
): existe la posibilidad de que\
se use como una marca de escape en la cadena, en lugar de textualmente, por lo que se evita.Por lo tanto, 252 de 256 bytes son utilizables. Si
s
contiene 219 0xFF (ÿ
) bytes, simplemente se revierte a 219 0x01 bytes, completando así el ciclo.fuente
limpia ,251226≈ 2.1 × 10542
251 39elimina la dependencia deText
251 122golfed función incrementar251 128cadenas de fuente combinadas de prefijo y sufijo251 188 seeliminó la dependencia deGast.GenLibTest
Presentado en formato xxd debido a UTF-8 no imprimibles / no válidos:
Pruébalo en línea!
Incrementos de una cadena de 226 bytes a través de todos los valores de bytes excluyendo
\0
,\n
,\r
,'
y\
.La razón por la que evitamos estos caracteres es:
\0
hace enojar al compilador\n
y\r
no puede aparecer en las listas'
terminaría el charlist\
podría causar problemas si se trata de un personaje escapableUna vez que la cadena es todo
\377
s, se ajusta a todos los\001
s, dando el programa original.fuente
C2 80
. ¿Es esto lo mismo que el comportamiento en su máquina local?Gol> <> , 70 bytes, 39039000 iteraciones
Wow, eso es mucho más bajo de lo que pensé que sería ... ¡Siguiente paso! Haciéndolo tener más iteraciones !!!
Pruébalo en línea!
fuente