Колмогоров сложность струнного S является длина самой короткой программы P , написанный на некотором языке программирования L , выход которого в точности S .
(Да, настоящее определение более формально, но этого будет достаточно для решения проблемы.)
Ваша задача в этой проблеме заключается в написании кратчайшей «Колмогоров сложности решатель», то есть, программа , написанной в L самого , которая принимает в струнном S и возвращает кратчайшее P записаны в L , что выходы S .
Наивный подход к этому состоит в том, чтобы выполнить итерации по всем программам длины 1, затем всем программам длины 2, затем всем программам длины 3 и т. Д., Запустив каждую из них и измеряя выходной сигнал, пока не будет найдена программа, которая выводит S. Проблема этого подхода заключается в том, что некоторые из этих программ могут никогда не перестать работать, а это означает, что сам решатель может никогда не остановиться. И из-за проблемы остановки нет верного способа избежать программ, которые не останавливаются.
Простой, хотя несовершенно решение поставить ограничение по времени на время выполнения каждого из потенциального Р «с. Программы, которые не останавливаются во времени, могут быть пропущены, но решатель определенно остановится (при условии, что программа на L действительно может вывести S в течение определенного времени).
Вызов
Напишите свой решатель в виде программы или функции, которая включает три вещи:
- Строка S .
- Целое положительное число T - ограничение по времени в секундах или некоторый меньший промежуток времени (например, миллисекунды).
- Строка алфавита символов , чтобы использовать для потенциального Р «с.
И выводит самый короткий P, который содержит только символы в A , работает меньше, чем T единиц времени, а выходы S .
Это общий псевдокод:
Function KolmogorovComplexitySolver(S, T, A):
Assign N to 0
Loop until function returns:
In any order, iterate over all strings of length N that only contain characters from *A*. Call the current string P:
Execute P, saving the output to O, stopping the execution if it takes longer than time T
If (P did not throw any errors) and (P did not timeout) and (O and S are identical):
Return P
Add 1 to N
Детали
- Вы можете предположить, что всегда будет P, сделанный из символов в A, который работает во время T, которое выводит S .
- Вы можете предположить, что выполнение потенциального P не будет иметь побочных эффектов, которые мешают солверу работать или работать правильно (например, возиться с выделенной памятью солвера).
- Вы не можете предполагать, что потенциальные P не содержат ошибок. Не забудьте включить
try
/catch
blocks или что-либо другое, применимое к вызову выполнения. - Если есть несколько кратчайших P , то любой будет достаточно. «Краткость» измеряется символами, а не байтами.
- Вывод потенциальных P - это то, что выводится на стандартный вывод (или обычную область вывода вашего языка). Пустая строка является потенциальным P .
- В идеале ваш решатель позволит A содержать любые символы. Необходимо , по крайней мере , чтобы иметь возможность содержать печатаемые ASCII символы , а также вкладки и новой строки.
- Входные данные могут поступать из файла / стандартного ввода / командной строки / функции args. Вывод идет в стандартный вывод или аналогичный, или может быть возвращен в виде строки, если вы написали функцию.
счет
Представление с наименьшим количеством байтов выигрывает. Tiebreaker отправляется в самое раннее опубликованное представление.
источник
Ответы:
Python 3,
240236 байтНе запускай это. На моем компьютере, по крайней мере, я обнаружил, что действительно трудно остановить программу после запуска из-за всплывающих окон, создаваемых для каждого процесса.
timeout
s были добавлены толькоsubprocess.check_output
в Python 3, поэтому мы используем это, а не Python 2.Вот альтернативная версия с a,
time.sleep
которая также печатает все действительные программы, найденные в пути, и их соответствующие выходные данные:Программа использует имя файла
a
для каждойP
тестируемой программы, поэтому, если вы запустите это, убедитесь, что у вас еще нет файла с таким именем. Замените["py","-3","a"]
на соответствующую команду для вашей настройки (например,["python","a"]
или["python3","a"]
).Не стесняйтесь менять
sleep
продолжительность на свой страх и риск :). Звоните какf("1\r\n",1,"1()print")
, гдеT
тайм-аут в секундах.Первые несколько строк вывода из тестера с вышеуказанным вызовом:
(Если вы хотите немного помочь программе, вы можете перейти
P="".join(P)
наP="print"+"".join(P)
)Поскольку все вышеперечисленные программы не имеют выходных данных, вот результат для
f("1\r\n",1,["print","(",")","1"])
(токены не являются частью задачи, но я хотел показать, что происходит):Возвращаемым значением является строка
'print(1)'
.Наконец, просто для удовольствия, вот что происходит, если алфавит
string.printable
, т.е.Вставьте ссылку на все действительные 0-2-символьные программы Python 3
источник