Код гольф всегда включает в себя некоторые ответы, которые более или менее нарушают правила, нарушая ограничения, которые претенденты считали само собой разумеющимся или просто не думали и не указывали в правилах. Одна из этих интересных лазеек - это возможность выводить больше, чем требует задача, чтобы получить лучший результат.
Принимая это к крайности, мы можем написать универсальный код решатель гольфа, который печатает желаемый результат - если вам все равно, что это может занять много лет и выводит много других вещей до и после него.
Все, что нам нужно для вывода, это последовательность, которая гарантированно содержит все возможные подпоследовательности. Для этого кода гольф это будет последовательность Эренфойхта-Мичельского :
Последовательность начинается с трех битов 010; каждая последующая цифра формируется путем нахождения самого длинного суффикса последовательности, который также появляется ранее в последовательности, и дополнения бита после самого последнего более раннего появления этого суффикса.
Каждая конечная подпоследовательность битов происходит непрерывно, бесконечно часто внутри последовательности
Первые несколько цифр последовательности:
010011010111000100001111 ... (последовательность A038219 в OEIS ).
Объединяя 8 битов последовательности в байт, мы получим вывод ASCII, который мы можем вывести на экран или в файл и который содержит все возможные конечные выходные данные . Программа будет выводить части пи, текст «Никогда не отдам тебя» , немного хорошего ASCII-арта, собственный исходный код и все остальное, что вы можете захотеть вывести.
Для проверки правильности, вот хэши для первых 256 байтов последовательности:
MD5: 5dc589a06e5ca0cd9280a364a456d7a4
SHA-1: 657722ceef206ad22881ceba370d32c0960e267f
Первые 8 байтов последовательности в шестнадцатеричной записи:
4D 71 0F 65 27 46 0B 7C
Правила:
Ваша программа должна вывести последовательность Ehrenfeucht-Mycielski (ничего больше), объединяющую 8 битов в символ байта / ASCII.
Самая короткая программа (количество символов) выигрывает. Вычтите 512 из вашего количества символов, если вам удастся сгенерировать последовательность за линейное время на сгенерированный байт .
Ответы:
C –110 символов
Эта версия программы использует алгоритм линейного времени выполнения для генерации последовательности. Вычитание 512 из 402 символов в программе дает в итоге 110 отрицательных.
В соответствии с проблемой, программа работает в бесконечном цикле, что требует большого выделения памяти, а использование
realloc()
для поддержания непрерывности последовательности может способствовать фрагментации кучи. Вы можете улучшить использование памяти программой, заменивcalloc(7,8)
в первой строке наcalloc(1,sizeof*v)
. Это особенно поможет на 32-битной машине, где 56, вероятно, слишком велик в два раза.Код является нечитаемым и не интересным способом; за что я прошу прощения. Честно говоря, даже версия без загадок не совсем понятна:
(Приведенный выше код, не основанный на гольфе, основан на коде, написанном Гжегожем Германом и Майклом Солтисом, как указано в описании проблемы, и на домашней странице Солтиса .)
Спасибо @schnaader и @res за сообщение об ошибке в начальной версии.
источник
malloc
модифицированные версии останавливают вывод после примерно 10000 байт и продолжают выделять память, чтоprog > out.dat
дает мгновенный сбой при использовании только ~ 700 КБ памяти. Если я вставлюprintf("\n%i\n", size);
послеrealloc
, самый большой вывод4
. Система: Windows 7 Prof. 64-разрядная, 4 ГБ оперативной памяти, GCC 4.6.1Рубин,
10910410194 персонажаРеализация в Ruby с использованием регулярных выражений для поиска суффиксов. Поскольку до выхода из памяти достаточно много времени, программа должна быть остановлена пользователем.
Изменить: я только заметил, что достаточно начать с последовательности
0
.Изменить 2: предложение res сохраняет 2 символа, некоторые другие, потому что нам не нужно вырезать ни одного байта раньше
pack
.источник
s=(s[/(.*).*\1/][/.#{$1}/]<?1??1:?0)+s
позволит сохранить еще два символа.?C
?Perl, 95 символов
Сначала у меня была довольно приличная версия этого. Затем, когда я играл в гольф, каждая версия становилась медленнее. Всё медленнее.
Первые три символа (
$|=
) не обязательны, строго говоря ... но без этого вам, как правило, придется ждать, пока скрипт завершит генерацию полных 4096 байт, прежде чем вы увидите какой-либо вывод. И это заняло бы часы. Может быть, веками; Я не уверен. Я упоминал, что производительность этой программы со временем ухудшается? Поэтому я чувствовал себя обязанным включить их в число.С другой стороны, у этого сценария есть одно из самых уродливых регулярных выражений, которые я когда-либо создавал, поэтому я думаю, что горжусь этим.
источник