Plus de résultats mais pas mal de duplications... Arriver à les anticiper et donc ne pas calculer inutilement (ce qui aurait quand même été le cas si on stockait les résultats pour au final n'en afficher que les occurrences uniques...) C'est une piste d'amélioration qui pourrait impacter positivement le temps d'exécution.
Je ferai un autre topo sur ce point plus tard.
Il faut en fait distinguer deux cas de figure...
Le premier aspect, c'est que pour une même branche/forme, on a par exemple
...qui s'explique par les permutations des nombres A, B, C, D ! Dans l'exemple, on a A=7_1, B=7_2 puis A=7_2, B=7_1 :-D On le voit mieux sur cet autre exemple (A=1, B=3 puis A=1, B=3) :
1+3=4;4+8=12;12*2=24;B33+1=4;4+8=12;12*2=24;B3
Comme on ne fait pas le stockage des résultats, il n'y a pas vraiment de correction possible ...à moins de trouver une façon de s'assurer qu'on n'a pas de doublon dans les permutations. Sachant que les permutations sont maintenant générées et non plus manuellement listées, faut donc rajouter des tests bien sentis aux bons endroits.
Le second aspect est celui des diverses formes...
J'étais parti dans l'idée d'explorer les différents arbres et comme annoncé, « plusieurs arbres peuvent être équivalent à cause de la commutativité de l'addition et de la multiplication. » C'est le cas ici :
Avec la priorité de la multiplication et de la division sur l'addition et la soustraction, mettre la première partie entre parenthèses (L1) revient au même que de ne pas mettre de parenthèses (B3) et faire séquentiellement les autres opérations... Si on met la parenthèse autour des deux premières opérations (L2) on aboutit aussi au même résultat... Ouch !
On ne peut malheureusement pas anticiper les formes égales dans notre approche exploratrice (puisqu'on était parti sur du brute force je le rappelle). Il aurait fallu lister (et catégoriser) toutes les combinaisons possibles (approche dite par tables) : c'est plus fastidieux mais plus efficace et rapide à terme. Je me note d'implémenter cela quand j'aurai un peu de temps (et si le fun y est toujours.) En l'état (approche exploratrice) on n'y peut rien :(
Ayant dit cela, le parcours par formes n'est pas compatible avec l'approche brutale qui aurait juste parcouru les opérations sans se préoccuper des formes : c'est ce que font les autres propositions (en Python et en Prolog pour l'instant), et cela correspond en fait à la forme B3 ! C'est donc la seule que devrait implémenter la variante épurée (code ci-après) et c'est la seule explorée par défaut par la nouvelle monture du script (le reste est laissé, accessible par des options, pour me permettra de satisfaire ma curiosité mathématique ...et pour vérifier les cas moins triviaux où on n'a pas de solution B3.)
# maintenantfor i1 in 1234dofor i2 in 1234dotest$i2 -eq $i1&&continuefor i3 in 1234dotest$i3 -eq $i1&&continuetest$i3 -eq $i2&&continuefor i4 in 1234dotest$i4 -eq $i1&&continuetest$i4 -eq $i2&&continuetest$i4 -eq $i3&&continue# ceci remplace le/la bloc/fonction process0for o1 in '+''-''*'dofor o2 in '+''-''*'dofor o3 in '+''-''*'dor1=$((${!i1}$o1${!i2}))r2=$(($r1$o2${!i3}))test$(($r2$o3${!i4})) -eq 24&&echo"${!i1}$o1${!i2}=$r1; $r1$o2${!i3}=$r2; $r2$o3${!i4}=24"donedonedonedonedonedonedone
Le script devenant important d'une part (même si à fonctionnement équivalent j'ai réduit le nombre de lignes) et complexe (avec pilotage maintenant par des options) d'autre part, je l'ai déplacé dans un dépôt dédié. https://framagit.org/gilcot/trouve24 Cela me permet également de garder trace des différents essais (et donc de savoir ce qui a déjà été tenté lors des prochaines améliorations.)
"It is seldom that liberty of any kind is lost all at once." ― David Hume
[^] # Re: un petit peu plus (de divisions)
Posté par Gil Cot ✔ (site web personnel, Mastodon) . En réponse au journal résoudre "trouve 24". Évalué à 2.
[...]
suite
Il faut en fait distinguer deux cas de figure...
Le premier aspect, c'est que pour une même branche/forme, on a par exemple
...qui s'explique par les permutations des nombres A, B, C, D ! Dans l'exemple, on a A=7_1, B=7_2 puis A=7_2, B=7_1 :-D On le voit mieux sur cet autre exemple (A=1, B=3 puis A=1, B=3) :
Comme on ne fait pas le stockage des résultats, il n'y a pas vraiment de correction possible ...à moins de trouver une façon de s'assurer qu'on n'a pas de doublon dans les permutations. Sachant que les permutations sont maintenant générées et non plus manuellement listées, faut donc rajouter des tests bien sentis aux bons endroits.
Le second aspect est celui des diverses formes...
J'étais parti dans l'idée d'explorer les différents arbres et comme annoncé, « plusieurs arbres peuvent être équivalent à cause de la commutativité de l'addition et de la multiplication. » C'est le cas ici :
Avec la priorité de la multiplication et de la division sur l'addition et la soustraction, mettre la première partie entre parenthèses (L1) revient au même que de ne pas mettre de parenthèses (B3) et faire séquentiellement les autres opérations... Si on met la parenthèse autour des deux premières opérations (L2) on aboutit aussi au même résultat... Ouch !
On ne peut malheureusement pas anticiper les formes égales dans notre approche exploratrice (puisqu'on était parti sur du brute force je le rappelle). Il aurait fallu lister (et catégoriser) toutes les combinaisons possibles (approche dite par tables) : c'est plus fastidieux mais plus efficace et rapide à terme. Je me note d'implémenter cela quand j'aurai un peu de temps (et si le fun y est toujours.) En l'état (approche exploratrice) on n'y peut rien :(
Ayant dit cela, le parcours par formes n'est pas compatible avec l'approche brutale qui aurait juste parcouru les opérations sans se préoccuper des formes : c'est ce que font les autres propositions (en Python et en Prolog pour l'instant), et cela correspond en fait à la forme B3 ! C'est donc la seule que devrait implémenter la variante épurée (code ci-après) et c'est la seule explorée par défaut par la nouvelle monture du script (le reste est laissé, accessible par des options, pour me permettra de satisfaire ma curiosité mathématique ...et pour vérifier les cas moins triviaux où on n'a pas de solution B3.)
Le script devenant important d'une part (même si à fonctionnement équivalent j'ai réduit le nombre de lignes) et complexe (avec pilotage maintenant par des options) d'autre part, je l'ai déplacé dans un dépôt dédié. https://framagit.org/gilcot/trouve24 Cela me permet également de garder trace des différents essais (et donc de savoir ce qui a déjà été tenté lors des prochaines améliorations.)
"It is seldom that liberty of any kind is lost all at once." ― David Hume