Voir la version BFS Voir la version DFS Retour à la page du projet
Afficher/Masquer les commentaires
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8"/>
<title>Le compte est bon</title>
Voici le code du solveur du compte est bon avec les commentaires.
<script>
var nb_a_tirer = 5; // combien de nombres à tirer aléatoirement
var cible = 2; // valeur cible
// nombres dispos pour tirage aléatoire
var nbres_dispos = new Array(1,1 , 2,2, 3,3, 4,4, 5,5, 6,6, 7,7, 8,8, 9,9, 10,10, 25,25, 50,50, 75,75, 100,100);
var best_distance;
var best_nb_op;
var nbres_aleas = new Array(6,3,50,50,50,""); // tableau des nombres tirés pour calcul
var operateurs = new Array('+','*','-','/');
// tirage d'un nombre cible aléatoirement
function nombre_cible_aleatoire() {
cible = 100 + Math.floor(900*Math.random());
document.forme.nbcible.value = cible;
}
// tirage des nombres pour le calcul
function nombres_aleatoires() {
var nbres_dispos = new Array(1,1 , 2,2, 3,3, 4,4, 5,5, 6,6, 7,7, 8,8, 9,9, 10,10, 25,25, 50,50, 75,75, 100,100);
var texte = '';
for(i=0;i<nb_a_tirer;i++)
{
b = 1 + Math.floor((nbres_dispos.length)*Math.random());
texte = texte + ' ' + nbres_dispos[b-1];
nbres_aleas[i] = nbres_dispos[b-1];
nbres_dispos.splice(b-1, 1);
}
document.forme.nbalea.value = texte;
}
// calcule de 2 nombres n1 et n2 avec 1 des 4 opérateurs
function calcule(n1, n2, op){
var res;
if(op == '+'){
res = n1 + n2;
operations_encours.push(n1+ op + n2 + '=' + res);
return res;
}
if(op == '-') {
if(n1 > n2)
{
res = n1 - n2;
operations_encours.push(n1 + op + n2 + '=' + res);
return res;
}
else
{
res = n2 - n1;
operations_encours.push(n2 + op + n1 + '=' + res);
return res;
}
}
if(op == '*')
{
res = n1 * n2;
operations_encours.push(n1 + op + n2 + '=' + res);
return res;
}
if(op == '/')
{
if(n1 >= n2){
res = Math.floor(n1 / n2);
if(res * n2 != n1) res = 0;
operations_encours.push(n1 + op + n2 + '=' + res);
return res;
}
else
{
res = Math.floor(n2 / n1);
if(res * n1 != n2) res = 0;
operations_encours.push(n2 + op + n1 + '=' + res);
return res;
}
}
}
function go(){
resultat = '';
solution=recherche_arbre(nbres_aleas);
if(solution[0] ==cible) resultat = resultat + "Le compte est bon ! \n"+solution[solution.length-1];
else resultat = resultat + "Le compte n est pas bon ! \nmeilleur résultat :"+solution[0]+'\n'+solution[solution.length-1];
document.forme.go.value = resultat;
}
function recherche_arbre(tab){
best_distance=1000;
operations_encours = new Array();
var Afaire= new Array(tab);
best= new Array();
var i,j,p;
while(Afaire[0].length>2 ){
var nb_nombres = Afaire[0].length;
for(i=0;i<nb_nombres-2;i++) {
for(j=i+1;j<nb_nombres-1;j++){
for(p=0;p<4;p++){
res = calcule(Afaire[0][i],Afaire[0][j],operateurs[p]);
if(res!=0){
Afaire.push([res])
for(k=0;k<nb_nombres;k++) if(k!=i && k!=j) Afaire[Afaire.length-1].push(Afaire[0][k]); // on calcule et on empile
Afaire[Afaire.length-1][Afaire[Afaire.length-1].length-1]=Afaire[Afaire.length-1][Afaire[Afaire.length-1].length-1]+ '\n'+operations_encours[0];
if(res==cible) {return Afaire[Afaire.length-1]}
else {if (Math.abs(res-cible)<best_distance){best_distance=Math.abs(res-cible);best=Afaire[Afaire.length-1]}
Afaire.push(Afaire[Afaire.length-1]);}
}
operations_encours.pop();
}
}
}
Afaire.shift();
}
return best
}
</script>
</head>
<body>
On crée un formulaire qui va afficher les différentes informations.
<form name="forme" >
<a href="javascript:nombre_cible_aleatoire();" >Générer nombre cible aléatoire</a>
<input type="text" size="35" maxlength="35" name="nbcible"></input><br>
<a href="javascript:nombres_aleatoires();" >Nombres aléatoires</a>
<input type="text" size="35" maxlength="35" name="nbalea"></input><br>
<a href="javascript:go();" >Go!</a>
<textarea cols="80" rows="10" name="go" readonly style="resize:none"></textarea>
</form>
</body>
</html>
Afficher/Masquer les commentaires
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8"/>
<title>Le compte est bon</title>
Voici le code du solveur du compte est bon avec les commentaires.
<script>
var nb_a_tirer = 6; // combien de nombres à tirer aléatoirement
var cible = 2; // valeur cible
// nombres dispos pour tirage aléatoire
var nbres_dispos = new Array(1,1 , 2,2, 3,3, 4,4, 5,5, 6,6, 7,7, 8,8, 9,9, 10,10, 25,25, 50,50, 75,75, 100,100);
var operations_encours = new Array();
var best_operations = new Array();
var best_distance;
var best_nb_op;
var nbres_aleas = new Array(6,4,7,5,50,50); // tableau des nombres tirés pour calcul
var operateurs = new Array('+','*','-','/');
var resultat = '';
var candidat;
// tirage d'un nombre cible aléatoirement
function nombre_cible_aleatoire() {
cible = 100 + Math.floor(900*Math.random());
document.forme.nbcible.value = cible;
}
// tirage des nombres pour le calcul
function nombres_aleatoires() {
var nbres_dispos = new Array(1,1 , 2,2, 3,3, 4,4, 5,5, 6,6, 7,7, 8,8, 9,9, 10,10, 25,25, 50,50, 75,75, 100,100);
var texte = '';
for(i=0;i<nb_a_tirer;i++)
{
b = 1 + Math.floor((nbres_dispos.length)*Math.random());
texte = texte + ' ' + nbres_dispos[b-1];
nbres_aleas[i] = nbres_dispos[b-1];
nbres_dispos.splice(b-1, 1);
}
document.forme.nbalea.value = texte;
}
// calcule de 2 nombres n1 et n2 avec 1 des 4 opérateurs
function calcule(n1, n2, op){
var res;
if(op == '+'){
res = n1 + n2;
operations_encours.push(n1+ op + n2 + '=' + res);
return res;
}
if(op == '-') {
if(n1 > n2)
{
res = n1 - n2;
operations_encours.push(n1 + op + n2 + '=' + res);
return res;
}
else
{
res = n2 - n1;
operations_encours.push(n2 + op + n1 + '=' + res);
return res;
}
}
if(op == '*')
{
res = n1 * n2;
operations_encours.push(n1 + op + n2 + '=' + res);
return res;
}
if(op == '/')
{
if(n1 >= n2){
res = Math.floor(n1 / n2);
if(res * n2 != n1) res = 0;
operations_encours.push(n1 + op + n2 + '=' + res);
return res;
}
else
{
res = Math.floor(n2 / n1);
if(res * n1 != n2) res = 0;
operations_encours.push(n2 + op + n1 + '=' + res);
return res;
}
}
}
function go(){
// réinitialisation des variables
best_distance = cible;
best_nb_op = nb_a_tirer;
operations_encours = new Array();
best_operations = new Array();
resultat = '';
recherche_arbre(nbres_aleas); // recherche récursive
if(best_distance ==0) resultat = resultat + "Le compte est bon ! \n";
else resultat = resultat + "Le compte n est pas bon ! \nla meilleure réponse est "+candidat+"\n";
affiche(best_operations);
document.forme.go.value = resultat;
}
function recherche_arbre(tab){
var nb_nombres = tab.length;
var i,j,p;
//if(nb_nombres<=best_nb_op){
for(i=0;i<nb_nombres-1;i++) {
for(j=i+1;j<nb_nombres;j++){
for(p=0;p<4;p++){
res = calcule(tab[i],tab[j],operateurs[p]); // on calcule et on empile
if(res!=0){
compare(res);
var tab2 = new Array();
tab2.push(res);
for(k=0;k<nb_nombres;k++) if(k!=i && k!=j) tab2.push(tab[k]);
if(tab2.length>1 && operations_encours.length<best_nb_op-1) recherche_arbre(tab2);//appel de la fonction récursive
}
operations_encours.pop();
}
}
}
}
function compare(n){
if(n==cible && operations_encours.length<best_nb_op){
best_distance = 0;
best_nb_op = operations_encours.length;
copie_vers_best_operations();
}
else{
if(best_distance !=0){
var distance = Math.abs(n-cible);
if(distance < best_distance){
best_distance = distance;
copie_vers_best_operations();
candidat=n;
}
}
}
}
function copie_vers_best_operations(){
for(i=0;i<operations_encours.length;i++) best_operations[i] = operations_encours[i];
for(i=operations_encours.length;i<nb_a_tirer-1;i++) best_operations[i] = '';
}
function affiche( tab_operations){
var i;
for(i=0;i<tab_operations.length;i++){
resultat = resultat + tab_operations[i] + '\n';
}
document.forme.go.value = resultat;
}
</script>
</head>
<body>
On crée un formulaire qui va afficher les différentes informations.
<form name="forme" >
<a href="javascript:nombre_cible_aleatoire();" >Générer nombre cible aléatoire</a>
<input type="text" size="35" maxlength="35" name="nbcible"></input><br>
<a href="javascript:nombres_aleatoires();" >Nombres aléatoires</a>
<input type="text" size="35" maxlength="35" name="nbalea"></input><br>
<a href="javascript:go();" >Go!</a>
<textarea cols="80" rows="10" name="go" readonly style="resize:none"></textarea>
</form>
</body>
</html>