自動解答系の作り方(3)

 数学のセンター試験はいわゆる空所補充,つまり,問題文自体が数学的な主張になっているものが殆どです.また,一部の並び順を除けは正解は一意的です.従って,その主張をMathematicaの流儀による論理式に書き換えさえすれば,後はループを用いて空欄に選択肢を順次当てはめ,Reduceなどが初めてTrueを返した組が正解という訳です.

 このうち,Reduceについては内部精度を下げることにより処理時間が短縮される可能性もありますが,ひとまずデフォルトで用いています.ループについては,最後まで行うならListにMapするのが速いのですが,今回はTrueが出た時点で終了なので,ループの外にGotoさせています(コードとしてはBreakやCatch,Throwを用いた方が良いのですが,他にもGotoさせる処理があるので揃えました).ループの種類はDoです.

 選択肢は

 1桁の場合 正解が0となるケースは稀なので,1から9,

 桁数が複数の場合 最高位は-1または1から9,それに続く位は0から9

としました.最高位が-1の場合は残りの部分の表す10進数の-1倍として渡します.この場合直後の位の選択肢は1から9とすべきですが,空転とそれを避ける為の処理のコストを鑑みそのままにしています.なお,選択肢が数でない場合には,それらを要素とするListを作り,反復変数をそのインデックスとすることで対応します.