LE COMPTE EST BON



Un bref rappel du jeu :

On dispose de 6 nombres ou chiffres tirés au hasard parmi :

On tire au hasard un nombre compris entre 100 et 999.

Le but est alors d'atteindre ce nombre en utilisant les 6 nombres précédents avec les quatre opérations arithmétiques élémentaires :

C'est tout, enfin tout le monde connaît j'imagine...


Applet JAVA (pour jouer en ligne) :

Résolution du jeu :

En 1994, je me suis intéressé comment résoudre ce célèbre jeu complètement : c'est a dire sans omettre la moindre solution quelque soit le nombre de chiffre utilisé dans la résolution.

Par exemple, on peut utiliser les 6 chiffres ou nombres pour atteindre une solution mais 4 ou 5 sont souvent suffisants.

Parfois même, on a une solution en utilisant 5 nombres uniquement mais aucune en utilisant 6 nombres : cas rares je dois dire mais qui sont déjà tombés dans le jeu télévisé lui-même.

A cette époque, je regardais sur mon ordinateur les tirages du jeu télévisé qui posaient problème aux candidats et même à Bertrand Renard le spécialiste du jeu.
Conclusion : Rares sont les tirages du jeu télévisé sans solution.

Il existe plusieurs algorithmes pour obtenir des solutions :


Premier Algorithme (récursif) :

On dispose de 6 plaques {p1,p2,p3,p4,p5,p6}, on choisit 2 plaques parmi ces 6 plaques :
Il y a donc = 6x5/2 = 15 combinaisons :
{(p1,p2),(p1,p3),(p1,p4),(p1,p5),(p1,p6),(p2,p3),(p2,p4),(p2,p5),(p2,p6),(p3,p4),(p3,p5),(p3,p6),(p4,p5),(p4,p6),(p5,p6)}

Pour chacun des couple (pi,pj), on dispose des 4 opérations arithmétiques.
La soustraction et la division n'étant pas commutative, il faut aussi penser à l'inverse :
pi - pj et aussi pj - pi
pi / pj et aussi pj / pi

Remarque :

