Я имею в виду конкретное число, но это часть задачи, которую я выполняю, и я не хочу, чтобы люди делали (все) работу за меня.
Вот число, которое имеет те же цифры, но перемешано:
5713167915926167134578399473447223554460066674314639815391281352328315313091488448321843
8892917486601064146636679920143691047671721184150386045081532202458651561779976236919751
5521854951599379666116678853267398393892536121049731949764192014193648608210652358947001
6332620900065461061195026191178967128001712341637591690941978871368243245270800684616029
6679555942849366434586090627998161441134473428845367022486230724219981658438108844675033
4461550796750244527407413996606134735852639191026103378962082622204359677030054592798927
4145951979523473408718011778751084514127053772614511042703365596651912104541233491744530
87457854312602843967491787086250478422477028164189
Номер имеет 666 цифр (десятичное число). Поскольку я использую Python, целые числа (или технически длинные) автоматически становятся бигнумами.
Мне нужно использовать 255 символов, и мне нужно описать одно и то же число. Описание предназначено для запуска через eval () для получения исходного числа.
Какие стратегии мне следует изучить?
code-golf
kolmogorov-complexity
tips
python
compression
Кристиан Сонне
источник
источник
Ответы:
Базовая кодировка
Стандартный метод сжатия чисел состоит в том, чтобы выразить их в большой базе и кодировать цифры в виде символов. Например, если вы закодируете число в базе 256, оно будет иметь только 277 цифр:
Или выражается в виде строки
(Плюс некоторые непечатаемые символы, которые вырезаны в SE.)
Конечно, это все еще слишком долго для вашего 255 символов. Если вы на самом деле говорите о символах (в отличие от байтов), вы можете перейти в Unicode и использовать гораздо большую базу. Как насчет 2 16 ? Это всего 139 цифр:
(Я не могу включить настоящую строку здесь, потому что она содержит некоторые символы CJK, которые запрещены SE.)
Теперь это кажется более выполнимым. Вам просто нужно уметь декодировать его в 116 символов. Если вы не можете, Unicode имеет более 2 16 символов, так что вы можете попробовать использовать еще большую базу.
источник
Простые множители
Если у номера нет интересных функций, лучше всего использовать базовое кодирование. Следующее, что нужно сделать, это искать интересные особенности номера. Первое, что приходит на ум, - это то, что в нем могут быть факторы малых простых чисел (2,3,5,7 и т. Д.), Возведенные в довольно большие степени. Если вам больше нечего делать, продолжайте пытаться делить на небольшие простые числа и посмотреть, что получится. Если его факторы включают в себя
2**4
,3**4
и7**4
, вы можете написать,big number *42**4
что на несколько байт короче, чемbig number * 3111696
источник
n
простое число, вы можете сохранить цифру или около того для простого числа, сохранив его индекс вместо простого числа.Рекурсивное удаление самой большой площади
Этот подход многократно удаляет наибольшее квадратное число из N, пока не будет смысла продолжать.
Если вы проигнорируете символы «** 2 +», то в среднем это будет примерно такое же количество цифр, что и исходное число. Восполнение этих 4 дополнительных символов за итерацию требует немного удачи. В случае вашего числа, результат имеет 670 цифр квадратных чисел плюс 7x "** 2+", еще одна ошибка:
Благодаря тому, что этот алгоритм почти безубыточен в среднем, его можно использовать в сочетании с другими алгоритмами (или даже самими собой) для дальнейшего уменьшения чисел в выражении (за счет некоторых скобок). Эти другие алгоритмы могут быть более дорогими, так как они будут работать на значительно меньших количествах, чем оригинал. В данном примере можно получить чистый выигрыш, если более дорогой и эффективный алгоритм может вырезать 25% символов
33300095205899066129442737321270515378501483166974896029394675779096351509514355500527819871697116193238261137790928953798777695127752032484956608505929119246433389165
(второе большое значение в результате)источник
Рядом большие державы
Этот подход ищет [сравнительно] небольшие числа, возведенные в степень, близкую к целевому числу. В большинстве случаев восстановление N как A ** B + C не будет улучшением, но в некоторых случаях это будет.
10000
произвольная постоянная. Условие спасения также может быть основано на некоторой целиmindiff
.В случае вашего номера выборки N с 666 цифрами, эта функция (с немного увеличенным пределом в 10 тыс.) Обнаруживает, что
N ~= 165661162**81.0000000025
,N-165661162**81
как и число из 659 цифр, вырезаем 7 цифр из числа, которое нужно обработать, за 14 выражений. , отказ.источник