Большие большие числа

25

Пытаясь сыграть несколько моих ответов в гольфе, мне нужно было написать большие целые числа, используя как можно меньше символов.

Теперь я знаю лучший способ сделать это: я заставлю тебя писать эту программу.

Соревнование

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

счет

Ваша оценка равна наименьшему положительному целому числу, которое ваша программа не может закодировать.

Запись с наибольшим счетом выигрывает.

синий
источник
Я добавил тэг metagolf, так как мы играем в гольф в программе вывода.
orlp
1
@ orlp Я фактически пропустил это нарочно, потому что метагольф - это тег критерия оценки, который говорит: «Счет - это длина вашего вывода». Я рассматриваю возможность добавления мета-поста об этом, хотя и для того, чтобы разрешить сортировку по обратному принципу (например, в случае самого быстрого кода ).
Мартин Эндер
1
@ MartinBüttner Я думаю, нам нужен мета-ограниченный источник :)
orlp
2
Чем отличается задача от «у какого языка самый большой диапазон целых чисел» ?
ЧПП
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)

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

Андерс Касеорг
источник
12

Пиф, 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. Символы \и "должны были бы убежать, и поэтому не используются. Символ `не используется, потому что игра в гольф ... И кроме того, нулевой байт также не используется, компилятор 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
Jakube
источник
1
Эта программа не может кодировать 12, потому что Pyth, к сожалению, читает CR как LF .
Андерс Касеорг
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‡}

Делиметры {и }соответствуют шестнадцатеричным значениям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)
CoreDump
источник
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 (обратная косая черта).

Андерс Касеорг
источник