ตัวเลขใหญ่มาก


25

ในขณะที่พยายามเล่นกอล์ฟคำตอบของฉันหลายคำฉันจำเป็นต้องเขียนจำนวนเต็มจำนวนมากในตัวละครให้น้อยที่สุด

ตอนนี้ฉันรู้วิธีที่ดีที่สุดแล้ว: ฉันจะทำให้คุณเขียนโปรแกรมนี้

ความท้าทาย

  • เขียนโปรแกรมที่เมื่อได้รับจำนวนเต็มบวกเอาท์พุทโปรแกรมที่พิมพ์ไปยัง stdout หรือเทียบเท่า
  • โปรแกรมเอาต์พุตไม่จำเป็นต้องเป็นภาษาเดียวกันกับผู้สร้าง
  • ผลลัพธ์จะต้องมีขนาดไม่เกิน 128 ไบต์
  • คุณสามารถรับอินพุตจาก stdin หรือเทียบเท่า (ไม่ใช่ฟังก์ชั่นอินพุต)
  • คุณสามารถส่งออกผลลัพธ์ของโปรแกรมเป็น stdout หรือเทียบเท่า
  • จำนวนเอาต์พุตต้องเป็นทศนิยม (ฐาน 10)

เกณฑ์การให้คะแนน

คะแนนของคุณเท่ากับจำนวนเต็มบวกที่น้อยที่สุดที่โปรแกรมของคุณไม่สามารถเข้ารหัสได้

รายการที่มีคะแนนมากที่สุดชนะ


ฉันเพิ่มแท็ก metagolf เนื่องจากเรากำลังตีกอล์ฟโปรแกรมเอาท์พุท
orlp

1
@ orlp ฉันไม่ได้ตั้งใจเพราะmetagolfเป็นแท็กเกณฑ์การให้คะแนนซึ่งระบุว่า "คะแนนคือความยาวของผลลัพธ์ของคุณ" ฉันกำลังพิจารณาที่จะเพิ่มเมตาโพสต์เกี่ยวกับเรื่องนั้นแม้ว่าจะอนุญาตการเรียงลำดับของการให้คะแนนแบบผกผันเช่นกัน (ซึ่งเป็นกรณีสำหรับโค้ดที่เร็วที่สุด )
Martin Ender

1
@ MartinBüttnerฉันเดาว่าเราต้องการmeta-
limited

2
วิธีเป็นความท้าทายที่แตกต่างจาก"ภาษาที่มีช่วงจำนวนเต็มใหญ่ที่สุด" ?
nwp

5
@nwp ฉันคิดว่าคุณเข้าใจผิดคำถาม คำถามเกี่ยวกับการบีบอัด มันจะมีประโยชน์ แต่ไม่จำเป็นต้องใช้ภาษาที่มีช่วงจำนวนเต็มขนาดใหญ่
มันฝรั่ง

คำตอบ:


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)

ปรากฎว่าทุกจำนวนเต็มจาก 1,023 ถึง (163 122 - 1) · 255/162 สามารถแสดงอย่างน้อยหนึ่งวิธีโดยการแปลงฐานb ≤ 163 จากสตริงสูงสุด 122 ตัวอักษรด้วยรหัส 93 ถึงb + 92 แทนที่จะเป็น 0 ถึงbโดยทั่วไป- นี่เป็นการหลีกเลี่ยงอักขระที่มีปัญหา 34 (เครื่องหมายคำพูดคู่) และ 92 (เครื่องหมายแบ็กสแลช) โดยไม่ต้องมีรหัสผลลัพธ์เพิ่มเติม


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

ต้องใช้ไวยากรณ์ Python เล็กน้อยเพราะ Pyth printไม่สามารถพิมพ์iso-8859-1ได้

จำนวนที่ได้รับการเข้ารหัสในฐาน 252 และเป็นตัวแทนของแต่ละหลักในฐานนั้นเป็น iso-8859-1 ถ่าน ตัวอักษร\และ"จะต้องหลบหนีและดังนั้นจึงไม่ได้ใช้ ตัวถ่าน`ไม่ได้ถูกใช้เพราะการเล่นกอล์ฟ ... และนอกจากนี้ยังไม่ได้ใช้ null-byte คอมไพเลอร์ Pyth ห้ามมัน

