Колмогоров складність струнного S є довжина найкоротшої програми P , написаний на деякій мові програмування L , вихід якого в точності S .
(Так, справжнє визначення є більш формальним, але цього буде достатньо для виклику.)
Ваше завдання в цій проблемі полягає в написанні найкоротшою «Колмогоров складності вирішувач», тобто, програма , написаної в L самого , яка приймає в струнному S і повертає найкоротший P записані в L , що виходи S .
Наївний підхід до цього полягає в перегляді всіх програм довжиною 1, потім по всій програмі довжиною 2, потім по всім програмам тривалості і так далі, запускаючи кожну з них і вимірюючи вихід, поки не буде знайдена програма, яка виводить S. Проблема такого підходу полягає в тому, що деякі з цих програм можуть ніколи не припиняти свою роботу, а значить, сам вирішувач може ніколи не зупинятися. І через проблему зупинки немає надійного способу уникнути програм, які не зупиняються.
Просте, хоча і недосконале рішення - поставити обмеження на час виконання кожного з потенційних P 's. Програми, які не зупиняються в часі, можуть бути передані, але вирішувач точно припиниться (якщо припустити, що програма в L дійсно може вивести S протягом визначеного терміну).
Виклик
Напишіть вирішувач як програму або функцію, яка займає три речі:
- Рядок S .
- Позитивне ціле число T - обмеження часу в секундах або деякий менший проміжок часу (наприклад, мілісекунд).
- Рядок A алфавіту символів, який слід використовувати для потенційних P 's.
І виводить найкоротшого 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 зроблені з символів А , що працює в час T , що виходи S .
- Ви можете припустити, що виконання потенційних P не матиме побічних ефектів, які не дозволять вирішувачу працювати або працювати належним чином (наприклад, возитися з виділеною пам'яттю розв'язувача).
- Ви можете не припускати, що потенційні P не містять помилок. Обов'язково включіть
try
/catch
блоки або будь-що інше, що стосується виклику виконання. - Якщо є кілька найкоротших P , то будь-яких буде достатньо. "Короткість" вимірюється символами, а не байтами.
- Вихід потенційних P '- це те, що друкується для stdout (або звичайна область виводу вашої мови). Порожній рядок є потенційним P .
- В ідеалі ваш вирішувач дозволить A містити будь-які символи. Необхідно , по крайней мере , щоб мати можливість утримувати друкуються ASCII символи , а також вкладки і нового рядка.
- Введення може надходити з файлів / stdin / командного рядка / аргументів функції. Вихід надходить у stdout або подібне, або його можна повернути як рядок, якщо ви написали функцію.
Оцінка балів
Виграє подання з найменшими байтами . Tiereaker переходить до найбільш ранніх публікацій.