jamys123 a écrit:@svear,
yop,
sympa...et cela tourne sur quoi ton programme?
Je l'ai écrit en Python avec une IHM faite en Qt (PyQt). Il tourne aussi bien sous Linux que sous Windows pour peu qu'on installe Python+Qt+PyQt. Je peux aussi utiliser Py2exe pour créer un runtime windows embarqué qui intègre Python et tout ce qu'il faut et dans ce cas il n'y a rien à installer, le dossier contenant le programme et toutes les librairies étant totalement autonome.
jamys123 a écrit:il y a quoi comme mathématique derrière ton programme? si pas trop indiscret bien entendu...
Boah il n'y a rien de secret surtout que c'est un code GPL (sauf que je ne me suis pas vraiment occupé de le publier).
La fonction part de la liste de base des nombres utilisables et les combine 2 à 2 en récursif. Imaginons que tu aies [2, 3, 4, 5, 6] il commencera par faire 2+3 => 5 et placera ce 5 dans la liste en enlevant 2 et 3 ce qui donnera [4, 5, 5, 6] puis la fonction s'appelle elle-même (récursif) avec cette nouvelle liste qui sera traitée selon le même algo dans une branche inférieure.
Puis la fonction continue la suite qui est 2*3=6 et repart dans les branches inférieures. Puis continue avec 2 et 4 puis 2 et 5 puis 2 et 6.
Puis le 2 ayant été traité, elle part sur 3 qui traitera tous les autres nombres puis 4 puis 5 puis 6.
A chaque résultat, elle vérifie si le résultat correspond au but attendu. Si c'est le cas il est alors stocké dans un tableau d'affichage et sera affiché à la fin.
Ensuite il y a un peu d'optimisation. Déjà la liste est toujours triée au début de chaque branche. Ca permet d'éviter de traiter 2 fois le même nombre (dans la liste [4, 5, 5, 6] il n'y aura qu'un seul 5 qui servira de pivot. J'évite aussi les redondances commutatives (si j'ai traité 2 + 3 ou 2 * 3, je ne traiterai pas 3 + 2 ni 3 * 2). J'évite les calculs inutiles comme soustraction à résultat négatif ou même nul (un nombre nul ne sert à rien dans la recherche de la solution), multiplication ou division par 1 et division non entière.
Et enfin un tri dans les résultats. Seuls sont pris en compte les résultats où tous les calculs auront été utiles. Si j'ai [2, 3, 4, 5, 6] et qu'il faut trouver 24, il y aura une branche qui contient "2+3=5 suivi de 4*6=24" et une autre qui contient juste "4*6=24". La branche qui contient "2+3=5" alors que ce 5 ne sert pas est alors supprimée de la liste des solutions possibles (puisque la même solution est trouvée dans une autre branche). Et voilà. Ah oui, je supprime aussi les doublons (pour moi, un doublon est une suite de calculs où tous les résultats sont les mêmes que dans un autre calcul)
Exemple de doublon sur une recherche de 48 avec 2, 3, 4, 5 et 6
2 * 4 = 8
6 * 8 = 48
puis dans une autre branche
3 + 5 = 8
6 * 8 = 48
Deux calculs avec 2 lignes chacun où les résultats de chaque ligne sont les mêmes => doublon (même si le calcul ayant mené au résultat ne l'est pas) => un des deux ne sera pas affiché en final.
Pour le problème de ce topic, ben j'ai paramétré le programme pour qu'il prenne 7 plaques et non 6 (ça se fait via un fichier de config)
Petite image...