문자열 S 의 Kolmogorov 복잡도 는 일부 프로그래밍 언어 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 에 오류 가 없다고 가정 할 수 없습니다 . 실행 호출과 관련하여 / 블록 또는 해당되는 것을 포함해야합니다 .
try
catch
- 여러 개의 가장 짧은 P 가 있으면 충분합니다. "짧음"은 바이트가 아닌 문자로 측정됩니다.
- 잠재적 인 P 의 출력은 표준 출력 (또는 귀하의 언어의 일반적인 출력 영역)에 인쇄되는 것입니다. 빈 문자열은 잠재적 인 P 입니다.
- 이상적으로 솔버는 A 에 모든 문자를 포함 할 수 있습니다. 최소 필수가 포함 할 수있는 인쇄 가능한 ASCII 문자와 탭과 줄 바꿈.
- 파일 / stdin / 명령 줄 / 함수 인수에서 입력이 올 수 있습니다. 출력은 stdout 또는 이와 유사하거나 함수를 작성한 경우 문자열로 리턴 될 수 있습니다.
채점
가장 적은 바이트를 가진 제출이 이깁니다. Tiebreaker는 가장 빠른 게시 제출에갑니다.