Al tratar de jugar varias de mis respuestas, he necesitado escribir enteros grandes en la menor cantidad de caracteres posible.
Ahora sé la mejor manera de hacer eso: conseguiré que escribas este programa.
El reto
- Escriba un programa que, cuando se le da un número entero positivo, genera un programa que lo imprime en stdout o equivalente.
- Los programas de salida no tienen que estar en el mismo idioma que el creador.
- La salida debe tener como máximo 128 bytes.
- Puede aceptar la entrada de stdin o equivalente (no entrada de función)
- Puede enviar el programa resultante a stdout o equivalente.
- El número de salida debe estar en decimal (base 10)
Tanteo
Su puntaje es igual al menor entero positivo que su programa no puede codificar.
La entrada con la mayor puntuación gana.
Respuestas:
Python 3 → CJAM, (163 122 - 1) · 255/162 + 1 ≈ 1,213 · 10 270
Resulta que cada número entero desde 1023 hasta (163 122 - 1) · 255/162 se puede representar al menos de una manera mediante una conversión de base b ≤ 163 a partir de una cadena de 122 caracteres como máximo con códigos 93 a b + 92, en lugar de los habituales 0 a b - 1. Esto evita los caracteres problemáticos 34 (comillas dobles) y 92 (barra invertida) sin ningún código de salida adicional.
fuente
Pyth, 252 111 ≈ 3,593 × 10 266
Tuve que usar un poco de sintaxis de Python, porque Pyth
print
no puede imprimiriso-8859-1
.El número se codifica en la base 252 y representa cada dígito en esa base como un carácter iso-8859-1. Los caracteres
\
y"
necesitarían escapar, y por lo tanto no se usan. El carácter`
no se usa porque juega al golf ... Y además, el byte nulo tampoco se usa, el compilador Pyth lo prohíbe.La salida es un programa con una sobrecarga de 17 bytes:
Aquí hay un ejemplo de uso con el mayor número posible:
Explicación
del programa de salida.
fuente
12
, porque Pyth desafortunadamente lee CR como LF .CJAM, 254 109 ≈ 1,34 x 10 262
Estoy codificando el número en la base 254 y represento cada dígito en esa base como un carácter ISO 8859-1, omitiendo
"
y\
. La salida tiene una sobrecarga de 19 bytes,""{_'[>-_'!>-}%254b
por lo que puedo representar todo menos de 254 128-19 , o explícitamenteComo ejemplo,
6153501
se codificaría comoAquí hay un programa de prueba que imprime el número entero codificado, y luego imprime su longitud, y luego lo ejecuta de inmediato para mostrar su validez (esto evita el problema de tener que copiar los caracteres no imprimibles en un nuevo programa, que no siempre funciona con el intérprete en línea).
fuente
Perl, 10 216
También codificación base 100, ligeramente más elegante. La salida para
12345678
sería:Los delimitadores
{
y}
corresponden a valores hexadecimalesb7
yd7
respectivamente, que no pueden aparecer en la entrada y, por lo tanto, no necesitan escapar.Hay 20 bytes de sobrecarga, dejando 108 para la codificación, alcanzando un valor máximo de 10 216 -1.
Perl, 10 206
Codificación base 100 simple. La salida para
12345678
se vería así:Hay 25 bytes de sobrecarga, dejando 103 para la codificación, alcanzando un valor máximo de 10 206 -1.
fuente
Lisp común, 36114-1 ~ 2.62 × 10117
El número más grande es:
2621109035105672045109358354048170185329363187071886946329003212335230440027818091139599929524823562064749950789402494298276879873503833622348138409040138018400021944463278800021944463278000
Simplemente use la base 36. Para la entrada más grande, la salida de 128 bytes es:
fuente
CJAM, 233 114 ≈ 7.561⋅10 269
El programa de salida
"…"{iKms*}%233b
decodifica los caracteres de 8 bits de una cadena para basar 233 dígitos con n ↦ ⌊ n ⋅ sin 20⌋ = ⌊ n ⋅ 0.913⌋. Esta transformación resulta ser sobreyectiva sin requerir los puntos de código críticos 34 (comillas dobles) y 92 (barra invertida) como entrada.fuente