Code source du projet le compte est bon

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>