Grandes números grandes

25

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.

Azul
fuente
Agregué la etiqueta metagolf, ya que estamos jugando al programa de salida.
orlp
1
@orlp En realidad lo omití a propósito, porque metagolf es una etiqueta de criterio de puntuación que dice "la puntuación es la longitud de su salida". Sin embargo, estoy considerando agregar una meta publicación sobre eso para permitir una especie de puntuación inversa (que es el caso del código más rápido, por ejemplo).
Martin Ender
1
@ MartinBüttner Creo que necesitamos una fuente meta-restringida :)
orlp
2
¿En qué se diferencia el desafío de "qué idioma tiene el mayor rango entero" ?
nwp
55
@nwp Creo que entendiste mal la pregunta. La pregunta es sobre la compresión. Sería útil, pero no necesario, usar un lenguaje con un rango entero grande.
papa

Respuestas:

2

Python 3 → CJAM, (163 122 - 1) · 255/162 + 1 ≈ 1,213 · 10 270

import sys
n = int(input())
for b in range(163, 1, -1):
    s = []
    m = n
    while m:
        m, r = divmod(m - 93, b)
        if m < 0:
            break
        s.append(r + 93)
    else:
        sys.stdout.buffer.write(b'"%s"%db' % (bytes(s[::-1]), b))
        break
else:
    sys.stdout.buffer.write(b'%d' % n)

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.

Anders Kaseorg
fuente
12

Pyth, 252 111 ≈ 3,593 × 10 266

Js[
"ixL-rC1`H``N"
N
s@L-rC1`H``NjQ252
N
"252")$import sys$$sys.stdout.buffer.write(J.encode('iso-8859-1'))$

Tuve que usar un poco de sintaxis de Python, porque Pyth printno puede imprimir iso-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:

ixL-rC1`H``N""252

Aquí hay un ejemplo de uso con el mayor número posible:

Uso

Explicación

del programa de salida.

ixL-rC1`H``N""252
    rC1`H          create the range of chars: ['\x01', '\x02', ..., '{}']
         ``N       creates a string containing the 3 chars " ' \
   -               remove strings which consists of these 3 chars
 xL         ""     determine the index of each char in "" (encoded number)
i             252  convert from base 253 to base 10
Jakube
fuente
1
Este programa no puede codificar 12, porque Pyth desafortunadamente lee CR como LF .
Anders Kaseorg
10

CJAM, 254 109 ≈ 1,34 x 10 262

q~254b{_33>+_91>+c}%`"{_'[>-_'!>-}%254b"

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, ""{_'[>-_'!>-}%254bpor lo que puedo representar todo menos de 254 128-19 , o explícitamente

13392914970384089616967895168962602841770234460440231501234736723328784159136966979592516521814270581662903357791625539571324435618053333498444654631269141250284088221909534717492397543057152353603090337012149759082408143603558512232742912453092885969482645766144

Como ejemplo, 6153501se codificaría como

"abc"{_'[>-_'!>-}%254b

Aquí 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).

Martin Ender
fuente
8

Perl, 10 216

print"print unpack'h*',q{",(pack'h*',<>),"}"

También codificación base 100, ligeramente más elegante. La salida para 12345678sería:

print unpack'h*',q{!Ce‡}

Los delimitadores {y }corresponden a valores hexadecimales b7y d7respectivamente, 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

print"ord=~print\$' for'",(map chr"1$_",<>=~/.{1,2}/g),"'=~/.|/g"

Codificación base 100 simple. La salida para 12345678se vería así:

ord=~print$' for'p†œ²'=~/.|/g

Hay 25 bytes de sobrecarga, dejando 103 para la codificación, alcanzando un valor máximo de 10 206 -1.

primo
fuente
6

Lisp común, 36114-1 ~ 2.62 × 10117

(lambda(x)(format t"(lambda()#36r~36r)"x))

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:

(lambda()#36rzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz)
volcado de memoria
fuente
1

CJAM, 233 114 ≈ 7.561⋅10 269

ri233b{Kms/m]_34=+c}%s`"{iKms*}%233b"

El programa de salida "…"{iKms*}%233bdecodifica 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.

Anders Kaseorg
fuente