Иногда во время игры в гольф нужно представлять большое количество кода в своем коде. Запись их как есть может значительно увеличить количество байтов.
Какие общие 1 советы вы имеете для краткого представления длинных чисел в коде?
Пожалуйста, оставьте один совет за ответ.
1 Под общими я подразумеваю советы, которые могут быть применены к более чем одному языку. Советы по конкретным языкам публикуются в соответствующей ветке.
Ответы:
Ищите специальные номера
Некоторые языки имеют встроенные функции для квадратов, возведения в степень с основанием 2, n-го простого, факториального или других процедур, которые могут генерировать большие числа. Проверьте, попадает ли ваш номер в какую-либо из этих категорий.
И если это не так, может случиться так, что большее число, которое подходит для ваших целей и может быть использовано вместо.
источник
1.01e6
итераций достаточно,1e7
экономит 3 байта за счет времени выполнения.Используйте побитовые логические операторы
У некоторых языков есть побитовое И, ИЛИ, XOR, а иногда НЕТ.
Выражение определенного большого числа в виде побитовой комбинации результата возведения в степень или сдвига влево и другого числа может привести вас к именно тому числу, которое вам нужно. Обычно это того стоит, если цифры становятся достаточно большими.
Например,
2147483722
это 10 байтов, но2<<30^74
(2 ^ 31 бит-XORed с 74) только 8.источник
bc
). И XOR никогда не бывает более полезным, чем+
и-
: в этом случае xor и add дают одинаковый результат, но во всех случаях есть некоторое целое число, которое можно сложить или вычесть, чтобы получить тот же результат, что и xor с целым числом, и добавление не больше, а иногда и короче.1e9^2e9
.9<<49^7<<19
используя сложение вместо xor?1286561280
в JavaScript и Perl (и, возможно, в других языках), и это более короткое выражение для получения этого значения, чем эквивалентное использование+
или-
.Используйте строки для повторяющихся чисел
Для чисел, которые очень повторяются по своей природе, вы можете использовать строки и привести их к целому числу. Например, в JavaScript
источник
1e100/9
в этом случае.Используйте научную нотацию
Научная запись может сохранять байты в случае длинных чисел. Например:
источник
3564e-8
в этом случае?.00003564
, которое также на один байт короче снова.Ищите другой номер, чтобы использовать вместо
Это может звучать как отсутствие ответа, но не всегда очевидно, что большее число может быть вычислено с помощью более короткого кода. Пример, который я помню, это Вывод googol-копий строки , где очевидные ответы требуют вычисления 10 100 . Как выясняется, вычисление любого кратного 10 100 приводит к одинаково правильному, но в некоторых языках более короткому ответу. Ответ Денниса там использует 100 100 , мой собственный использует 250 255 .
источник
es
если вам просто нужно большое число, но вам не важно его значение (или оно всегда одинаковое)Базовое сжатие
Базовый декомпрессионный код может быть довольно сложным, но если у вас действительно огромное количество, иногда это может помочь сжать его в некоторой базе выше 10.
Также помогает то, что в некоторых языках базовый код сжатия очень прост. Например, PHP имеет
base64_decode(_)
, Python имеетint(_,36)
, JavaScript имеетparseInt(_,36)
, и многие языки гольфа имеют встроенные декомпрессионные встроенные функции. Например, в CJam:Это содержит непечатный. Попробуйте онлайн!
Это дает:
источник
Используйте экспоненциальные дроби для больших повторяющихся чисел
Допустим, вы хотите сгенерировать число, состоящее из 100 единиц. Вы могли бы использовать
int("1"*100)
,+"1".repeat(100)
и т.д. , но вы также можете воспользоваться тем , что это очень близко кЭто лучше всего подходит для очень повторяющихся чисел, например, из одной цифры. Пара повторяющихся цифр также работает довольно хорошо:
Изредка вы можете найти какой-то другой странный шаблон, который также может быть представлен довольно кратко в этом методе. Если вам это понадобилось
int("123456790"*11)
, например:Однако будьте осторожны: такие числа
int("1234567890"*10)
не имеют такого простого представления.источник
Используйте побитовый сдвиг влево для возведения в степень 2
Хотя существует много языков, которые поддерживают оператор для возведения в степень, некоторые этого не делают. А те, которые этого не делают, обычно требуют вызова функций (или методов класса / объекта), которые могут стоить несколько байтов.
Но вы можете сохранить несколько байтов, когда вам нужно поднять 2 до степени n , используя оператор Bitwise Left Shift
<<
as1<<n
. Обратите внимание, что это сохранит ваши байты только в том случае, если n больше или равно 17. Однако это всегда будет сохранять ваши байты, если n является динамическим. Несколько примеров:источник
8<<9 // 4096
чтобы мы могли получить до99<<61
6 байтов, что равняется6,917,529,027,641,081,856
экономии 13 байтов!Китайская теорема об остатках
Если часто появляются произвольные большие целые числа или если большое целочисленное представление в целевом языке программирования стоит слишком много байтов, вы можете использовать китайскую теорему об остатках.
Выберите несколько попарно относительно простых чисел m i > = 2, и вы можете выразить большое число от 0 до lcm (m 1 , m 2 , ..., m i ) -1
Например, я выбираю 2, 3, 5, 11, 79, 83, 89, 97, тогда я могу однозначно выразить число меньше 18680171730. 10000000000 (1e10) можно выразить как 0,1,0,1,38,59,50,49 (1e10 mod 2, 3 ..., 97), которые не нужно выражать как специальный класс / структуру Big Integer, которые могут сохранять несколько байтов в некотором языке программирования.
Сложение и вычитание могут быть сделаны непосредственно с использованием этого представления. Пример:
источник
Используйте String Padding (где это возможно)
Если большое число включает в себя повторяющуюся цифру в начале или конце, вы можете сохранить байты, используя один из методов заполнения вашего языка, чтобы создать строку нужного числа, которую затем можно преобразовать в целое число.
пример
Чтобы сгенерировать число
1111111111111111111111112
(25 байт) в JavaScript (ES8):источник
Используйте экспоненты
Если на вашем языке есть оператор экспоненты, вы можете использовать его для генерации, если не нужного вам числа, хотя бы числа, которое вы можете выполнить простым вычислением или 2, чтобы получить свой номер. Даже без оператора вы все равно сможете сохранять байты с помощью встроенной функции или метода.
пример
Максимально безопасное число в JavaScript является
9007199254740991
, длиной 16 цифр. В ES7 это можно рассчитать с помощью следующих 7 байтов:Эквивалент в ES6 и более ранних версиях, хотя и такой же длины, что и само целое число в этом случае, демонстрирует, что использование более подробного метода может не обязательно стоить вам байтов.
Выше, однако, может получиться короче, если, например, у вас уже есть
Math
указали псевдоним для одного символа в другом месте своего кода.источник
Используйте дроби на месте поплавка
Пример:
1./3
вместо0.333333333
источник