Написать Колмогоровский Сложность Солвер

16

Колмогоров сложность струнного 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 / catchblocks или что-либо другое, применимое к вызову выполнения.
  • Если есть несколько кратчайших P , то любой будет достаточно. «Краткость» измеряется символами, а не байтами.
  • Вывод потенциальных P - это то, что выводится на стандартный вывод (или обычную область вывода вашего языка). Пустая строка является потенциальным P .
  • В идеале ваш решатель позволит A содержать любые символы. Необходимо , по крайней мере , чтобы иметь возможность содержать печатаемые ASCII символы , а также вкладки и новой строки.
  • Входные данные могут поступать из файла / стандартного ввода / командной строки / функции args. Вывод идет в стандартный вывод или аналогичный, или может быть возвращен в виде строки, если вы написали функцию.

счет

Представление с наименьшим количеством байтов выигрывает. Tiebreaker отправляется в самое раннее опубликованное представление.

Кальвин Хобби
источник
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-символьные программы Python 3

Sp3000
источник