Колмогоров сложность струнного 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 отправляется в самое раннее опубликованное представление.