Великі великі цифри


25

Поки я намагаюся переграти кілька моїх відповідей, мені потрібно було написати великі цілі числа якомога менше символів.

Тепер я знаю найкращий спосіб зробити це: я змушу вас написати цю програму.

Змагання

  • Напишіть програму, яка, отримавши додатне ціле число, виводить програму, яка виводить її в stdout або еквівалент.
  • Вихідні програми не повинні бути тією ж мовою, що і автор.
  • Вихід повинен бути не більше 128 байт.
  • Ви можете приймати вхід із stdin або аналогічного (не функціонального введення)
  • Ви можете вивести отриману програму в stdout або еквівалент.
  • Вихід числа повинен бути в десятковій частині (основа 10)

Оцінка балів

Ваш бал дорівнює найменшому додатному цілому числу, яке ваша програма не може кодувати.

Виграє запис з найбільшою кількістю балів.


Я додав метагольф тегів, оскільки ми займаємося програмою виведення.
orlp

1
@orlp Я насправді пропустив це навмисно , тому що метагольф - це критерій оцінки балів, який говорить, що "оцінка - це тривалість вашого результату". Я розглядаю можливість додавання мета-повідомлення про це, хоча і для того, щоб дозволити своєрідне зворотне оцінювання (що стосується, наприклад, найшвидшого коду ).
Мартін Ендер

1
@ MartinBüttner Я думаю, нам потрібен мета-обмежений джерело :)
orlp

2
Чим виклик відрізняється від "яка мова має найбільший цілий діапазон" ?
nwp

5
@nwp Я думаю, ви неправильно зрозуміли питання. Питання стосується стиснення. Було б корисно, але не обов’язково використовувати мову з великим цілим діапазоном.
картопля

Відповіді:


2

Пітон 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)

Виявляється, кожне ціле число від 1023 до (163 122 - 1) · 255/162 може бути представлене хоча б одним способом базою b ≤ 163 перетворенням з рядка щонайбільше 122 символів з кодами 93 до b + 92, замість звичайних від 0 до b - 1. Це дозволяє уникнути проблемних символів 34 (подвійна цитата) та 92 (зворотна косою рисою) без зайвого вихідного коду.


12

Піта, 252 111 ≈ 3,559 × 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. Знаки\ і "потребують втечі, тому не використовуються. Char `не використовується, оскільки гольф ... І крім того, нульовий байт також не використовується, компілятор 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

Перл, 10 216

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

Також базове 100 кодування, трохи більш елегантне. Вихід для 12345678:

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

Деліметри {і }відповідають шістнадцяткові значенняb7 і , d7відповідно, які не можуть з'явитися на вході, і тому не повинні бути екрановані.

Налічується 20 байтів, залишаючи 108 для кодування, досягаючи максимального значення 10 216 -1.


Перл, 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

Ліпп звичайний, 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 (зворотна косою рисою) в якості введення.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.