Die Kolmogorov-Komplexität eines Strings S ist die Länge des kürzesten Programms P , das in einer Programmiersprache L geschrieben ist und dessen Ausgabe genau S ist .
(Ja, die eigentliche Definition ist formeller, aber dies wird für die Herausforderung ausreichen.)
Ihre Aufgabe bei dieser Herausforderung besteht darin, den kürzestmöglichen "Kolmogorov-Komplexitätslöser" zu schreiben, dh ein in L selbst geschriebenes Programm , das eine Zeichenfolge S aufnimmt und das kürzeste in L geschriebene P zurückgibt , das S ausgibt .
Der naive Ansatz besteht darin, über alle Programme der Länge 1, dann alle Programme der Länge 2, dann alle Programme der Länge 3 usw. zu iterieren, jedes von ihnen auszuführen und die Ausgabe zu messen, bis ein Programm gefunden wird, das S ausgibt . Das Problem bei diesem Ansatz ist, dass einige dieser Programme möglicherweise nie aufhören zu laufen, was bedeutet, dass der Solver selbst möglicherweise nie aufhört. Und aufgrund des Halteproblems gibt es keinen sicheren Weg, Programme zu vermeiden, die nicht anhalten.
Eine einfache, wenn auch unvollständige Lösung besteht darin, die Ausführungszeit jedes der potenziellen Ps zeitlich zu begrenzen . Programme, die nicht rechtzeitig anhalten, werden möglicherweise übergangen, der Solver wird jedoch definitiv angehalten (vorausgesetzt, ein Programm in L kann tatsächlich S innerhalb des Zeitlimits ausgeben ).
Herausforderung
Schreiben Sie Ihren Solver als ein Programm oder eine Funktion, die drei Dinge beinhaltet:
- Der String S .
- Eine positive ganze Zahl T , die das Zeitlimit in Sekunden oder eine kleinere Zeitspanne (z. B. Millisekunden) darstellt.
- Eine Zeichenfolge A aus dem Alphabet der Zeichen, die für potenzielle Ps verwendet werden sollen .
Und gibt das kürzeste P aus , das nur Zeichen in A enthält , in weniger als T Zeiteinheiten ausgeführt wird, und gibt S aus .
Dies ist der allgemeine Pseudocode:
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
Einzelheiten
- Sie können davon ausgehen, dass immer ein P aus den Zeichen in A erstellt wird , das zur Zeit T abläuft und S ausgibt .
- Sie können davon ausgehen, dass die Ausführung der potenziellen P keine Nebenwirkungen hat, die verhindern, dass der Solver ausgeführt wird oder ordnungsgemäß funktioniert (wie z. B. das Durcheinander mit dem zugewiesenen Speicher des Solvers).
- Sie können nicht davon ausgehen, dass die potenziellen P fehlerfrei sind. Achten Sie darauf,
try
/catch
blocks oder was auch immer für den Ausführungsaufruf relevant ist, einzuschließen. - Wenn es mehrere kürzeste P gibt , reicht jedes aus. "Shortness" wird in Zeichen gemessen, die keine Bytes sind.
- Der Ausgang des Potential P ‚ist s , was zu stdout gedruckt ist (oder üblichen Ausgabebereich Ihrer Sprache). Der leere String ist ein Potential P .
- Idealerweise lässt Ihr Löser zu, dass A beliebige Zeichen enthält. A muss mindestens druckbare ASCII- Zeichen sowie Tabulatoren und Zeilenumbrüche enthalten können.
- Die Eingabe kann von file / stdin / command line / function args stammen. Die Ausgabe erfolgt nach stdout oder ähnlich oder kann als Zeichenfolge zurückgegeben werden, wenn Sie eine Funktion geschrieben haben.
Wertung
Die Einsendung mit den wenigsten Bytes gewinnt. Tiebreaker geht zum frühesten geposteten Beitrag.