Teste suas habilidades matemáticas
O programa de TV francês "Des Chiffres et Des Lettres" e sua adaptação inglesa "Countdown" testa competidores em suas habilidades matemáticas. Vamos construir uma versão simples deste jogo, e resolvê-lo com a nova função Groupings.
Especifique as operações aritméticas que podem ser usadas para fazer os cálculos.
![Click for copyable input](assets.pt-br/test-your-numeracy-skills/In_79.png)
ops = {Plus, Subtract, Times, Divide};
Gere uma lista de 4 números escolhidos aleatoriamente de um determinado conjunto de números.
![Click for copyable input](assets.pt-br/test-your-numeracy-skills/In_80.png)
numbers = RandomChoice[{1, 2, 3, 5, 7, 10}, 4]
![](assets.pt-br/test-your-numeracy-skills/O_82.png)
O total a ser gerado a partir desses números e operações, também é gerado aleatoriamente.
![Click for copyable input](assets.pt-br/test-your-numeracy-skills/In_81.png)
total = RandomInteger[100]
![](assets.pt-br/test-your-numeracy-skills/O_83.png)
Construa todas as maneiras possíveis de usar cada número no máximo uma vez, tendo em mente que a ordem é necessária para algumas das operações aritméticas.
![Click for copyable input](assets.pt-br/test-your-numeracy-skills/In_82.png)
orderings = Flatten[Permutations /@ Subsets[numbers, {4}], 1]
![](assets.pt-br/test-your-numeracy-skills/O_84.png)
Gere todas as combinações possíveis de cada ordenação com as operações binárias determinadas.
![Click for copyable input](assets.pt-br/test-your-numeracy-skills/In_83.png)
candidates = Groupings[orderings, ops -> 2, HoldForm];
Alguns candidatos produzem ComplexInfinity porque divide por 0, portanto, calculamos todos os agrupamentos com um Quiet.
![Click for copyable input](assets.pt-br/test-your-numeracy-skills/In_84.png)
results = Quiet@ReleaseHold[candidates];
Aqui está o número de combinações que produz o total solicitado.
![Click for copyable input](assets.pt-br/test-your-numeracy-skills/In_85.png)
combinations = Thread[Equal[candidates, results]];
Count[Thread[Equal[candidates, results]], _ == total]
![](assets.pt-br/test-your-numeracy-skills/O_85.png)
Esta é uma das combinações possíveis.
![Click for copyable input](assets.pt-br/test-your-numeracy-skills/In_86.png)
FirstCase[combinations, _ == total]
![](assets.pt-br/test-your-numeracy-skills/O_86.png)
Pode ser que não seja possível obter o total exato em alguns casos.
![Click for copyable input](assets.pt-br/test-your-numeracy-skills/In_87.png)
total2 = 76;
Count[combinations, _ == total2]
![](assets.pt-br/test-your-numeracy-skills/O_87.png)
Mas você pode olhar para as melhores aproximações entre os resultados usando a função Nearest.
![Click for copyable input](assets.pt-br/test-your-numeracy-skills/In_88.png)
total2 = 76;
Count[combinations, _ == total2];
DeleteCases[results, ComplexInfinity];
DeleteDuplicates@Nearest[%, total2]
![](assets.pt-br/test-your-numeracy-skills/O_88.png)