Automate

Voici un petit (micro) jeu de robosomes :

Entrer ci-dessus le programme à appliquer aux robots (suite de lettres A, D ou G) :

Il est suffisamment petit pour qu'on puisse lister les états possibles de la grille, numérotés de 0 à 4 :

état 0état 1état 2état 3état 4

L'état 4 est l'état final. Jouer consiste à atteindre l'état final (celui où tous les robots sont sortis de la grille). Or on constate que :

Résoudre un robosomes, c'est trouver un chemin dans le graphe ci-dessus, allant de l'état initial 0 jusqu'à l'état final 4. Les lettres étiquetant les arcs parcourus, forment alors un mot gagnant (le programme). Comme l'automate a un nombre fini (quoique parfois très grand) d'états, le langage formé par les mots gagnants d'un robosomes est régulier.

L'ensemble des solutions d'un robosomes peut être décrit par une expression régulière (ou RegEx). Pour le robosomes ci-dessus, en posant B = DA*D et C = GA*G, une Regex décrivant les mots gagnants est ((B|C)(B|C))*(B|C)A.

Le fait qu'une solution d'un robosomes est un chemin allant de l'état initial à un état final, donne un algorithme pour un solveur de robosomes :

Alors, si le parcours est terminé sans qu'on soit arrivé à un état final, c'est que le robosomes en question n'a pas de solution. Sinon, la suite des lettres lues dans le parcours trouvé est une solution du robosomes.

Le fait qu'on ait effectué un parcours en largeur garantit que, non seulement on trouve une solution (s'il y en a une) mais en plus elle est la plus courte possible.