• [^] # Re: un petit peu plus (de divisions)

    Posté par (site web personnel, Mastodon) . En réponse au journal résoudre "trouve 24". Évalué à 2.

    [3615 mavie]

    [...]
    suite

    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

    7*7=49; 49-1=48; 48/2=24; B3
    7*7=49; 49-1=48; 48/2=24; B3

    ...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; B3
    3 + 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.

     # initialement
    explore_all 1ドル 2ドル 3ドル 4ドル
    explore_all 1ドル 2ドル 4ドル 3ドル
    explore_all 1ドル 3ドル 2ドル 4ドル
    explore_all 1ドル 3ドル 4ドル 2ドル
    explore_all 1ドル 4ドル 2ドル 3ドル
    explore_all 1ドル 4ドル 3ドル 2ドル
    explore_all 2ドル 1ドル 3ドル 4ドル
    explore_all 2ドル 1ドル 4ドル 3ドル
    explore_all 2ドル 3ドル 1ドル 4ドル
    explore_all 2ドル 3ドル 4ドル 1ドル
    explore_all 2ドル 4ドル 1ドル 3ドル
    explore_all 2ドル 4ドル 3ドル 1ドル
    explore_all 3ドル 1ドル 2ドル 4ドル
    explore_all 3ドル 1ドル 4ドル 2ドル
    explore_all 3ドル 2ドル 1ドル 4ドル
    explore_all 3ドル 2ドル 4ドル 1ドル
    explore_all 3ドル 4ドル 1ドル 2ドル
    explore_all 3ドル 4ドル 2ドル 1ドル
    explore_all 4ドル 1ドル 2ドル 3ドル
    explore_all 4ドル 1ドル 3ドル 2ドル
    explore_all 4ドル 2ドル 1ドル 3ドル
    explore_all 4ドル 2ドル 3ドル 1ドル
    explore_all 4ドル 3ドル 1ドル 2ドル
    explore_all 4ドル 3ドル 2ドル 1ドル
     # maintenant
    for i1 in 1 2 3 4
    do
     for i2 in 1 2 3 4
     do
     test $i2 -eq $i1 && continue
     for i3 in 1 2 3 4
     do
     test $i3 -eq $i1 && continue
     test $i3 -eq $i2 && continue
     for i4 in 1 2 3 4
     do
     test $i4 -eq $i1 && continue
     test $i4 -eq $i2 && continue
     test $i4 -eq $i3 && continue
     # mettre les test de doublons ici ?
     explore_all "${!i1}" "${!i2}" "${!i3}" "${!i4}"
     done
     done
     done
    done

    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 :

    7*7=49; 49-1=48; 48/2=24; B3
    7*7=49; 49-1=48; 48/2=24; L1
    7*7=49; 49-1=48; 48/2=24; L2

    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.)

     # maintenant
    for i1 in 1 2 3 4
    do
     for i2 in 1 2 3 4
     do
     test $i2 -eq $i1 && continue
     for i3 in 1 2 3 4
     do
     test $i3 -eq $i1 && continue
     test $i3 -eq $i2 && continue
     for i4 in 1 2 3 4
     do
     test $i4 -eq $i1 && continue
     test $i4 -eq $i2 && continue
     test $i4 -eq $i3 && continue
     # ceci remplace le/la bloc/fonction process0
     for o1 in '+' '-' '*'
     do
     for o2 in '+' '-' '*'
     do
     for o3 in '+' '-' '*'
     do
     r1=$(( ${!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"
     done
     done
     done
     done
     done
     done
    done

    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