Angka besar besar

25

Sementara mencoba golf beberapa jawaban saya, saya perlu menulis bilangan bulat besar dalam karakter sesedikit mungkin.

Sekarang saya tahu cara terbaik untuk melakukannya: Saya akan membuat Anda menulis program ini.

Tantangan

  • Tulis program yang ketika diberi bilangan bulat positif, mengeluarkan program yang mencetaknya menjadi stdout atau setara.
  • Program output tidak harus dalam bahasa yang sama dengan pembuatnya.
  • Output harus paling banyak 128 byte.
  • Anda dapat menerima input dari stdin atau setara (bukan input fungsi)
  • Anda dapat menampilkan program yang dihasilkan ke stdout atau setara.
  • Output angka harus dalam desimal (basis 10)

Mencetak gol

Skor Anda sama dengan bilangan bulat positif terkecil yang tidak dapat dikodekan oleh program Anda.

Entri dengan skor tertinggi menang.

Biru
sumber
Saya menambahkan tag metagolf, karena kami sedang golf program output.
orlp
1
@ Atau saya sebenarnya sengaja menghilangkannya, karena metagolf adalah tag kriteria penilaian yang mengatakan "skornya adalah panjang dari output Anda". Saya sedang mempertimbangkan untuk menambahkan postingan meta tentang itu untuk memungkinkan semacam penilaian terbalik juga (yang merupakan kasus untuk kode tercepat misalnya).
Martin Ender
1
@ MartinBüttner Saya kira kita perlu meta-dibatasi-sumber :)
orlp
2
Bagaimana tantangannya berbeda dari "bahasa mana yang memiliki rentang bilangan bulat terbesar" ?
nwp
5
@ nwp Saya pikir Anda salah paham pertanyaannya. Pertanyaannya adalah tentang kompresi. Akan bermanfaat, tetapi tidak perlu menggunakan bahasa dengan rentang bilangan bulat besar.
kentang

Jawaban:

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)

Ternyata setiap bilangan bulat dari 1023 hingga (163 122 - 1) · 255/162 dapat diwakili dalam setidaknya satu cara dengan basis b ≤ 163 konversi dari string paling banyak 122 karakter dengan kode 93 hingga b + 92, daripada biasa 0 sampai b - 1. Ini menghindari karakter merepotkan 34 (kutipan ganda) dan 92 (backslash) tanpa kode output tambahan.

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

Harus menggunakan sedikit sintaks Python, karena Pyth printtidak dapat mencetak iso-8859-1.

Nomor tersebut akan dikodekan dalam basis 252 dan mewakili setiap digit dalam basis itu sebagai karakter iso-8859-1. Karakter \dan "perlu melarikan diri, dan karena itu tidak digunakan. Char `tidak digunakan karena golf ... Dan selain itu null-byte juga tidak digunakan, kompiler Pyth melarangnya.

Outputnya adalah program dengan overhead 17 byte:

ixL-rC1`H``N""252

Berikut adalah contoh penggunaan dengan jumlah terbesar yang mungkin:

Pemakaian

Penjelasan

dari program keluaran.

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
sumber
1
Program ini gagal menyandikan 12, karena Pyth sayangnya membaca CR sebagai LF .
Anders Kaseorg
10

CJam, 254 109 ≈ 1,34 x 10 262

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

Saya menyandikan angka pada basis 254 dan mewakili setiap digit pada basis itu sebagai karakter ISO 8859-1, melewatkan "dan \. Output memiliki overhead 19 byte ""{_'[>-_'!>-}%254b, jadi saya bisa mewakili semuanya kurang dari 254 128-19 , atau secara eksplisit

13392914970384089616967895168962602841770234460440231501234736723328784159136966979592516521814270581662903357791625539571324435618053333498444654631269141250284088221909534717492397543057152353603090337012149759082408143603558512232742912453092885969482645766144

Sebagai contoh, 6153501akan dikodekan sebagai

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

Berikut ini adalah program pengujian yang mencetak bilangan bulat yang disandikan, dan kemudian mencetak panjangnya, dan kemudian mengeksekusinya segera untuk menunjukkan validitasnya (ini menghindari kesulitan untuk menyalin karakter yang tidak diinginkan ke dalam program baru, yang tidak selalu berfungsi dengan penerjemah online).

Martin Ender
sumber
8

Perl, 10 216

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

Juga basis 100 encoding, sedikit lebih elegan. Output untuk 12345678menjadi:

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

Pembatas {dan }sesuai dengan nilai hex b7dan d7masing - masing, yang tidak dapat muncul dalam input, dan karena itu tidak perlu diloloskan.

Ada 20 byte overhead, meninggalkan 108 untuk encoding, mencapai nilai maksimum 10 216 -1.


Perl, 10 206

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

Pengkodean basis 100 sederhana. Output untuk 12345678akan terlihat seperti ini:

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

Ada 25 byte overhead, meninggalkan 103 untuk encoding, mencapai nilai maksimum 10 206 -1.

primo
sumber
6

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

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

Jumlah terbesar adalah:

2621109035105672045109358354048170185329363187071886946329003212335230440027818091139599929524823562064749950789402494298278678348138409040

Cukup gunakan basis 36. Untuk input terbesar, output panjang 128-byte adalah:

(lambda()#36rzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz)
coredump
sumber
1

CJam, 233 114 ≈ 7.561⋅10 269

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

Program output "…"{iKms*}%233bmenerjemahkan karakter 8-bit string ke basis 233 digit dengan n ↦ ⌊ n ⋅ sin 20⌋ = ⌊ n ⋅ 0,913⌋. Transformasi ini kebetulan bersifat surjektif tanpa memerlukan codepoint kritis 34 (kutip ganda) dan 92 (backslash) sebagai input.

Anders Kaseorg
sumber