Проверка Ваших математических способностей
Французская телепрограмма Des chiffres et des lettres и её английская адаптация Countdown проверяют математические способности участников. Создайте простую версию данной игры и решите её при помощи новой функции Groupings.
Укажите арифметические действия, которые могут использоваться для выполнения вычислений.
![Click for copyable input](assets.ru/test-your-numeracy-skills/In_79.png)
ops = {Plus, Subtract, Times, Divide};
Сгенерируйте список из 4 случайно выбранных чисел из заданного набора чисел.
![Click for copyable input](assets.ru/test-your-numeracy-skills/In_80.png)
numbers = RandomChoice[{1, 2, 3, 5, 7, 10}, 4]
![](assets.ru/test-your-numeracy-skills/O_82.png)
Общее число, полученное в результате выполнения действий над этими числами также сгенерировано случайно.
![Click for copyable input](assets.ru/test-your-numeracy-skills/In_81.png)
total = RandomInteger[100]
![](assets.ru/test-your-numeracy-skills/O_83.png)
Создайте все возможные способы использования каждого числа один раз, принимая во внимание, что порядок имеет значение для некоторых арифметических действий.
![Click for copyable input](assets.ru/test-your-numeracy-skills/In_82.png)
orderings = Flatten[Permutations /@ Subsets[numbers, {4}], 1]
![](assets.ru/test-your-numeracy-skills/O_84.png)
Сгенерируйте все возможные комбинации каждого порядка с заданными двоичными действиями..
![Click for copyable input](assets.ru/test-your-numeracy-skills/In_83.png)
candidates = Groupings[orderings, ops -> 2, HoldForm];
Некоторые кандидаты выдают сообщения ComplexInfinity при делении на 0, и могут быть удалены при помощи Quiet.
![Click for copyable input](assets.ru/test-your-numeracy-skills/In_84.png)
results = Quiet@ReleaseHold[candidates];
Далее представлена группа комбинаций, производящих запрошенное общее число.
![Click for copyable input](assets.ru/test-your-numeracy-skills/In_85.png)
combinations = Thread[Equal[candidates, results]];
Count[Thread[Equal[candidates, results]], _ == total]
![](assets.ru/test-your-numeracy-skills/O_85.png)
Это одна из возможных комбинаций.
![Click for copyable input](assets.ru/test-your-numeracy-skills/In_86.png)
FirstCase[combinations, _ == total]
![](assets.ru/test-your-numeracy-skills/O_86.png)
Получить точное общее число может быть невозможно в некоторых случаях.
![Click for copyable input](assets.ru/test-your-numeracy-skills/In_87.png)
total2 = 76;
Count[combinations, _ == total2]
![](assets.ru/test-your-numeracy-skills/O_87.png)
Но Вы можете попробовать найти наилучшее приближенное значение среди результатов при помощи функции Nearest.
![Click for copyable input](assets.ru/test-your-numeracy-skills/In_88.png)
total2 = 76;
Count[combinations, _ == total2];
DeleteCases[results, ComplexInfinity];
DeleteDuplicates@Nearest[%, total2]
![](assets.ru/test-your-numeracy-skills/O_88.png)