p1 + p2 = p2 + p1 (commutativité de l'addition)
p1 x p2 = p2 x p1 (commutativité de la multiplication)

En y regardant de plus près, seules les valeurs positives nous intéressent :
Hors si p1 - p2 > 0 alors p2 - p1 < 0
Et si p1 - p2 > 0 alors p1> p2 et p2 / p1 n'existe pas (valeur non entière).

On peut donc tester le couple (pi,pj) et faire ensuite la soustraction qui est positive :
pi - pj ou pj - pi.
Si la soustraction est nulle, on peut éliminer le calcul, la valeur nulle ne pouvant nous aider dans la recherche de solutions.

On fait de même la division pi / pj ou pj / pi suivant le test.
Ce qui ramène le couple (pi,pj) à quatre opérations arithmétiques (la multiplication et surtout la division étant les plus coûteuses).
Si pi ou pj dans la multiplication (ou la division) est de valeur 1, alors pi x pj = pi ou pj (pi / pj = pi si pj = 1) et donc ces opérations ne font pas avancer le calcul et la recherche de solutions :
On peut donc éliminer ces cas également.
Si la division n'existe pas dans N, ce qui est très fréquent, on évite une opération de plus, ce qui donne en tout moins de 4 opérations en moyenne par couple (pi,pj).

On a donc 15 couples (pi,pj), et au plus 4 opérations pour chacun de ces couples, soit au plus 60 opérations pour les 2 premières plaques.

Supposons l'opération pi + pj :
La valeur calculée peut être considéré comme une nouvelle plaque.

On se retrouve alors avec le même problème mais avec 5 plaques et non plus avec 6 (2 plaques remplacées par le résultat de l'opération entre ces 2 plaques).

C'est donc là que la récursivité intervient :

On dispose désormais de 5 plaques, on choisit 2 plaques parmi ces 5 plaques :
il y a donc = 5x4/2 = 10 combinaisons.
Si par exemple p1 et p2 étaient les 2 premières plaques utilisées et si p1 devenait le résultat de la première opération de p1 et p2, on a ces 10 combinaisons :
{(p1,p3),(p1,p4),(p1,p5),(p1,p6),(p3,p4),(p3,p5),(p3,p6),(p4,p5),(p4,p6),(p5,p6)}

On fait le même raisonnement avec 4 plaques, 3 plaques, puis 2 plaques.

Dès qu'il ne reste plus qu'une seule plaque, on remonte dans l'algorithme récursif.

A chaque niveau de récursion, on vérifie si le résultat de l'opération faite au niveau de récursion précédent n'est pas le résultat qu'on cherche (simple test sur la nouvelle plaque issue des 2 anciennes : si p1 est toujours le résultat de l'opération précédente, on teste simplement si p1 est le résultat qu'on cherche).

On peut calculer la complexité de cet algorithme dans le pire des cas :

x 4 x x 4 x x 4 x x 4 x x 4 = 15 x 4 x 10 x 4 x 6 x 4 x 3 x 4 x 1 x 4 = 15 x 10 x 6 x 3 x 45 = 2 764 800 opérations

2 764 800 opérations dans le pire des cas, c'est vraiment faible pour les ordinateurs actuels.

En plus, l'expérience par le calcul montre même que 400 000 à 1 500 000 opérations sont souvent suffisantes :

Ces suppressions d'opérations dans la recherche divisent presque par trois la recherche dans certains cas (les meilleurs) !
2 764 800 opérations dans le pire des cas à 400 000 opérations pour les meilleurs cas (encore moins pour le meilleur des cas qui doit être le tirage avec que des 1 : 38 206 opérations).

Le pire des cas tel qu'il est envisagé est en plus très improbable, même inexistant vu les critères mis en jeu !

Graphe de l'algorithme :

Ce graphe illustre le fonctionnement de l'algorithme récursif :

fonctionnement de l'algorithme récursif

Programme en c :

Source (DOS/Windows/Linux 16/32 bits) : compte.c

Exécutable (DOS/Windows 16/32 bits) : compte.exe

Version plus rapide avec un chronomètre intégré :

Source (Windows 32 bits) : wcompte.c

Exécutable (Windows 32 bits) : wcompte.exe

Remarque :
On peut facilement enlever la récursivité de l'algorithme pour l'optimiser un peu en faisant simplement un parcours en profondeur du graphe de manière non récursive.


Deuxième Algorithme :

On va ici envisager plusieurs cas :

Avec 2 plaques :

Si on ne dispose que de 2 plaques, on ne peut faire que l'opération :

pi * pj = R1 (PP)

* {+, x, -, /}
i,j {1,2,3,4,5,6}
PP signifie : Plateau * Plateau (opération sur 2 nouveaux plateaux)
RP signifie : Plateau * Résultat (opération sur un nouveau plateau avec le résultat précédent)
RR signifie : Résultat * Résultat (opération sur les 2 résultats précédents)

Remarque :
Pour simplifier (cf. premier algorithme), on traite (i,j) et (j,i) en même temps, c'est à dire que c'est pi - pj ou pj - pi (respectivement pi / pj ou pj / pi) qui sont calculés :
On s'intéresse donc aux couples (i,j) avec i < j, c'est à dire aux = 6x5/2 = 15 couples (i,j), i < j.
Cette remarque est valable pour les autres cas (3 plaques, 4 plaques, 5 plaques ou 6 plaques) :
Dès qu'une opération entre 2 plaques pi * pj intervient, on s'intéresse aux couples (i,j) qui vérifient i < j.
On reprend également les remarques du premier algorithme sur les multiplications et divisions avec au moins une opérande à 1 et les soustractions nulles : on les évite.

La complexité de ce premier cas ou schéma de calcul est donc de 15 x 4 = 60 opérations dans le pire des cas.

Avec 3 plaques :

Le (seul) schéma est le suivant :

pi * pj = R1 (PP)
R1 * pk = R2 (RP)

On choisit 2 plaques parmi les 6 :
= 15 couples (i,j)
pk peut prendre une des valeurs des 6 - 2 = 4 plaques restantes.

La complexité dans le pire des cas de ce schéma de calcul est donc de 15 x 4 x 42 = 960 opérations.

Avec 4 plaques :

Il existe deux schémas avec 4 plaques :

La complexité dans le pire des cas de ces deux schémas de calcul est donc de 5 760 + 11 520 = 17 280 opérations.

Avec 5 plaques :

Il existe trois schémas avec 5 plaques :

La complexité dans le pire des cas de ces trois schémas de calcul est donc de 46 080 + 46 080 + 92 160 = 184 320 opérations.

Avec 6 plaques :

Il existe six schémas avec 6 plaques :

La complexité dans le pire des cas de ces six schémas de calcul est donc de 92 160 + 184 320 + 184 320 + 184 320 + 184 320 + 368 640 = 1 198 080 opérations.

Chaque cas pourra être traité comme dans le premier algorithme de manière récursive, les deux algorithmes étant alors assez proche. On suit les schémas précédents pour chacun des cas.

La complexité dans le pire des cas de ce deuxième algorithme est donc de :

60 + 960 + 17 280 + 184 320 + 1 198 080 = 1 400 700 opérations.

Comparées au 2 764 800 opérations dans le pire des cas du premier algorithme, le deuxième algorithme est presque deux fois plus rapide que le premier, ce qui se vérifie en exécutant les deux algorithmes.

L'expérience montre que le nombre d'appels à la fonction récursive du deuxième algorithme est environ deux fois moins grand que le nombre d'appels à la fonction récursive du premier algorithme : 200 000 à 800 000 appels pour le deuxième algorithme contre 400 000 à 1 500 000 appels pour le premier algorithme dans la plupart des cas (chaque appel à la fonction récursive signifie qu'une opération (+, x, -, /) vient d'être effectuée donc ce nombre d'appels représente aussi le nombre d'opérations valides effectuées et donc la complexité de l'algorithme).

Les fonctions récursives de ces deux algorithmes étant assez proches, le temps d'exécution est environ deux fois moins grand pour le deuxième algorithme.

Programme en c :

Source (DOS/Windows/Linux 16/32 bits) : compte2.c

Exécutable (DOS/Windows 16/32 bits) : compte2.exe

Version plus rapide avec un chronomètre intégré :

Source (Windows 32 bits) : wcompte2.c

Exécutable (Windows 32 bits) : wcompte2.exe

Remarque :
Comme pour le premier algorithme, on peut facilement enlever la partie récursive de l'algorithme pour l'optimiser un peu en faisant simplement un parcours en profondeur du graphe de manière non récursive.


Programme :

Mon programme COMPTE résout ce jeu intégralement.

Il est basé sur le deuxième algorithme.

Il peut bien-sûr résoudre d'autres cas que ceux présentés dans le jeu télévisé : à savoir n'importe quel tirage à trouver compris entre 1 et 65535 avec n'importe quel nombre compris entre 1 et 255 en utilisant les 4 opérations.

Ce programme datte un peu : 1995 mais il a été entièrement écrit en assembleur (TASM) et fait moins de 9 KO.

La vitesse de résolution est donc impressionnante sur des Intel Pentium III et autres processeurs récents en comparaison avec mon Intel 486 DX 33 que j'utilisais entre 1992 et 1996 : le programme tournait déjà rapidement alors maintenant...

Il fonctionne sur DOS et donc aussi sur WIN95,WIN98 et WINME :

COMPTE

Mode d'emploi :

Malgré l'interface sur DOS, je ne penses pas qu'on puisse faire beaucoup plus simple :

COMPTE
COMPTE
COMPTE

COMPTE

Essayer ce tirage et regarder le nombre de solutions affiché :

COMPTE

Vous pouvez recommencer un autre tirage en appuyant sur ESCAPE.
Quitter le programme en réappuyant sur ESCAPE.

TÉLÉCHARGER : COMPTE


Conclusion :

Voila bonne utilisation...
Vos remarques sont les bienvenues à : eternitygames@free.fr
Email
Je ferais bientôt un applet JAVA basé sur le deuxième algorithme (plus rapide) pour que cela fonctionne aussi en ligne.
Mise à jour Septembre 2001 : l'applet JAVA est en ligne, vous pouvez maintenant jouer sur la page directement !



RETOUR



visiteurs depuis le 15 février 2001

Copyright © 2001 ETERNITY GAMES : http://eternitygames.free.fr (Emmanuel Harang)