Jeuvret sur HP50g
En ayant un peu marre de gaspiller du papier pour étudier les solutions aux innombrables problèmes de triage de Jeuvret, j’ai récemment entrepris d’écrire un petit programme sur ma calculette HP50g, d’une part pour faire des économies sur cette denrée précieuse qu’est le papier, d’autre part pour me faciliter la tâche et éviter de bêtes erreurs de transcription. Pour vous donner une première idée de ce que fait ce programme voici le résultat pour la résolution du triage de la rame BCFDEA en 5 coups.
Je dois m’empresser de dire que le programme ne calcule en rien la solution. Pas la moindre triche ici ! Son seul et unique rôle est de servir de support pour élaborer soi-même la solution, comme nous allons le voir plus loin. En pratique il remplace simplement le calepin que j’utilisais jusque là pour mes (souvent infructueux) essais de solutions, comme le montre la photo suivante.
On notera une petite particularité (ou bizarrerie) de mes transcriptions sur papier, que j’ai (provisoirement) conservée sur la calculette : les voies alternent à chaque coup, ou plutôt la voie sur laquelle se trouve la loco ("X" sur l’écran de la HP50, rien sur le papier) est systématiquement celle de gauche. Sur papier cette convention m’évite justement de coder ou d’indiquer la position de la loco et la séparation des voies est simplement marquée d’une petit croix. Sur HP50 cela simplifie considérablement le programme qui n’a pas à chercher sur quelle voie elle se trouve (il y a tout de même un test de validité qui affiche le message "PAS DE LOCO" si la première des deux chaînes de caractères ne débute pas par la lettre X).
Comment ça marche ? En fait, pour me faciliter la tâche au maximum il y a deux programmes. Le premier est un petit programme d’initialisation ou plus précisément de mise en forme. Il suffit d’introduire une chaîne de caractères représentant la rame à trier, sans la loco, par exemple "ACGDEBF" et d’actionner la touche [INIT] en haut du clavier :
Le résultat est une liste (délimitée par des accolades : { et }) de deux chaînes de caractères. La première représente le contenu de la voie sur laquelle se trouve la loco "X" (notre chaîne de caractères en tête de laquelle a été rajouté un X), la seconde donne le contenu de l’autre voie, ici au départ vide.
On notera que cette liste est en outre indicée au moyen d’un « tag », le « 0: » juste devant. Cet indice, partant de zéro pour la configuration de départ, augmente automatiquement à chaque coup pour donner le nombre de coups effectués depuis le début. Très pratique : on sait ainsi toujours où on en est et on peut s’arrêter à tout moment si on dépasse un nombre de coups limite fixé à l’avance.
Alors, comment joue-t-on un « coup » ? En introduisant tout simplement le nombre de wagons qu’on désire déplacer de la première voie vers l’autre. Par exemple, si on veut déplacer les trois premiers wagons de la rame ACGDEBF, on tapera [3] au clavier puis on lancera le programme [SJV] (pour « Simulation de JeuVret ») en actionnant la touche correspondante en haut du clavier.
Le résultat est instantané (elles carburent ces petites machines !) On notera que le programme, s’il a « déplacé » les trois wagons ACG, a bien laissé les quatre derniers wagons de la rame sur « l’autre voie ». Certes, on a l’impression du contraire, mais rappelez-vous : à chaque coup les deux voies alternent. Je changerai peut-être ça lors d’une prochaine version…
Si on change d’avis, ou si on s’est trompé, ou si on veut essayer une autre solution, il suffit d’effacer le dernier résultat sur l’écran, au bas de la pile (ou même plusieurs successivement si on veut revenir plus loin) et d’introduire une nouvelle valeur. Le programme [SJV] repartira automatiquement de la dernière étape affichée à l’écran. Finies les horribles ratures rendant certaines solutions totalement illisibles ! Et on peut à tout moment revenir en arrière en quelques clics pour tester une autre solution si on s’aperçoit au bout de quelques coups que celle en cours n’aboutit pas.
J’ajouterai pour terminer que le programme [SJV] est élémentaire, en particulier parce qu’il n’effectue que très peu de vérifications sur les données introduites. Si on n’a pas une valeur numérique en bas de la pile lors du lancement de [SJV], ou une liste taguée contenant deux chaînes de caractères juste au-dessus, le programme se plantera alors joliment ! Mais il suffit d’éliminer les débris laissés sur la pile affichée à l’écran pour recommencer (certes on aura aussi perdu le coup joué précédemment : il suffit alors de le rejouer pour retomber sur ses pattes…)
Quelques autres « bizarreries » de ce programme :
– Quand je parle de chaînes de caractères ces derniers peuvent être quelconques. On peut ainsi utiliser des chiffres si on préfère ceux-ci aux lettres, et même mélanger les deux. Le programme ne fait aucune vérification à ce niveau.
– Si on introduit une valeur non entière comme nombre de wagons à déplacer, par exemple 2,3, le programme arrondit à l’entier le plus proche (dans ce cas il arrondira à 2, mais si 2,4999 donne toujours 2 par contre 2,5 devient 3).
– Si on introduit une valeur négative le programme se contente d’intervertir les deux voies (et la loco X se retrouve alors dans la deuxième chaîne de caractères ce qui ne plaira pas au programme pour la suite des opérations : il indiquera bêtement "PAS DE LOCO" sans voir qu’elle est sur l’autre voie).
Bref, plein de petits détails qu’on pourrait corriger (ou exploiter) dans une future version de ce programme… Citons comme améliorations possibles la conservation dans une liste du nombre de wagons déplacés à chaque coup et/ou un total cumulé de ce nombre de wagons déplacés pour pouvoir comparer des solutions similaires entre elles. La principale difficulté ici est la gestion des corrections, c’est-à-dire des retours en arrière par simple élimination des derniers coups joués. Certes c’est possible sans trop de mal, mais cela alourdirait alors le programme de manière considérable. Le jeu en vaut-il la peine ?
Les programmes :
INIT [47 octets]
« "X" SWAP + "" 2 ->LIST 0 R->I ->TAG »
Paramètres : [1 : chaîne de caractères]
SJV [179 octets]
« OVER DTAG OBJ-> DROP
-> n v0 v1
« IF v0 HEAD "X" ==
THEN v0 1 n 1 + SUB v1 +
v0 n 2 + OVER SIZE SUB 2 ->LIST OVER
OBJ-> SWAP DROP OBJ-> 1 + R->I ->TAG
ELSE "PAS DE LOCO" END » »
Paramètres :
[2 : liste taguée de deux chaînes de caractères]
[1 : nombre de wagons à déplacer]
Note : ces deux programmes peuvent également être utilisés sur calculettes HP49 et HP48. Sur HP49 aucune modification n’est nécessaire ; sur HP48 il convient d’éliminer la commande R->I qui apparaît une fois dans chacun des programmes et qui n’existe pas sur cette machine (de toute façon elle est inutile dans ce cas, le formatage des nombres y étant différent).
bw