Напишіть розв'язувач складності Колмогорова


16

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


7
Мій мозок болить.
Алекс А.

1
Чи можете ви послабити вимогу, що мова та мова, на якій написано метарозв’язувач, повинні бути однаковими?
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

І чи не вдалося б просто написати програму, яка перетворює вихідний сигнал у рядкове буквальне представлення мови?
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ Ні, сенс це робити на тій же мові. Так, але це не завжди була б найкоротшою програмою.
Захоплення Кальвіна

@ Calvin'sHobbies: Отже, врешті-решт, це лише виклик коду для гольфу, щоб дізнатися, на якій мові можна легко написати код для виклику засобів (або впровадити компілятор там, де він відсутній) для складання самої мови?
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

Відповіді:


11

Python 3, 240 236 байт

import subprocess as s,itertools as i
def f(S,T,A,N=0):
 while 1:
  for P in i.product(A,repeat=N):
   try:
    P="".join(P);open("a","w").write(P)
    if s.check_output(["py","-3","a"],timeout=T).decode()==S:return P
   except:1
  N+=1

Не запускайте це. Принаймні, на моєму комп’ютері мені було важко зупинити програму, коли вона почала працювати через спливаючі вікна, створені за один процес.

timeouts були додані лише subprocess.check_outputв Python 3, тому ми використовуємо це, а не Python 2.

Ось альтернативна версія з a, time.sleepяка також друкує всі дійсні програми, знайдені попутно, а також їх відповідний вихід:

import subprocess as s,itertools as i
import time
def f(S,T,A,N=0):
 while 1:
  for P in i.product(A,repeat=N):
   time.sleep(0.2)
   try:
    P="".join(P);open("a","w").write(P);C=s.check_output(["py","-3","a"],timeout=T).decode()
    print(P,repr(C))
    if C==S:return P
   except:1
  N+=1

Програма використовує ім'я файлу aдля кожної програми, Pщо перевіряється, тому, якщо запустити це, переконайтеся, що у вас вже немає файлу з цим іменем. Замініть ["py","-3","a"]відповідну команду для вашої установки (наприклад, ["python","a"]або ["python3","a"]).

Не соромтеся змінювати sleepтривалість на власний ризик :). Дзвінок як f("1\r\n",1,"1()print"), де час Tочікування в секундах.

Перші кілька рядків виходу з тестера з вищевказаним викликом:

 ''
1 ''
11 ''
() ''
111 ''
(1) ''
int ''
1111 ''

(Якщо ви хочете трохи допомогти програмі, ви можете змінити P="".join(P)її P="print"+"".join(P))

Оскільки всі вищеперелічені програми не мають результату, ось результат для f("1\r\n",1,["print","(",")","1"])(жетони не є складною задачею, але я хотів показати, що відбувається):

 ''
print ''
1 ''
() ''
11 ''
print() '\r\n'
(print) ''
(1) ''
111 ''
print(print) '<built-in function print>\r\n'
print(1) '1\r\n'

Повертається значення - рядок 'print(1)'.

Нарешті, просто для розваги, ось що відбувається, якщо алфавіт є string.printable, тобто

0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~ \t\n\r\x0b\x0c

Вставити посилання всіх дійсних програм 0-2 char Python 3

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.