Utiliser la programmation pour résoudre un problème mathématiques
Vous avez sûrement entendu parlé de cet exercice de mathématiques qui fait tant parler de lui depuis quelques jours sur internet.
Cet exercice a priori simple qu'un professeur Vietnamien a donné à faire à ses élèves d'une classe équivalent au CE2. Simple ? A priori seulement parce qu'ils ont tous rendu copie blanche, laissant ainsi perplexe le professeur qui a fini par publier son exercice sur internet après l'avoir présenté à plusieurs de ses proches qui n'ont eux aussi pas réussi à le résoudre.
Le but de l'exercice est simple, il suffit de résoudre l'équation ci-dessus en remplissant les cases vides avec des chiffres de 1 à 9 en utilisant chacun d'eux qu'une seule fois.
Et si vous utilisiez la programmation pour résoudre ce problème facilement ?
L'idée a déjà été évoquée et plusieurs personnes se sont déjà lancées le défis de créer un programme simple, plus ou moins efficace selon les cas permettant de mettre en évidence la liste des solutions possibles de l'équation. Parce que oui, il n'y a pas une, mais bien un peu plus d'une centaine de solutions possible.
Pour ma part j'ai fait un programme très basique en PHP tenant sur moins d'une quarantaine de lignes qui m'a permis d'obtenir pas moins de 128 solutions différentes :
<?php $taille = 10; $elements = array(); $liste = array(); $listesReponses = array(); $nbCombinaisons = 1; function permutation($r) { global $taille, $elements, $liste; if($r >= $taille){ verif(); } for ($i=1; $i < $taille; $i++) { if($elements[$i]){ continue; } $elements[$i] = true; $liste[$r] = $i; permutation($r+1); $elements[$i] = false; } } permutation(1); function verif() { global $liste, $nbCombinaisons; $equation = $liste[1]+13*$liste[2]/$liste[3]+$liste[4]+12*$liste[5]-$liste[6]-11+$liste[7]*$liste[8]/$liste[9]-10; //Affiche le résultat si l'équation est bien égale à 66 if($equation == 66){ echo 'N'.$nbCombinaisons.' : '.$liste[1].'+13x'.$liste[2].':'.$liste[3].'+'.$liste[4].'+12x'.$liste[5].'-'.$liste[6].'-11+'.$liste[7].'x'.$liste[8].':'.$liste[9].'-10 = '.$equation.'<br/>'; $nbCombinaisons++; } else{ return false; } } ?>
Le but du programme est simple : tester toutes les possibilités jusqu'à ce que l'une d'entre elle donne le bon résultat. Si tel est le cas on affiche l'équation valable et on continue (ne pas oublier qu'il n'y a pas qu'une solution).
Cette méthode est possible sans utiliser un trop grand nombre de combinaisons, car la consigne de l'exercice indique qu'il ne faut utiliser qu'une unique fois chacun des chiffres de 1 à 9.
La première chose à faire est donc d'établir une liste possible de combinaisons grâce au principe mathématiques de permutation. C'est ce qui est réalisé par la fonction "permutation" du programme.
Intervient enfin la fonction "verif" qui permet de vérifier pour chacune des combinaisons possibles si le résultat de l'équation est bien 66. Si tel est le cas la fonction affiche l'une des équations correcte à l'écran.
Résultat :
N1 : 1+13x2:6+4+12x7-8-11+3x5:9-10 = 66
N2 : 1+13x2:6+4+12x7-8-11+5x3:9-10 = 66
N3 : 1+13x3:2+4+12x5-8-11+7x9:6-10 = 66
N4 : 1+13x3:2+4+12x5-8-11+9x7:6-10 = 66
N5 : 1+13x3:2+9+12x5-6-11+4x7:8-10 = 66
N6 : 1+13x3:2+9+12x5-6-11+7x4:8-10 = 66
[...]
N121 : 9+13x4:8+5+12x6-7-11+1x3:2-10 = 66
N122 : 9+13x4:8+5+12x6-7-11+3x1:2-10 = 66
N123 : 9+13x5:3+1+12x4-2-11+7x8:6-10 = 66
N124 : 9+13x5:3+1+12x4-2-11+8x7:6-10 = 66
N125 : 9+13x6:4+3+12x5-8-11+1x7:2-10 = 66
N126 : 9+13x6:4+3+12x5-8-11+7x1:2-10 = 66
N127 : 9+13x8:6+2+12x4-1-11+5x7:3-10 = 66
N128 : 9+13x8:6+2+12x4-1-11+7x5:3-10 = 66
(j'ai volontairement enlevé une partie des résultats pour ne pas que cela prenne trop de place)
Catégories : PHP
Par Guillaume le 24/05/2015 à 22:56