La complexité de Kolmogorov d'une chaîne S est la longueur du programme le plus court P , écrit dans un langage de programmation L , dont la sortie est exactement S .
(Oui, la vraie définition est plus formelle mais cela suffira pour le défi.)
Votre tâche dans ce défi est d'écrire le plus court possible « solveur de la complexité de Kolmogorov », qui est un programme écrit en L lui - même qui prend une chaîne S et retourne le plus court P écrit en L que les sorties S .
L'approche naïve consiste à parcourir tous les programmes de longueur 1, puis tous les programmes de longueur 2, puis tous les programmes de longueur 3, etc., en exécutant chacun d'eux et en mesurant la sortie jusqu'à ce qu'un programme qui génère S soit trouvé. Le problème avec cette approche est que certains de ces programmes peuvent ne jamais s'arrêter, ce qui signifie que le solveur lui-même peut ne jamais s'arrêter. Et en raison du problème d'arrêt, il n'y a aucun moyen infaillible d'éviter les programmes qui ne s'arrêtent pas.
Une solution simple, quoique imparfaite, consiste à limiter le temps d'exécution de chacun des P potentiels . Les programmes qui ne s'arrêtent pas dans le temps peuvent être ignorés, mais le solveur s'arrêtera définitivement (en supposant qu'un programme en L peut en effet produire S dans le délai).
Défi
Écrivez votre solveur sous forme de programme ou de fonction qui prend en compte trois choses:
- La chaîne S .
- Un entier positif T qui est la limite de temps en secondes ou un intervalle de temps plus court (par exemple millisecondes).
- Une chaîne A de l'alphabet de caractères à utiliser pour les P potentiels .
Et les sorties les plus brefs P qui ne contient que des caractères en A , fonctionne en moins de T unités de temps, et les sorties S .
Voici le pseudocode général:
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
Détails
- Vous pouvez supposer qu'il y aura toujours un P fabriqués à partir des caractères A qui fonctionne en temps T que les sorties S .
- Vous pouvez supposer que l'exécution des P potentiels n'aura pas d'effets secondaires qui empêcheront le solveur de fonctionner ou de fonctionner correctement (comme jouer avec la mémoire allouée du solveur).
- Vous ne pouvez pas supposer que les P potentiels sont exempts d'erreurs. Assurez-vous d'inclure
try
/catch
blocs ou tout ce qui s'applique autour de l'appel d'exécution. - S'il y a plusieurs P les plus courts , alors tout suffira. La "brièveté" est mesurée en caractères et non en octets.
- La sortie des P potentiels est ce qui est imprimé sur stdout (ou la zone de sortie habituelle de votre langue). La chaîne vide est un potentiel P .
- Idéalement, votre solveur permettra à A de contenir n'importe quel caractère. Un must au moins pour pouvoir contenir des caractères ASCII imprimables ainsi que des tabulations et des retours à la ligne.
- L'entrée peut provenir des fichiers / stdin / ligne de commande / fonction args. La sortie va à stdout ou similaire, ou peut être retournée sous forme de chaîne si vous avez écrit une fonction.
Notation
La soumission avec le moins d'octets est gagnante. Tiebreaker passe à la première soumission publiée.