Grandes números grandes

25

Ao tentar jogar várias das minhas respostas, eu precisava escrever números inteiros grandes com o menor número possível de caracteres.

Agora eu sei a melhor maneira de fazer isso: eu vou fazer você escrever este programa.

O desafio

  • Escreva um programa que, quando dado um número inteiro positivo, produz um programa que o imprima em stdout ou equivalente.
  • Os programas de saída não precisam estar no mesmo idioma que o criador.
  • A saída deve ter no máximo 128 bytes.
  • Você pode aceitar entrada de stdin ou equivalente (não entrada de função)
  • Você pode enviar o programa resultante para stdout ou equivalente.
  • O número de saída deve estar em decimal (base 10)

Pontuação

Sua pontuação é igual ao menor número inteiro positivo que seu programa não pode codificar.

A entrada com a maior pontuação vence.

Azul
fonte
Eu adicionei a tag metagolf, já que estamos jogando o programa de saída.
orlp 14/09/15
1
@orlp Na verdade, eu o omiti de propósito, porque o metagolf é uma tag de critério de pontuação que diz "a pontuação é o comprimento da sua saída". Estou pensando em adicionar um meta post sobre isso para permitir uma classificação inversa também (que é o caso do código mais rápido, por exemplo).
Martin Ender
1
@ MartinBüttner Eu acho que precisamos de meta-restrição de fonte :)
orlp
2
Como o desafio difere de "qual idioma possui o maior número inteiro" ?
nwp 14/09/15
5
@nwp Acho que você não entendeu a pergunta. A questão é sobre compressão. Seria útil, mas não necessário, usar um idioma com um grande número inteiro.
potato

Respostas:

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)

Acontece que todo número inteiro de 1023 a (163 122 - 1) · 255/162 pode ser representado de pelo menos uma maneira por uma conversão de base b ≤ 163 de uma sequência de no máximo 122 caracteres com os códigos 93 a b + 92, em vez dos habituais 0 a b - 1. Isso evita os caracteres problemáticos 34 (aspas duplas) e 92 (barra invertida) sem nenhum código de saída extra.

Anders Kaseorg
fonte
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'))$

Tinha que usar um pouco da sintaxe do Python, porque o Pyth printnão pode imprimir iso-8859-1.

O número é codificado na base 252 e representa cada dígito nessa base como um caractere iso-8859-1. Os caracteres \e "precisariam escapar e, portanto, não são usados. O char `não é usado porque o golfe ... Além disso, o byte nulo também não é usado, o compilador Pyth o proíbe.

A saída é um programa com uma sobrecarga de 17 bytes:

ixL-rC1`H``N""252

Aqui está um exemplo de uso com o maior número possível:

Uso

Explicação

do programa de saída.

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
fonte
1
Este programa falha na codificação 12, porque Pyth infelizmente lê CR como LF .
Anders Kaseorg
10

CJam, 254 109 ≈ 1,34 x 10 262

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

Estou codificando o número na base 254 e represento cada dígito nessa base como um caractere ISO 8859-1, pulando "e \. A saída tem uma sobrecarga de 19 bytes, ""{_'[>-_'!>-}%254bpara que eu possa representar tudo menos que 254 128-19 , ou explicitamente

13392914970384089616967895168962602841770234460440231501234736723328784159136966979592516521814270581662903357791625539571324435618053333498444654631269141250284088221909534717492397543057152353603090337012149759082408143603558512232742912453092885969482645766144

Como exemplo, 6153501seria codificado como

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

Aqui está um programa de teste que imprime o número inteiro codificado e depois imprime seu comprimento e o executa imediatamente para mostrar sua validade (isso evita o problema de ter que copiar os caracteres não imprimíveis em um novo programa, o que nem sempre funciona com o intérprete online).

Martin Ender
fonte
8

Perl, 10 216

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

Também codifica a base 100, um pouco mais elegante. A saída para 12345678seria:

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

Os delímetros {e }correspondem aos valores hexadecimais b7e d7, respectivamente, que não podem aparecer na entrada e, portanto, não precisam ser escapados.

Existem 20 bytes de sobrecarga, deixando 108 para codificação, atingindo um valor máximo de 10 216 -1.


Perl, 10 206

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

Codificação simples da base 100. A saída para 12345678ficaria assim:

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

Existem 25 bytes de sobrecarga, deixando 103 para codificação, atingindo um valor máximo de 10 206 -1.

primo
fonte
6

Lisp comum, 36 114 - 1 ~ 2.62 × 10 117

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

O maior número é:

262110903510567204510935835404817018532936318707188694632900321233523044002781809113959992952482356206474995050940249429827687987350383362234813440240440440440440450540440460840410

Basta usar a base 36. Para a maior entrada, a saída de 128 bytes é:

(lambda()#36rzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz)
coredump
fonte
1

CJam, 233 114 ≈ 7.561⋅10 269

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

O programa de saída "…"{iKms*}%233bdecodifica os caracteres de 8 bits de uma string para basear 233 dígitos com n ⌊ ⌊ n ⌋ sen 20⌋ = ⌊ n ⋅ 0,913⌋. Essa transformação é subjetiva, sem exigir os pontos de código críticos 34 (aspas duplas) e 92 (barra invertida) como entrada.

Anders Kaseorg
fonte