Язык Wolfram Language

Основной язык программирования

Проверка Ваших математических способностей

Французская телепрограмма Des chiffres et des lettres и её английская адаптация Countdown проверяют математические способности участников. Создайте простую версию данной игры и решите её при помощи новой функции Groupings.

Укажите арифметические действия, которые могут использоваться для выполнения вычислений.

In[1]:=
Click for copyable input
ops = {Plus, Subtract, Times, Divide};

Сгенерируйте список из 4 случайно выбранных чисел из заданного набора чисел.

In[2]:=
Click for copyable input
numbers = RandomChoice[{1, 2, 3, 5, 7, 10}, 4]
Out[2]=

Общее число, полученное в результате выполнения действий над этими числами также сгенерировано случайно.

In[3]:=
Click for copyable input
total = RandomInteger[100]
Out[3]=

Создайте все возможные способы использования каждого числа один раз, принимая во внимание, что порядок имеет значение для некоторых арифметических действий.

In[4]:=
Click for copyable input
orderings = Flatten[Permutations /@ Subsets[numbers, {4}], 1]
Out[4]=

Сгенерируйте все возможные комбинации каждого порядка с заданными двоичными действиями..

In[5]:=
Click for copyable input
candidates = Groupings[orderings, ops -> 2, HoldForm];

Некоторые кандидаты выдают сообщения ComplexInfinity при делении на 0, и могут быть удалены при помощи Quiet.

In[6]:=
Click for copyable input
results = Quiet@ReleaseHold[candidates];

Далее представлена группа комбинаций, производящих запрошенное общее число.

In[7]:=
Click for copyable input
combinations = Thread[Equal[candidates, results]]; Count[Thread[Equal[candidates, results]], _ == total]
Out[7]=

Это одна из возможных комбинаций.

In[8]:=
Click for copyable input
FirstCase[combinations, _ == total]
Out[8]=

Получить точное общее число может быть невозможно в некоторых случаях.

In[9]:=
Click for copyable input
total2 = 76; Count[combinations, _ == total2]
Out[9]=

Но Вы можете попробовать найти наилучшее приближенное значение среди результатов при помощи функции Nearest.

In[10]:=
Click for copyable input
total2 = 76; Count[combinations, _ == total2]; DeleteCases[results, ComplexInfinity]; DeleteDuplicates@Nearest[%, total2]
Out[10]=

Родственные примеры

de en es fr ja ko pt-br zh