Testez vos compétences en numératie
Le programme de télévision française Des chiffres et des lettres et son adaptation anglaise Countdown testent les compétences en numératie des concurrents. Construisons une version simple de ce jeu et résolvons-le avec la nouvelle fonction Groupings.
Spécifiez les opérations arithmétiques qui peuvent être utilisées pour effectuer les calculs.
![Click for copyable input](assets.fr/test-your-numeracy-skills/In_79.png)
ops = {Plus, Subtract, Times, Divide};
Générez une liste de 4 nombres choisis au hasard à partir d'un ensemble de nombres donné.
![Click for copyable input](assets.fr/test-your-numeracy-skills/In_80.png)
numbers = RandomChoice[{1, 2, 3, 5, 7, 10}, 4]
![](assets.fr/test-your-numeracy-skills/O_82.png)
Le total obtenu à partir de ces nombres et de ces opérations est également généré de manière aléatoire.
![Click for copyable input](assets.fr/test-your-numeracy-skills/In_81.png)
total = RandomInteger[100]
![](assets.fr/test-your-numeracy-skills/O_83.png)
Construisez toutes les façons possibles d'utiliser chaque nombre une fois, en gardant à l'esprit que l'ordre a de l'importance pour certaines opérations arithmétiques.
![Click for copyable input](assets.fr/test-your-numeracy-skills/In_82.png)
orderings = Flatten[Permutations /@ Subsets[numbers, {4}], 1]
![](assets.fr/test-your-numeracy-skills/O_84.png)
Générez ensuite toutes les combinaisons possibles de chaque ordre avec les opérations binaires données.
![Click for copyable input](assets.fr/test-your-numeracy-skills/In_83.png)
candidates = Groupings[orderings, ops -> 2, HoldForm];
Certains candidats produisent des ComplexInfinity en raison de la division par 0. Ces messages peuvent être éliminés en utilisant Quiet.
![Click for copyable input](assets.fr/test-your-numeracy-skills/In_84.png)
results = Quiet@ReleaseHold[candidates];
Voici le nombre de combinaisons produisant le total demandé.
![Click for copyable input](assets.fr/test-your-numeracy-skills/In_85.png)
combinations = Thread[Equal[candidates, results]];
Count[Thread[Equal[candidates, results]], _ == total]
![](assets.fr/test-your-numeracy-skills/O_85.png)
Voici une des combinaisons possibles.
![Click for copyable input](assets.fr/test-your-numeracy-skills/In_86.png)
FirstCase[combinations, _ == total]
![](assets.fr/test-your-numeracy-skills/O_86.png)
Dans certains cas, il n'est pas possible d'obtenir le total exact.
![Click for copyable input](assets.fr/test-your-numeracy-skills/In_87.png)
total2 = 76;
Count[combinations, _ == total2]
![](assets.fr/test-your-numeracy-skills/O_87.png)
Mais nous pouvons chercher les meilleures approximations parmi les résultats en utilisant la fonction Nearest.
![Click for copyable input](assets.fr/test-your-numeracy-skills/In_88.png)
total2 = 76;
Count[combinations, _ == total2];
DeleteCases[results, ComplexInfinity];
DeleteDuplicates@Nearest[%, total2]
![](assets.fr/test-your-numeracy-skills/O_88.png)