Số lớn


25

Trong khi cố gắng đánh gôn một số câu trả lời của mình, tôi cần phải viết các số nguyên lớn bằng càng ít ký tự càng tốt.

Bây giờ tôi biết cách tốt nhất để làm điều đó: Tôi sẽ khiến bạn viết chương trình này.

Các thách thức

  • Viết chương trình khi được cung cấp một số nguyên dương, xuất ra một chương trình in ra thiết bị xuất chuẩn hoặc tương đương.
  • Các chương trình đầu ra không phải cùng ngôn ngữ với người tạo.
  • Đầu ra phải có tối đa 128 byte.
  • Bạn có thể chấp nhận đầu vào từ stdin hoặc tương đương (không phải đầu vào chức năng)
  • Bạn có thể xuất chương trình kết quả thành thiết bị xuất chuẩn hoặc tương đương.
  • Đầu ra số phải ở dạng thập phân (cơ sở 10)

Chấm điểm

Điểm của bạn bằng số nguyên dương nhỏ nhất mà chương trình của bạn không thể mã hóa.

Các mục có số điểm lớn nhất sẽ thắng.


Tôi đã thêm thẻ metagolf, vì chúng tôi đang chơi chương trình đầu ra.
orlp

1
@orlp Tôi thực sự đã bỏ qua nó vì mục đích, vì metagolf là một thẻ tiêu chí chấm điểm có nội dung "điểm số là độ dài đầu ra của bạn". Tôi đang xem xét thêm một bài đăng meta về điều đó mặc dù cũng cho phép sắp xếp điểm nghịch đảo ( ví dụ như trường hợp mã nhanh nhất ).
Martin Ender

1
@ MartinBüttner Tôi đoán rằng chúng tôi cần nguồn siêu hạn chế :)
orlp

2
Thử thách khác với "ngôn ngữ nào có phạm vi số nguyên lớn nhất" ?
nwp

5
@nwp Tôi nghĩ bạn hiểu nhầm câu hỏi. Câu hỏi là về nén. Nó sẽ hữu ích, nhưng không cần thiết phải sử dụng một ngôn ngữ có phạm vi số nguyên lớn.
khoai tây

Câu trả lời:


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)

Nó chỉ ra rằng mọi số nguyên từ 1023 đến (163 122 - 1) · 255/162 có thể được biểu diễn theo ít nhất một cách bởi một chuyển đổi b ≤ 163 cơ bản từ một chuỗi gồm tối đa 122 ký tự có mã 93 đến b + 92, thay vì 0 đến b thông thường - Điều này tránh các ký tự rắc rối 34 (trích dẫn kép) và 92 (dấu gạch chéo ngược) mà không có bất kỳ mã đầu ra bổ sung nào.


12

Bình thường, 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'))$

Phải sử dụng một chút cú pháp Python, vì Pyth printkhông thể in iso-8859-1.

Số được mã hóa trong cơ sở 252 và đại diện cho mỗi chữ số trong cơ sở đó dưới dạng một iso-8859-1 char. Các ký tự \"sẽ cần thoát, và do đó không được sử dụng. Char `không được sử dụng vì chơi gôn ... Và ngoài ra, byte null cũng không được sử dụng, trình biên dịch Pyth cấm nó.

Đầu ra là một chương trình có tổng phí là 17 byte:

ixL-rC1`H``N""252

Đây là một ví dụ sử dụng với số lượng lớn nhất có thể:

Sử dụng

Giải trình

của chương trình đầu ra.

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
Chương trình này không mã hóa được 12, vì Pyth không may đọc CR là LF .
Anders Kaseorg

10

CJam, 254 109 1,34 x 10 262

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

Tôi đang mã hóa số trong cơ sở 254 và biểu thị mỗi chữ số trong cơ sở đó dưới dạng ký tự ISO 8859-1, bỏ qua "\. Đầu ra có tổng phí là 19 byte ""{_'[>-_'!>-}%254b, vì vậy tôi có thể biểu diễn mọi thứ nhỏ hơn 254 128-19 hoặc rõ ràng

13392914970384089616967895168962602841770234460440231501234736723328784159136966979592516521814270581662903357791625539571324435618053333498444654631269141250284088221909534717492397543057152353603090337012149759082408143603558512232742912453092885969482645766144

Ví dụ, 6153501sẽ được mã hóa thành

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

Đây là một chương trình thử nghiệm in số nguyên được mã hóa, sau đó in độ dài của nó và sau đó thực thi nó ngay lập tức để hiển thị tính hợp lệ của nó (điều này tránh được sự cố khi phải sao chép các ký tự không thể in vào một chương trình mới, không phải lúc nào cũng hoạt động với phiên dịch trực tuyến).


8

Perl, 10 216

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

Cũng cơ sở mã hóa 100, thanh lịch hơn một chút. Đầu ra cho 12345678sẽ là:

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

Các delimeters {}tương ứng với giá trị hex b7d7tương ứng, mà không thể xuất hiện trong đầu vào, và do đó không cần phải được thoát.

Có 20 byte phí, để lại 108 cho mã hóa, đạt giá trị tối đa là 10 216 -1.


Perl, 10 206

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

Mã hóa cơ sở 100 đơn giản. Đầu ra cho 12345678sẽ trông như thế này:

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

Có 25 byte phí, để lại 103 cho mã hóa, đạt giá trị tối đa là 10 206 -1.


6

Lisp thường gặp, 36 114 - 1 ~ 2,62 × 10 117

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

Số lượng lớn nhất là:

262110903510567204510935335404817018532936318707188694632900321233523044002781809113959992952482356206474995078940249429827687987350383362234813840904013801484747

Chỉ cần sử dụng cơ sở 36. Đối với đầu vào lớn nhất, đầu ra dài 128 byte là:

(lambda()#36rzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz)

1

CJam, 233 114 7.561⋅10 269

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

Chương trình đầu ra "…"{iKms*}%233bgiải mã các ký tự 8 bit của chuỗi thành cơ sở 233 chữ số với nn sin 20⌋ = ⌊ n 0,913⌋. Chuyển đổi này xảy ra là siêu thực mà không yêu cầu các mã số quan trọng 34 (trích dẫn kép) và 92 (dấu gạch chéo ngược) làm đầu vào.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.