Колмогорова сложность струнного х определяется как длина кратчайшей программы P , который выводит с. Если длина P короче, чем длина s, то s называется сжимаемым , иначе s несжимаемым . Большинство строк несжимаемы ...
Напишите самую короткую программу, которая выводит эту строку (без пробелов и без перевода строки):
d9 a6 b6 33 56 a7 95 4b 29 b0 ac 7f 2a aa 6d 19 b8 4b 4c f8 b6 2a ac 95
a1 4b 4e a5 9d b3 e7 c9 4c 49 59 ec 94 b3 aa 6c 93 8f 11 5a 4d 39 75 82
ec ea 24 cc d3 2d c3 93 38 4e b7 a6 0d d2 b5 37 23 54 ad 1b 79 aa 6e 49
55 52 94 5a a7 3a 6a e9 e4 52 cd 2d 79 ad c6 12 b5 99 5b b4 76 51 17 4e
94 f3 9a a2 e7 15 6a 55 14 4d 4e 4a a3 5c 2f ab 63 cc b5 a6 a4 92 96 8a
2e c3 d8 88 9b 8c a9 16 f5 33 22 5b a2 e2 cc 1b 27 d4 e8 db 17 a4 39 85
ca aa 5b 4f 36 24 d3 c6 f6 94 ad d7 0f 71 24 e1 b1 c5 ef 65 35 6c 8d d7
1a 87 1e 25 df 5d c0 13 b2 6f 5a 57 28 98 bd 41 66 04 ed a2 52 c9 ac 83
b3 6c 56 7e d1 c6 cc 53 4a 62 c5 59 a9 b2 d4 af 22 a5 a9 f4 b2 99 23 32
f8 fb ae 48 6a 8a 9a b5 46 7a 36 59 9f 92 d3 25 b5 19 bd 8a 4a 49 62 a5
e4 59 fb e5 ba a2 35 dd a9 36 1d a9 c9 69 89 77 6a b2 34 2d 1d 22 61 c5
c2 66 1c e2 76 74 52 a5 d9 84 b9 8a a6 b5 14 ec 29 58 b2 bc 96 16 16 48
f5 c5 bd 2f 32 1b 3d 4f 4b 2e b2 6b 9a d9 32 a4 4b 5c bc 92 b7 b3 26 39
fa 42 2d 64 ed 1a 79 49 4c a3 b7 85 b2 a6 e2 8c d9 55 90 e1 a8 87 4b 60
a6 e1 ba c4 bb ec 32 39 76 90 a6 b4 c6 65 79 61 91 aa 3d 54 b7 18 3d 15
4b 06 db 30 8a 4d 4a a1 35 75 5d 3b d9 98 ac 55 5b 10 dd b3 e2 cc f1 5e
b3 2b 53 90 b6 ee 2b ac 8f 88 8d 95 5a 75 df 59 2d 1c 5a 4c e8 f4 ea 48
b9 56 de a0 92 91 a9 15 4c 55 d5 e9 3a 76 8e 04 ba e7 b2 aa e9 ab 2a d6
23 33 45 3d c4 e9 52 e3 6a 47 50 ba af e4 e5 91 a3 14 63 95 26 b3 8b 4c
bc aa 5a 92 7a ab ad a6 db 53 2e 97 06 6d ba 3a 66 49 4d 95 d7 65 c2 aa
c3 1a 92 93 3f ca c2 6c 2b 37 55 13 c9 88 4a 5c 62 6b a6 ae cc de 72 94
Вывод должен выглядеть так:
d9a6b63356a7954b29b0ac7f2aaa6d19b84b4cf8b62aac95a14b4e...7294
Примечание: ввод пользователя запрещен, ни веб-доступ, ни библиотеки (кроме той, которая требуется для печати вывода).
Правка I: последовательность кажется случайной ... но она оказывается очень сжимаемой, обрабатывая немного простых чисел ...
Редактировать II: Молодец! Я рассмотрю ответы в следующие часы, а затем назначу награду. Это моя идея о том, как это можно решить:
- Если вы попытаетесь сжать данные, вы не уйдете далеко ...
- В интернете вы можете найти (хорошо известную?) Онлайновую энциклопедию целочисленных последовательностей (OEIS);
- попытка первых шестнадцатеричных цифр
d9, a6, b6, 33, ...
(или их десятичного представления) не даст результата; - но если вы преобразуете числа в двоичные (
1,1,0,1,1,0,0,1,1,0,1,0,0,1,1,0
) и ищете их в OEIS, вы получите такой результат . - Как отметил Клавдиу, я также дал небольшую подсказку в этом вопросе (Изменить I выше) ... :-)
Победителем стал Питер Тейлор (GolfScript, 50), со специальным упоминанием Клаудиу (Python, 92), первым, кто «решил» это.
источник
Ответы:
GolfScript (50 байт)
Поскольку все остальные теперь раскрывают свой код, я также опущу запрос OP на необоснованность:
Обзор рассечения
38200,{:x,{)x\%!},,2=},
4/
p
кp&2 != 0
и сделать базу-2 в базовой 16 преобразования:{3\{2&!!1$++}/.57>39*+}%
(это где интересные приемы)+
Более подробное изучение базовой конверсии
Учитывая стек, содержащий пустую строку и список простых чисел, нам нужно сделать два преобразования:
Есть много одинаково длинных способов сделать 1; например
или даже
Для 2 очевидный подход
Но база - это длинное слово, и, поскольку 16 = 24, мы можем легко сохранить несколько символов с помощью
Теперь самая очевидная трата - 18 символов, посвященных этой последовательности. Нам просто нужна функция от цифры до кода ASCII. Мы хотим , чтобы отобразить
0
на'0' = 48
...,9
чтобы'9' = 57
,10
чтобы'a' = 97
...15
к'f' = 102
.Но теперь бросьте в смесь запрет
base
. Мы должны реализовать это сами. Очевидная реализация (в этом направлении, легкая) заключается в том, чтоk base
это складка{\k*+}*
. Немного больше альтернативой является простой итерации, который необходим базовый случай:0\{\k*+}/
. База 2 немного особенная:1$++
эквивалентна\2*+
той же длине, и я выбрал этот подход.Оба они длиннее, чем 5-символьные
2base
, но, поскольку теперь мы перебираем значения, мы можем потянуть в части 1 один цикл. Мы заменяемс
для хорошего сохранения 1 символа или
за потерю 1 символа
Но хотя эта потеря на 1 символ выглядит как шаг назад, рассмотрим, что происходит с этим 0. Он умножается на 16 и добавляется к выводу базового преобразования. И последнее, что мы делаем, это добавляем кратное число 16 к выводу. Таким образом, мы можем объединить два как
Совместный кратчайший и бонусный ум делает его более интересным.
источник
base
? Все другие решения используют эквивалент (мои используетhex
, C использует один, используетprintf("%x")
haskellshowHex
)base
дольше, чем этот, потому что большую часть оптимизации я выполнил, объяснив, что не могу его использовать.base
дает мне значение от 0 до 15, так что все еще нужно немного поработать, чтобы преобразовать в0-9a-f
. Я мог бы вернуться к использованиюbase
в какой-то момент, но не сегодня вечером.Python, 92 символа
Вот это дамы и господа, сам код!
Марцио оставил умный намек, сказав, что «это оказывается очень сжимаемым, обрабатывая немного простых чисел». Я был уверен, что «немного» не было выделено курсивом случайно, поэтому я преобразовал шестнадцатеричную строку в биты и попытался найти шаблоны. Я думал, что сначала он представлял все простые числа как биты и объединял их вместе, но это не сработало. Тогда, возможно, взяв всего несколько цифр или отбросив все нули в битовой строке - все равно нет. Может быть, это цепочка наименее значимого бита первых нескольких простых чисел? Не совсем. Но в конце концов я нашел тот, который сработал - это цепочка второго, наименее значимого бита из первых, однако, многих простых чисел.
Итак, мой код делает именно это: генерирует достаточно простых чисел, берет второй бит каждого (
i/2%2
), объединяет их в виде двоичной строки, затем преобразовывает ее в base-10 (int(..., 2)
) и затем в base-16 (hex(...)
).источник
Хаскелл, 105
Хэш SHA1:
a24bb0f4f8538c911eee59dfc2d459194ccb969c
Выход:
Редактировать: Код:
Я пропустил правило о том, что не следует использовать какие-либо библиотечные функции, кроме печати (putStr). Я бы предположил, что математические операторы, хотя они и являются технически функциональными, разрешены.
источник
C
136116109103 символовХорошо, вот мои усилия:
источник
printf
возвращает количество записанных символов, которое здесь всегда ненулевое, вы можете использовать!printf(...)
вместо того,printf(...)*0
чтобы сохранить один символ.JS, 764
если мы рассмотрим эту строку как base64, мы можем получить уменьшенную версию, используя версию un-base-64-ed:
Но я думаю, что автор хочет, чтобы мы нашли логику этой неслучайной строки.
источник
Mathetmatica - 56
Тайна уже разгадана, поэтому просто реализую идею
источник
J - 46 символов
Не обращайте на меня внимания, просто загляните сюда для игры в гольф. Не был достаточно умен, чтобы понять трюк.
Разъяснение:
p:i.1007 4
- Создайте 1007-строчную матрицу из 4 столбцов целых чисел от 0, затем возьмите простые числа, соответствующие этим целым числам. Да,p:
это J встроенный. Да, у нас четыре простых числа.2|<.-:
- Половину каждого числа (-:
), напольные ((<.
), и возьми это по модулю 2 (2|
). Это то же самое, что взять следующий бит в аренду.#.
- Конвертировать каждую строку результата из базы 2 в целое число. Это дает нам 1007 номеров от 0 до 15 включительно.'0123456789abcdef'{~#.
- Возьмите каждую строку этой матрицы битов в качестве двоичного для числа, и используйте это число, чтобы выбрать из списка шестнадцатеричных цифр. Это преобразует каждые четыре бита в гекс.1!:2&4
- У интерпретатора J есть проблема с выводом строк длиннее 256 символов, поэтому мы должны отправить эти данные напрямую в stdout. Вы выигрываете, вы проигрываете.4[
- Наконец, откажитесь от результата1!:2
и вместо этого выведите недостающие 4 из выходных данных. Мы делаем это, потому что это короче, чем включение последних четырех простых чисел и возвращение пустого результата здесь.источник
JS, 503
Следующая идея @xem:
источник
Математика, 55
Проверено на Mathematica 8. Для этого используются два наблюдения:
FromDigits
фактически не проверяет диапазон заданных цифр, поэтому, если вы примените его к списку формы,{2,0,2,2,0,...}
вы просто получите в два раза больший результат, чем при обращении{1,0,1,1,0,...}
. Но это именно та форма, которая получается путёмBitAnd
сложения простых чисел с 2.источник