Kolmogorov Complexity Solver 작성


16

문자열 SKolmogorov 복잡도 는 일부 프로그래밍 언어 L 로 작성된 가장 짧은 프로그램 P 의 길이이며 출력은 정확히 S 입니다. (예, 실제 정의는 좀 더 형식적이지만 도전에 충분합니다.)

이 문제에서 당신의 임무는 가능한 가장 짧은 "콜 모고 로프의 복잡성 해결사", 작성된 프로그램 작성하는 것입니다 L 문자열에 소요 자체 S 및 반품 짧은 P 로 작성 L 출력이 S를 .

이것에 대한 순진한 접근법은 모든 길이 1 프로그램, 모든 길이 2 프로그램, 모든 길이 3 프로그램 등을 반복하여 각 프로그램을 실행하고 S 를 출력하는 프로그램 이 발견 될 때까지 출력을 측정하는 것 입니다. 이 방법의 문제점은 이러한 프로그램 중 일부가 실행을 멈추지 않을 수 있다는 것입니다. 이는 솔버 자체가 절대 멈추지 않을 수 있음을 의미합니다. 중지 문제 로 인해 멈추지 않는 프로그램을 피할 확실한 방법은 없습니다.

간단하지만 불완전한 해결책은 각 잠재적 P 의 실행 시간에 시간 제한을 두는 것 입니다. 시간이 멈추지 않는 프로그램은 통과 될 수 있지만 솔버는 확실히 중지됩니다 ( L 의 프로그램 이 실제로 시간 제한 내에 S를 출력 할 수 있다고 가정 ).

도전

솔버를 다음 세 가지를 수행하는 프로그램 또는 함수로 작성하십시오.

  • 문자열은 S .
  • 초 단위의 시간 제한 또는 더 작은 시간 범위 (예 : 밀리 초) 인 양의 정수 T
  • 잠재적 P 에 사용할 문자 알파벳의 문자열 A 입니다 .

A의 문자 만 포함하고 T 시간 단위 미만으로 실행되며 S를 출력하는 가장 짧은 P 를 출력합니다 .

이것은 일반적인 의사 코드입니다.

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

세부

  • S 를 출력하는 시간 T 에서 실행되는 A 의 문자로 만든 P 가 항상 있다고 가정 할 수 있습니다 .
  • 잠재적 인 P 의 실행이 솔버의 할당 된 메모리를 엉망으로 만드는 것처럼 솔버가 올바르게 실행되거나 작동하지 못하게하는 부작용이 없다고 가정 할 수 있습니다 .
  • 잠재적 인 P 에 오류 가 없다고 가정 할 수 없습니다 . 실행 호출과 관련하여 / 블록 또는 해당되는 것을 포함해야합니다 .trycatch
  • 여러 개의 가장 짧은 P 가 있으면 충분합니다. "짧음"은 바이트가 아닌 문자로 측정됩니다.
  • 잠재적 인 P 의 출력은 표준 출력 (또는 귀하의 언어의 일반적인 출력 영역)에 인쇄되는 것입니다. 빈 문자열은 잠재적 인 P 입니다.
  • 이상적으로 솔버는 A 에 모든 문자를 포함 할 수 있습니다. 최소 필수가 포함 할 수있는 인쇄 가능한 ASCII 문자와 탭과 줄 바꿈.
  • 파일 / stdin / 명령 줄 / 함수 인수에서 입력이 올 수 있습니다. 출력은 stdout 또는 이와 유사하거나 함수를 작성한 경우 문자열로 리턴 될 수 있습니다.

채점

가장 적은 바이트를 가진 제출이 이깁니다. Tiebreaker는 가장 빠른 게시 제출에갑니다.


7
뇌가 아파요.
Alex A.

1
메타 솔버가 작성되는 대상 언어와 언어가 동일해야한다는 요구 사항을 완화 할 수 있습니까?
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

그리고 출력을 언어의 문자열 리터럴 표현으로 변환하는 프로그램을 작성하는 것이 불가능할까요?
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ 아니요, 요점은 같은 언어로하는 것입니다. 예, 그러나 이것이 가장 짧은 프로그램은 아닙니다.
Calvin 's Hobbies

@ Calvin'sHobbies : 결국, 언어 자체를 컴파일하기 위해 어떤 언어가 시설을 호출하기 위해 코드를 쉽게 작성할 수 있는지 (또는 부재가있는 경우 컴파일러를 구현할 수있는) 언어를 찾는 것은 코드 골프 문제 일 뿐입니 까?
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

답변:


11

파이썬 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_outputPython 3 에서만 추가 되었으므로 Python 2가 아닌 이것을 사용합니다.

다음 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'

반환 값은 string 'print(1)'입니다.

마지막으로, 재미를 위해 알파벳이 string.printable이면

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

유효한 모든 0-2 char Python 3 프로그램의 Pastebin 링크

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.