계산 능력 테스트
프랑스 TV 쇼 Des Chiffres et des Lettres와 영국 버전인 Countdown은 참가자의 계산 능력을 테스트합니다. 이 게임의 간단한 버전을 구성하고 새로운 함수 Groupings를 사용하여 문제를 해결해봅니다.
계산에 사용할 수 있는 산술 연산을 지정합니다.
In[1]:=
ops = {Plus, Subtract, Times, Divide};
지정된 숫자의 집합에서 임의로 선택한 네개의 숫자 목록을 생성합니다.
In[2]:=
numbers = RandomChoice[{1, 2, 3, 5, 7, 10}, 4]
Out[2]=
이러한 숫자와 작업에서 얻을 결과 역시 무작위로 생성됩니다.
In[3]:=
total = RandomInteger[100]
Out[3]=
각 숫자를 한 번만 사용할 수 있는 가능한 모든 방법을 구축합니다. 순서가 중요한 부분을 차지하는 산술 작업이 있는점을 유의해야합니다.
In[4]:=
orderings = Flatten[Permutations /@ Subsets[numbers, {4}], 1]
Out[4]=
지정된 바이너리 조작의 각 순서에 대한 가능한 모든 조합을 생성합니다.
In[5]:=
candidates = Groupings[orderings, ops -> 2, HoldForm];
후보 중 0의 나눗셈을 위해 ComplexInfinity 메시지가 표시되는 경우도 있으며, Quiet을 사용하여 메시지를 제거할 수 있습니다.
In[6]:=
results = Quiet@ReleaseHold[candidates];
요구된 결과를 도출하는 조합의 수는 다음과 같습니다.
In[7]:=
combinations = Thread[Equal[candidates, results]];
Count[Thread[Equal[candidates, results]], _ == total]
Out[7]=
가능한 조합 중 하나를 살펴봅니다.
In[8]:=
FirstCase[combinations, _ == total]
Out[8]=
경우에 따라서는 정확한 결과를 얻을 수없는 경우도 발생할 수 있습니다.
In[9]:=
total2 = 76;
Count[combinations, _ == total2]
Out[9]=
그러한 경우에도 Nearest를 사용하여 결과 중에서 최적의 근사값을 찾을 수있습니다.
In[10]:=
total2 = 76;
Count[combinations, _ == total2];
DeleteCases[results, ComplexInfinity];
DeleteDuplicates@Nearest[%, total2]
Out[10]=