論理パズルの作り方

テーマ:

問題作るのって結構疲れるね。

 

『1~6までの数字が書かれたカードが合計6枚ある。A,B,C,D,E,Fくんの6人はAくんからアルファベット順に1枚ずつ好きなカードを選んで取っていく。
以下はカードを取り終えたあとの6人の会話である。
A「僕は偶数のカードを取ったよ。」
B「僕は奇数のカードを取ったよ。」
C「僕は素数のカードを取ったよ。」
D「僕は残ってるカードのうち最も大きい数字のカードを取ったよ。」
E「じゃあ僕、みんなが何を取ったかわかったよ。」
F「それなら僕も全員わかった。」
BCD「じゃあ僕達もわかったよ。」
A「1つだけ聞くね?Fくんの数字はBくんより大きい?」
F「うん」
A「あ、じゃあわかった。」
AくんからFくんはそれぞれ何番のカードを取ったでしょうか。』

※6人はカードを取るときにどのカードが残っていたかは確認できる。また6人は嘘をつかないし、論理的思考力、思考速度は十分であるものとする。

 

いわゆる論理パズルとかそういう類のもの。

 

今回はこの問題がどのように作られているかを見せながら解説をしてみる。

こういうの作るので何が難しいかって、「問題文に無駄がなく、その条件でちょうど答えが求まる」ようにしなければいけないこと。

これができてないと、

「出題者アホじゃんww」「問題間違ってね?」「~であり・・・であることからこの問題は誤りですね(キリッ」

みたいなやつらが出てきて僕の顔が赤くなってしまうのである。

この問題はツイッターに投稿してみて、どうやらOKっぽかったのでブログ掲載しました。

 

【※以下解答含みます】

 

じゃあ問題の設定を考えてみよう。

ぶっちゃけ作るの初めてだったんでシンプルにいこうと思ってカードのやつにした。

人数は・・・最初は8人にしようと思ってたんだけどちょっと多いかなと思って6人にした。

多いと解くのも面倒だし作るのもより面倒になるからね。

6人がカードをとっていくってことは全部で720通り。

これに問題文の条件を加えていって1通りになればいいわけだ。

 

自分1人で考えてると論理漏れが確実に出てくるので問題作成段階では720通り全てを考える。

excelくんに登場してもらおう。

マクロに以下のものを打ち込めば6人にカードを配ってもらえる(ググって出てきたやつパクりましたw 引用元:https://oshiete.goo.ne.jp/qa/1634838.html

 

「Const N As Integer = 6 '生成する順列数
Dim k As Long
Dim p(1 To N)
Sub perm_test()
 Dim i As Long
 ActiveSheet.Cells.ClearContents
 k = 0
 For i = 1 To N
  p(i) = i
 Next i
 perm 1
End Sub
Private Sub perm(i As Long)
 Dim j As Long, t As Long
 If i < N Then
  For j = i To N
   t = p(i): p(i) = p(j): p(j) = t
   perm i + 1
   t = p(i): p(i) = p(j): p(j) = t
  Next j
 Else
   For j = 1 To N
    Cells(k + 1, j).Value = p(j)
   Next j
   k = k + 1
 End If
End Sub」

 

するとこんな感じで出てくる。もちろん720行目までこれが続いている。

あとは好きなように条件を加えていくだけ。

今回は自分のこだわりとして問題文に「具体的な数字をいれない。」があった。「僕の数字は3だよ。」とかそういうのが入ってるとなんか露骨で嫌。だから偶数とか奇数とかぱっと見では1つも埋まらないようにした。

これをexcelのif関数とかにいれて絞っていく。でもここだけで1つに絞れなくてもいい。適度に複数パターンを残す。そうしないと論理パズルにならない。

今回の条件をいれてみると、

 

こんな感じ。4条件すべてを満たす場合にG列に「〇」満たさない場合に「×」をいれるようにしてある。

この条件だけだと「432615」とか「435621」とかいくつかのパターンが残る。

いちいち探してたらめんどくさいのでソートして、

と、この36通りらしい。うん、ちょうどいい感じ。

あとはEくんFくんの発言でうまく決まればいい。

ここからは自分も悩んだところ。紙に書きながら模擬回答者として考えてみたり、Eくんの気持ちになって考えたりしていると、

「Eくんはカードを取るとき、残り2枚。自分はカードを選べるからFくんのカードを知ってて、なくなってる4枚のカードはAからDくんのいずれかが持っている。」

ということにこの辺で気づきます。

 

じゃあEくん視点での残り2枚に注目してみると、AからDくんの並びが確定しているものがある。それらは

「15」「24」「25」「35」「45」

の5通りである。

 

Eくんが残りのカードを見てこの5通りのいずれかで、さらにDくんまでの発言を聞けば全員分わかる。

 

次にFくん視点を見ると、彼に数字の選択権はなかった。

しかし「EくんはFくんの持ってる何かともう1枚を見てわかった」ということはわかる。

 

例えばFくんが「2」の時、Eくんは「4」か「5」である。つまり「わからない」わけだが、Fくんが「3」の時、EくんがDくんまでの発言でわかるにはEくんの持ってる数字は「5」でなければならない。

E5F3とわかれば「412653」とわかるのでFくんは「それならわかった」と言える。よしこれを使おうということでFくんの発言が決まる。

しかしこのパターン2つあって、「412653」と「432651」である。これらどちらでもFくんの発言まで成立する。

というのは「この問題を見ている回答者」の気持ちであってゲーム中の彼らではない。

この2つの並びの違いであるBくんの数字はBCDくんは分かる。ゆえにBCDくんはFくんが分かったと言った段階でわかる。

自分より後ろの人が何をとったかわからないはずだけど、EくんやFくんが「わかった」と言うことでEくんが何を取ったのかわかるというのが粋ですね、うん。

この時点でわからないのはBくんがとる前にとったAくんだけである。

この辺で「そうだ。Aくんが奇数を取って、Bくんが偶数を取ればいいのでは。」という案がでた。

この場合A君の数字はゲーム中の6人はわかるためFくんの発言後全員が「ならわかった。」と言って最後のAくんのダサい発言はいらなくなるという妙案が出たが却下となった。なぜならその場合読者だけわからないという置いてけぼり状態が発生するからである。

 

ということでAくんには引き続き情弱くんになってもらことにした。

最後の1ピースをはめるためにAくんが「できるだけショートカットされないような質問」をしてもらい問題完成である。

 

と同時に答えも決まり、「412653」ということになりましたね。

 

以上です。問題作るのは面倒なだけで難易度は解くこととそんなに変わらないような気がします。(解きながら作ってるようなイメージ)

パソコンさえあれば簡単に誰でも作れると思うのでぜひ作ってみてください。

 

僕は次いつになるかわからないですが、またぼちぼち作ってみたいと思います。

AD

コメント(4)