J'ai joué un peu puis me suis dis "c'est un boulot pour une machine".
Ou pas... Ce genre de jeux (le compte est bon) est une façon d'évaluer l'aptitude de calculs mentaux et l'intuition (plutôt la capacité d'estimation) face aux combinaisons de nombres. Évaluer une machine, ou tricher, a peu d'intérêt ici.
Ceci dit, l'informatique y est utile pour évaluer des conjectures mathématiques ou explorer certains aspects algorithmiquement (notamment tout ce qui touche aux arbres de décision, dont il n'est pas question ici puisqu'on emploie la force brute.) Il me semble d'ailleurs avoir vu passer deux articles sur le sujet, dont un dans Tangente si j'ai bonne mémoire.
À noter que le programme donne des solutions invalides qui n'utilisent pas tous les nombres, il faut filtrer. Je n'ai pas non plus implémenté la division qui me paraissait plus compliquée qu'utile à l'époque pour le compte est bon.
Du coup, je vais relever le défi, histoire de me changer les idées après une journée harassante de travail. Et pour épicer un peu la chose, l'implémentation sera en shell POSIX...
Bien, je passe sur l'étape de la saisie des nombres et du contrôle des entrées (toujours.)
Je ne vais pas non plus stocker les solutions, mais plutôt les sortir au fil de l'eau.
Comme on n'a pas de structure de tableau (en KSh, BASh et probablement ZSh, oui) je vais utiliser une variable par nombre (mais il n'y en a heureusement que quatre) !
Mon idée est qu'on va faire une boucle sur la liste de nombres.
Dans un langage comme RPL, on va juste faire quatre tours en décalant...
\<<
1 4 FOR i
4 ROLL
@process
NEXT
\>>
Pour la plupart des autres langages, non Forth-like on va utilier un tableau et décaler le curseur dans la boucle (tout en prenant tous les éléments, c'est juste pour changer l'ordre à chaque itération.)
Bon, on ne gère pas de tableau et heureusement il n'y a que quatre nombres.
Ces quatre lignes sont trompeuses (ça m'a servi à valider le fonctionnement, mais) il y a en fait vingt-quatre permutations (prises en compte dans la version finale.)
Le processus va consister à appliquer les quatre opérateurs... de sorte à couvrir tous les cas...
On peut les énumérer, mais par peur d'oublier, je boucle pareillement pour les quatre opérations... (l'optimisation serait de déboucler ...parce que sinon on aura des doublons du fait la commutativité, mais cet exercice se fera plus tard.)
process0(){for o1 in '+''-''*''/'dofor o2 in '+''-''*''/'do
process1 "$o1""$o2""$@"donedone}
process1(){localo1="1ドル"localo2="2ドル"localn1="3ドル"localn2="4ドル"localn3="5ドル"localn4="6ドル"for o3 in '+''-''*''/'dotest$(((n1 $o1 n2)$o3(n3 $o2 n4))) -eq 24&&
solution1 "$n1""$o1""$n2""$n3""$o2""$n4""$o3"done}
solution1(){localr1=$((1ドル2ドル3ドル))localr2=$((4ドル5ドル6ドル))echo"1ドル2ドル3ドル=$r1; 4ドル5ドル6ドル=$r2; $r17ドル$r2=24"}
Bon, c'est pas tout ça. Dans ce truc brutalement automatique, il ne faut pas oublier de gérer la division par zéro...
En plus du second processus, on va appeler un troisième dans la même boucle (c'est du « quick and dirty » et il doit être possible de fusionner les deux...)
Comme c'est bête/brute et méchant/truand, il m'annonce vingt réponses qui pourraient se ramener à 10 du fait des symétries et on a exploré deux mille huit cents combinaisons dont on aurait pu se passer du quart je pense.
J'ai exploré ici les formes (A x B) y (C z D) (c'est (8-5)*(7+1) ou (1+3)*(2-8) par exemple) et A x (B y C) z D (c'est 3*(2-1)*8 par exemple) ; mais pas A x B y (C z D) et (A x B) y C z D ! Il s'agit d'une part d'un jet rapide, et d'autre part ce ne serait pas pertinent en shell car je soupçonne qu'il y aura des doublons et/ou même des triplons. Cependant, avec ces ajouts, on devrait arriver aux trois mille septante douze...
Petit bémol cependant : les calcul ici sont fait sur des entiers et c'est problématique pour les divisions car le hollandais volant l'entend flottant... (si j'en crois la fonction randomizeNumbers() qui pourtant fait un Math.floor(), à moins que ce ne soit à cause du evalMath(cell1, operator, cell2) dans la fonction evalResultat() ?) Je pense pouvoir corriger cela facilement, ce qui réduira le nombre de solutions proposées.
"It is seldom that liberty of any kind is lost all at once." ― David Hume
# un petit peu plus (de divisions)
Posté par Gil Cot ✔ (site web personnel, Mastodon) . En réponse au journal résoudre "trouve 24". Évalué à 4. Dernière modification le 24 février 2022 à 03:44.
C'est ballot ...parce que, justement dans un lien posté récemment, que l'absence de pisteurs est un des ingrédients du succès.
https://linuxfr.org/users/gilcot/liens/wordle-is-pretty-damn-smart-in-many-subtle-ways
Ou pas... Ce genre de jeux (le compte est bon) est une façon d'évaluer l'aptitude de calculs mentaux et l'intuition (plutôt la capacité d'estimation) face aux combinaisons de nombres. Évaluer une machine, ou tricher, a peu d'intérêt ici.
Ceci dit, l'informatique y est utile pour évaluer des conjectures mathématiques ou explorer certains aspects algorithmiquement (notamment tout ce qui touche aux arbres de décision, dont il n'est pas question ici puisqu'on emploie la force brute.) Il me semble d'ailleurs avoir vu passer deux articles sur le sujet, dont un dans Tangente si j'ai bonne mémoire.
Du coup, je vais relever le défi, histoire de me changer les idées après une journée harassante de travail. Et pour épicer un peu la chose, l'implémentation sera en shell POSIX...
Bien, je passe sur l'étape de la saisie des nombres et du contrôle des entrées (toujours.)
Je ne vais pas non plus stocker les solutions, mais plutôt les sortir au fil de l'eau.
Comme on n'a pas de structure de tableau (en KSh, BASh et probablement ZSh, oui) je vais utiliser une variable par nombre (mais il n'y en a heureusement que quatre) !
Mon idée est qu'on va faire une boucle sur la liste de nombres.
Dans un langage comme RPL, on va juste faire quatre tours en décalant...
Pour la plupart des autres langages, non Forth-like on va utilier un tableau et décaler le curseur dans la boucle (tout en prenant tous les éléments, c'est juste pour changer l'ordre à chaque itération.)
Bon, on ne gère pas de tableau et heureusement il n'y a que quatre nombres.
Ces quatre lignes sont trompeuses (ça m'a servi à valider le fonctionnement, mais) il y a en fait vingt-quatre permutations (prises en compte dans la version finale.)
Le processus va consister à appliquer les quatre opérateurs... de sorte à couvrir tous les cas...
On peut les énumérer, mais par peur d'oublier, je boucle pareillement pour les quatre opérations... (l'optimisation serait de déboucler ...parce que sinon on aura des doublons du fait la commutativité, mais cet exercice se fera plus tard.)
Bon, c'est pas tout ça. Dans ce truc brutalement automatique, il ne faut pas oublier de gérer la division par zéro...
En plus du second processus, on va appeler un troisième dans la même boucle (c'est du « quick and dirty » et il doit être possible de fusionner les deux...)
Enfin, on pense à ajouter les compteurs.
Comme c'est bête/brute et méchant/truand, il m'annonce vingt réponses qui pourraient se ramener à 10 du fait des symétries et on a exploré deux mille huit cents combinaisons dont on aurait pu se passer du quart je pense.
J'ai exploré ici les formes (A x B) y (C z D) (c'est
(8-5)*(7+1)ou(1+3)*(2-8)par exemple) et A x (B y C) z D (c'est3*(2-1)*8par exemple) ; mais pas A x B y (C z D) et (A x B) y C z D ! Il s'agit d'une part d'un jet rapide, et d'autre part ce ne serait pas pertinent en shell car je soupçonne qu'il y aura des doublons et/ou même des triplons. Cependant, avec ces ajouts, on devrait arriver aux trois mille septante douze...Petit bémol cependant : les calcul ici sont fait sur des entiers et c'est problématique pour les divisions car le hollandais volant l'entend flottant... (si j'en crois la fonction
randomizeNumbers()qui pourtant fait unMath.floor(), à moins que ce ne soit à cause duevalMath(cell1, operator, cell2)dans la fonctionevalResultat()?) Je pense pouvoir corriger cela facilement, ce qui réduira le nombre de solutions proposées."It is seldom that liberty of any kind is lost all at once." ― David Hume