Grandi numeri grandi


25

Mentre cercavo di giocare a golf con molte delle mie risposte, ho dovuto scrivere numeri interi grandi nel minor numero di caratteri possibile.

Ora so che il modo migliore per farlo: sarò sempre si di scrivere questo programma.

La sfida

  • Scrivi un programma che quando viene dato un numero intero positivo, genera un programma che lo stampa su stdout o equivalente.
  • I programmi di output non devono essere nella stessa lingua del creatore.
  • L'output deve essere al massimo di 128 byte.
  • È possibile accettare input da stdin o equivalenti (non input di funzione)
  • È possibile generare il programma risultante su stdout o equivalente.
  • L'output numerico deve essere in decimale (base 10)

punteggio

Il tuo punteggio è uguale al numero intero positivo più piccolo che il tuo programma non può codificare.

Vince la voce con il punteggio più alto.


Ho aggiunto il tag metagolf, dato che stiamo giocando a golf il programma di output.
orlp,

1
@orlp In realtà l'ho omesso di proposito, perché metagolf è un tag di criterio di punteggio che dice "il punteggio è la lunghezza della tua uscita". Sto prendendo in considerazione l'aggiunta di un meta post a riguardo, per consentire anche una sorta di punteggio inverso (come nel caso del codice più veloce, ad esempio).
Martin Ender,

1
@ MartinBüttner Immagino che abbiamo bisogno di meta-
limited

2
In che modo la sfida è diversa da "quale lingua ha il più grande intervallo di numeri interi" ?
nwp,

5
@nwp Penso che tu abbia frainteso la domanda. La domanda riguarda la compressione. Sarebbe utile, ma non necessario usare una lingua con un intervallo intero grande.
Patata

Risposte:


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)

Si scopre che ogni numero intero compreso tra 1023 e (163 122 - 1) · 255/162 può essere rappresentato in almeno un modo da una conversione di base b ≤ 163 da una stringa di massimo 122 caratteri con i codici da 93 a b + 92, anziché i soliti da 0 a b - 1. Questo evita i caratteri problematici 34 (virgoletta doppia) e 92 (barra rovesciata) senza alcun codice di output aggiuntivo.


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'))$

Ho dovuto usare un po 'di sintassi di Python, perché Pyth printnon può stampare iso-8859-1.

Il numero viene codificato nella base 252 e rappresenta ogni cifra in quella base come un carattere iso-8859-1. I caratteri \e "avrebbero bisogno di scappare, e quindi non vengono utilizzati. Il carattere `non viene utilizzato perché il golf ... E inoltre il byte null non viene utilizzato, il compilatore Pyth lo proibisce.

L'output è un programma con un sovraccarico di 17 byte:

ixL-rC1`H``N""252

Ecco un esempio di utilizzo con il maggior numero possibile:

uso

Spiegazione

del programma di output.

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

1
Questo programma non riesce a codificare 12, perché purtroppo Pyth legge CR come LF .
Anders Kaseorg,

10

CJam, 254 109 ≈ 1,34 x 10 262

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

Sto codificando il numero nella base 254 e rappresento ogni cifra in quella base come un carattere ISO 8859-1, saltando "e \. L'output ha un overhead di 19 byte, ""{_'[>-_'!>-}%254bquindi posso rappresentare tutto meno di 254 128-19 , o esplicitamente

13392914970384089616967895168962602841770234460440231501234736723328784159136966979592516521814270581662903357791625539571324435618053333498444654631269141250284088221909534717492397543057152353603090337012149759082408143603558512232742912453092885969482645766144

Ad esempio, 6153501sarebbe codificato come

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

Ecco un programma di prova che stampa il numero intero codificato, quindi stampa la sua lunghezza e quindi lo esegue immediatamente per mostrare la sua validità (questo evita il problema di dover copiare i caratteri non stampabili in un nuovo programma, che non sempre funziona con l'interprete online).


8

Perl, 10 216

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

Basata anche sulla codifica 100, leggermente più elegante. L'output per 12345678sarebbe:

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

I delimitatori {e }corrispondono ai valori esadecimali b7e d7rispettivamente, che non possono essere visualizzati in ingresso, e quindi non devono essere sfuggito.

Esistono 20 byte di sovraccarico, lasciando 108 per la codifica, raggiungendo un valore massimo di 10 216 -1.


Perl, 10 206

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

Codifica base 100 semplice. L'output per 12345678sarebbe simile al seguente:

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

Esistono 25 byte di sovraccarico, lasciando 103 per la codifica, raggiungendo un valore massimo di 10 206 -1.


6

Lisp comune, 36 114 - 1 ~ 2,62 × 10 117

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

Il numero più grande è:

2621109035105672045109358354048170185329363187071886946329003212335230440027818091139599929524823562064749950789402494298276879873503833622348138409040138018400021944463278473215

Usa semplicemente la base 36. Per l'input più grande, l'output lungo 128 byte è:

(lambda()#36rzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz)

1

CJam, 233 114 ≈ 7.561⋅10 269

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

Il programma di output "…"{iKms*}%233bdecodifica i caratteri a 8 bit di una stringa in base a 233 cifre con n ↦ ⌊ n ⋅ sin 20⌋ = ⌊ n ⋅ 0,913⌋. Questa trasformazione sembra essere suriettiva senza richiedere i punti critici di codifica 34 (virgoletta doppia) e 92 (barra rovesciata) come input.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.