パズルの自動生成
Q1: OOJJ + JJJJJOJJ = JJOJOJJJ OOJJOOJ + OJOOOOJJ = OJJJOOOOJ JOJJJJJOJ + OJOJJJ = JJJOJJOJJ JOJJJJJ + OJOOOOJJJ = ? 1: JJJJOOJOOJ 2: OOOJJJOOOJ 3: OJOOJJOOOJ 4: JJJJJJOOOJ 5: JJOJOOJOOJ answer?>>>
ここのところいくつかネット上でできるIQテストなどをプレイしていて理解したんだけども、「正しいIQ」なんてものがそもそも存在しないわけなので、当然のようにそれらのIQテストは「正しいIQを測定するためのテスト」ではない。じゃあIQテストをプレイするベネフィットはなんなのかって言うと「適度な粒度のパズルを解く楽しみ」と「スコアが表示されて友達と競うことができる」ってことなんだろう。
Q2: OPOL + OPOE = OFOEOL OUOL + OPOE = OPOEOUOL OUOL + OPOEOU = OPOCOL OPOCOL + OE = ? 1: OP 2: OFOCOEOL 3: OFOCOL 4: OPOCOEOL 5: OPOEOU answer?>>>
で、だ。IQテストにでてくるようなパズルには、何らかのモデルがあって、それをどう表現するかという記法があって、そのそれぞれにいくつかのパラメータがある。複数のモデルを結合することによって作られるモデルもある。記法は何らかの値から最終的に人間の目に触れる形への変換規則なので、最後の変換が人間に見える形の出力をすることだけ保証すれば複数の変換の組み合わせでも作ることができる。
たとえば、1,2,1,2,1,2,? ってのはシンプルな周期的モデルとシンプルな表示によって作られた問題。1,2,3,1,2,3,?も同じ。この2つのモデルを「加算合成」したモデルからは 2,4,4,3,3,5,?という問題ができる。「文字列として結合」したモデルからは11,22,13,21,12,23,?という問題ができる。1,2,1,2のモデルに「同一数値が同一記号に対応するような換字暗号」という変換を掛ければ ◎,×,◎,×,?という問題になる。
Q3: NIRHVKVB + RIVHNKRB = VOVIVYVH NHRKRB + NIVYNHRB = NINYVHNB RINYRHRK + RYVHVKNB = VONYVHNB RIRYNHNKVB + VIVYRHVK = ? 1: VOVIVYVHRKVB 2: VOVIVYNHRKVB 3: VOVIVYNHNKVB 4: VOVIVYVH 5: VOVIVYVHVKNB answer?>>>
というわけで、ランダムにパラメータを組み合わせて作るだけで「見たことのない問題」を次々出力するプログラムを作ることは不可能じゃない。もちろん、モデルまで看破できる人にとっては「パラメータが変わっただけで同じモデルじゃないか」って見えるんだろうけど、それはIQTest.dkとかでも同じで某チャットではさんざん「行列式のパターンばっかりですね」「xor多すぎだろ」なんて話になってたし。
Q4: NNNNWWN + NNWWNNWN = WNWWWWWWN NWNNWNWWN + WNNWNNWN = NNWWWNNNN NNNWNWWN + WWNWNNWWN = NNWNWWNNN NWWNWWNN + WNNWWWNWN = ? 1: WWWNWWWWWN 2: NNNNWWWWWN 3: NNNNNWWWWN 4: NNWNNWWWWN 5: WNWWWWWWWN
まあしかし、問題を作成するところまではできたが、それの難易度と回答可能かどうかのチェックが難しい。パラメータがランダムに選ばれるので見たことがない問題であるのは事実なのだけど、作者である以上モデルの構造について若干の知識があるわけで、本当に始めてプレイする人と比べるとヒントが多い。とりあえず僕が解けるかどうかを試して、解けない問題はヒント不足ということではじくつもりでいたが、今までのところ解けない問題がでていない。ランダムに生成された4つの問題が上に掲載されているもの。ヒントが足りなかったときに追加を要求する機能を実装したのに、全部3つのヒントで十分解けてしまった。「作者が解けるかどうか」だけでは難易度チェックとしては不足だなぁ。
少なくとも作者である僕が計算用紙を出してゴリゴリ書かないといけないQ2とQ3の難易度は難しすぎるに違いない。Q2は計算用紙に書いて「ヒントが足りなくて解けないんじゃないか?」と考えた挙句に、一般には解けないけど質問されている問題に関しては簡単に解けることに気づいた。Q3はいい感じのもつれ具合でヒントと回答の選択肢を総動員してギリギリ一般的に解ける感じ。内部モデルについての解説を入れると丁度いい難易度になるのかも知れないなぁ。むー。
とりあえず解答を載せずに問題だけ公開する。しばらくしてからヒントを載せる。あと「作者が解くのにかかる時間」はある程度難易度との相関があるだろうから計測するといいな。それから、もっと簡単な「誰でも解けるだろ」ってモデルを作ってからそれをひねって難しくするバージョンを作るべきだな。今回のは与えたモデルが複雑すぎる。
~$ time python iqtest_1.py FDFW + FRFYXH = FRFDFWFYXH XDXW + FRFDXW = XRFDFW XRFWXH + XRXDFWXY = FCFRXDXWXYXH FRXDFWXY + FDFWFH = ? 1: XRFDFWFH 2: XRXWXYFH 3: XRXW 4: XRFWFY 5: XRFDFWFYXH answer?>>> *** Good! real 2m39.281s user 0m0.020s sys 0m0.016s