ผลลัพธ์เป็นโปรแกรมที่มีค่าใช้จ่าย 17 ไบต์:

ixL-rC1`H``N""252

นี่คือตัวอย่างการใช้งานที่มีจำนวนมากที่สุดเท่าที่จะเป็นไปได้:

การใช้

คำอธิบาย

ของโปรแกรมผลลัพธ์

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
โปรแกรมนี้ไม่สามารถเข้ารหัส12ได้เนื่องจาก Pyth อ่าน CR เป็น LFอย่างน่าเสียดาย
Anders Kaseorg

10

CJam, 254 109 ≈ 1.34 x 10 262

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

ฉันเข้ารหัสหมายเลขในฐาน 254 และเป็นตัวแทนของแต่ละหลักในฐานที่เป็น ISO 8859-1 ตัวละครข้ามและ" \เอาท์พุทมีค่าใช้จ่าย 19 ไบต์""{_'[>-_'!>-}%254bดังนั้นฉันสามารถเป็นตัวแทนทุกอย่างน้อยกว่า 254 128-19หรืออย่างชัดเจน

13392914970384089616967895168962602841770234460440231501234736723328784159136966979592516521814270581662903357791625539571324435618053333498444654631269141250284088221909534717492397543057152353603090337012149759082408143603558512232742912453092885969482645766144

ตัวอย่างเช่น6153501จะถูกเข้ารหัสเป็น

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

นี่คือโปรแกรมทดสอบที่พิมพ์จำนวนเต็มที่เข้ารหัสแล้วพิมพ์ความยาวของมันแล้วรันมันทันทีเพื่อแสดงความถูกต้อง (สิ่งนี้หลีกเลี่ยงปัญหาในการคัดลอกอักขระที่ไม่สามารถพิมพ์ลงในโปรแกรมใหม่ซึ่งไม่ได้ผลเสมอไป กับล่ามออนไลน์)


8

Perl, 10 216

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

นอกจากนี้การเข้ารหัสฐาน 100, สง่างามเล็กน้อย ผลลัพธ์สำหรับ12345678:

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

delimeter {และ}สอดคล้องกับค่า hex b7และd7ตามลำดับซึ่งไม่สามารถปรากฏในอินพุตและดังนั้นจึงไม่จำเป็นต้องหลบหนี

มีโอเวอร์เฮด 20 ไบต์เหลือ 108 สำหรับการเข้ารหัสถึงค่าสูงสุด 10 216 -1


Perl, 10 206

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

การเข้ารหัสพื้นฐานอย่างง่าย 100 ผลลัพธ์สำหรับ12345678จะมีลักษณะเช่นนี้:

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

มีโอเวอร์เฮด 25 ไบต์เหลือ 103 สำหรับการเข้ารหัสถึงค่าสูงสุด 10 206 -1


6

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

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

จำนวนมากที่สุดคือ:

2621109035105672045109358354048170185329363187071886946329003212335230440027818091139599929524823562064749950789402494298276879873503833622348138409040138018400021944463278473215

เพียงใช้ฐาน 36 สำหรับอินพุตที่ใหญ่ที่สุดเอาต์พุตยาว 128- ไบต์คือ:

(lambda()#36rzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz)

1

CJam, 233 114 ≈7.561⋅10 269

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

โปรแกรมเอาต์พุตจะ"…"{iKms*}%233bถอดรหัสอักขระ 8 บิตของสตริงไปยังฐาน 233 หลักด้วยn ↦⌊ n ⋅ sin 20⌋ = ⌊ n ⋅0.913⌋ การแปลงนี้จะเกิดขึ้นโดยไม่จำเป็นโดยไม่ต้องใช้รหัสที่สำคัญ 34 (เครื่องหมายคำพูดคู่) และ 92 (แบ็กสแลช) เป็นอินพุต

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.