毒ワインとソムリエのジレンマ
はじめに
ライアーゲームを見ながら、私もゲーム(論理パズル)を創作してみました。
とはいっても、マネーの奪い合いでもなければ、問題文にない条件や設定を持ち込むような意地悪クイズでもありません。論理的にお考えいただければ幸いです。
宜しければ挑戦してみて下さいね(*´ω`*)
問題
ある国の王様が、処刑予定となっている4人の囚人を集めてこう言いました。
「お前達の中に1人ソムリエがいるそうだな。そこで、こんなゲームを思いついた。見事勝ち残ることができた者は処刑を免除し、負けた者はそれをもって処刑とする。では、ルールを説明しよう。これより1人ずつ順番に処刑場へ連行する。その途中、ワイン蔵に立ち寄らせるので、自分以外の3人に飲ませたいワインを3つのグラスに注いで処刑場まで運んでもらう。そこには4種類のワインとそれぞれのワイン専用のグラスが用意されている。 全てのワインとグラスに1番から4番のいずれかの刻印があり、同じ番号同士なら専用ということだ。言うまでもないが専用ではないグラスにワインを注ぐことを禁止する。どの番号も必ず1種類のワインと4個以上のグラスに刻印されており、4種類中1種類に致死性の高い毒を入れさせてもらった。ちなみに蔵を1人出るたび、ワインやグラスの配置を整え並び替える。割ったり傷つけたりは即刻処刑だ。そして処刑場に全員揃ったら3人から1杯ずつ受け取り、3杯全て飲み干さない者も処刑する。それでは準備が整うまで、連行する順番を相談する時間を与えてやろう。」
さて、ソムリエには飲まなくても毒ワインを見抜く能力があり、それ以外の3人にはワインの知識すらありません。囚人達は「自分が助かる確率が少しでも上がることを最優先し、そのときに限り協力しあう」ものとして最善策をお考え下さい。
最善策への道
最善策を問われていますので、100%全員が助かる方法から考えてみます。
もしそのような方法があるなら、反対する囚人はいませんよね。
まずは各ワインの量について。「種類」という表現しかされていませんので「量」が分かりません。とは言え、さすがに問題文にない条件や設定を後付するような出題は論理パズルとして反則ですね。意識する必要がない=十分な量があるとみましょう。
(突然の災害で処刑どころではなくなることまで意識しなくてよいのと同じです。)
ワインの専用グラスの数はどうでしょうか。
4種類×4個以上=16個以上
うち、安全なワインの分については
3種類×4個以上=12個以上
4人×3杯=12杯 をカバーできる個数であることが確認できます。
最初に連行されるのがソムリエ以外だった場合は、毒を見抜くことができません。
誰かが毒を飲む可能性が出てしまうため、これはNGです。
しかし、ソムリエだった場合は毒を見抜くことができますので、安全なワイン3杯を注ぐことができます。但し後に続く3人が毒を注いでしまっては自分が危ないので、なんとかして毒入りワインを次の人に伝えなければなりません。
自分の意志でコントロールできるのは3杯分のワインの選択のみ。つまり各グラスの残数です。それを4種類のうちの1種類に対応させる方法を考えてみましょう。
最善策への道 ~準最善策編~
見ずに考えたい方は見ないほうがよいかも?
すぐに思いつくのは全てのグラスの総数を数えて4で割った余りをそれぞれ4種類に対応させる方法。但し、単純に数えて割るだけではうまくいきません。なぜならば、3杯注いでグラスを減らしたときの余りは3個ズレるだけなので、自由に操ることができないからです。
自由に操るためには、注ぐワインの番号によって余りを変化させる必要があります。つまり、番号ごとのグラスの数え方に差をつけることで「4で割った余り」に影響を与えるのです。
では、1番のグラスなら1個ずつ、2番なら1個で2個分、3番なら1個で3個分、4番は数えない(4個分数えても4で割った余りに影響しないため)というルールで3杯注ぐと「4で割った余り」はどう変化するのか見てみましょう。
3 | 0 | 0 | 0 | → | 2 | 3 | 0 | 1 |
0 | 2 | 1 | 0 | |||||
1 | 0 | 2 | 0 | |||||
0 | 0 | 1 | 2 | |||||
1 | 1 | 0 | 1 | |||||
0 | 3 | 0 | 0 | → | 3 | 0 | 1 | 2 |
2 | 0 | 0 | 1 | |||||
0 | 0 | 2 | 1 | |||||
0 | 1 | 0 | 2 | |||||
1 | 1 | 1 | 0 | |||||
0 | 0 | 3 | 0 | → | 0 | 1 | 2 | 3 |
2 | 0 | 1 | 0 | |||||
1 | 2 | 0 | 0 | |||||
1 | 0 | 0 | 2 | |||||
0 | 1 | 1 | 1 | |||||
0 | 0 | 0 | 3 | → | 1 | 2 | 3 | 0 |
2 | 1 | 0 | 0 | |||||
0 | 2 | 0 | 1 | |||||
0 | 1 | 2 | 0 | |||||
1 | 0 | 1 | 1 | |||||
注ぎ方 | 余りの変化 | |||||||
---|---|---|---|---|---|---|---|---|
1番 | 2番 | 3番 | 4番 | 1 ↓ |
2 ↓ |
3 ↓ |
0 ↓ |
ここで一つ、気をつけておきたい点があります。それは、いずれかのグラスの個数が最低数の4個だった場合です。4人とも毒以外のワイン3種類からそれぞれ1杯ずつしか注がないのであれば足りなくなることはありません。しかし、実際には上の表のようにほとんどのケースで2杯以上注ぐグラスが出てくるため、減らすべきグラスが足りなくなることも想定しておく必要があります。
シンプルな解決策としては、毒ワイン以外の3種類のうち「2杯以上注いでもOKなワインを1種類に限定」することです。他のワインは多くても1杯ずつしか注がないためそちらのグラスはなくなりません。すなわちなくなる可能性があるワインはその限定したワインのみですので、毒ワインの番号との対応関係を作っておきましょう。むしろ該当する番号のグラスが3個以下になっていたら積極的に使い切ってOK。
グラスのなくなったワインがあるということは毒ワインを特定できますので、もう「4で割った余り」は気にしなくてよいです。安全なワインのグラスは確実に全員分ありますから、最後の1人以外は残る2種類のワインのグラスがなくならない範囲で自由に注ぐことができます。
そこまで加味すると次のような注ぎ方がベターでしょう。
1番が毒のとき(4で割った余りを1にしたい)
- 現在 4で割った余りが1 なら2番を2杯と4番を1杯
- 現在 4で割った余りが2 なら2番と3番と4番を1杯ずつ
- 現在 4で割った余りが3 なら2番を3杯
- 現在 4で割った余りが0 なら2番を2杯と3番を1杯
2番が毒のとき(4で割った余りを2にしたい)
- 現在 4で割った余りが1 なら1番を3杯
- 現在 4で割った余りが2 なら1番と3番と4番を1杯ずつ
- 現在 4で割った余りが3 なら1番を2杯と3番を1杯
- 現在 4で割った余りが0 なら1番を2杯と4番を1杯
3番が毒のとき(4で割った余りを3にしたい)
- 現在 4で割った余りが1 なら4番を2杯と2番を1杯
- 現在 4で割った余りが2 なら4番と1番と2番を1杯ずつ
- 現在 4で割った余りが3 なら4番を3杯
- 現在 4で割った余りが0 なら4番を2杯と1番を1杯
4番が毒のとき(4で割った余りを0にしたい)
- 現在 4で割った余りが1 なら3番を3杯
- 現在 4で割った余りが2 なら3番と2番と1番を1杯ずつ
- 現在 4で割った余りが3 なら3番を2杯と1番を1杯
- 現在 4で割った余りが0 なら3番を2杯と2番を1杯
いずれかのグラスがなくなっているとき
- 1番がなくなっていたら毒は2番
- 2番がなくなっていたら毒は1番
- 3番がなくなっていたら毒は4番
- 4番がなくなっていたら毒は3番
毒以外の2種類のグラスがなくならないよう自由に注ぎます。
「なくなっていたら毒を示すグラス」が3個以下のとき
- そのグラスを使い切っても3杯に満たない場合には毒以外の2種類のグラスがなくならないよう自由に注ぎます。
ややこしながらも、100%全員が助かる必勝法が完成しましたヽ(=´▽`=)ノ
余談ではありますが「割ったり傷つけたりは即刻処刑だ」とあるので4で「割った」時点で処刑されちゃうかもしれませんね。。。 いや、冗談ですケド(笑)
ところで、この問題で問われているのは「最善策」でした。何か改良できそうな点はないでしょうか。例えば、グラスごとに数え方を変える手間や4で割った余りを出す手間は簡略化したいところ。実は「4で割った余り」の代わりに「2で割った余り」すなわち「奇数か偶数か」の対を組み合わせて4通りに集約させることで、それらの煩わしさを解消することができるのです。
最善策
答え合わせ、または、ギブアップする方はどうぞ。
1番から4番の中から3種類選びます。選び方は自由ですが今回は2番、3番、4番を選ぶことにして、以降それに合わせた説明をしていきますね。
2番、3番、4番の各グラスの個数が奇数か偶数かを調べて仲間ハズレになる番号を探すと4パターンに分類できるので、以下のように毒の番号と結びつけましょう。
- 1番が毒:仲間ハズレがない
- 2番が毒:2番だけ仲間外れ
- 3番が毒:3番だけ仲間外れ
- 4番が毒:4番だけ仲間外れ
この関係を保つように3杯注ぐことは非常にシンプルかつ直感的に行えます。文章で表現するならば、次のような感じになるでしょうか。
- 毒以外の3種類の中に、「1杯注ぐだけで目的の仲間ハズレ状態にすることができるグラス」が存在するならその1杯を注ぎ、残り2杯はグラスの残り数になるべく余裕のある1種類(毒以外ならどれでも)を選んで注ぐ。存在しないなら毒以外の3種類を1杯ずつ注ぐ。
4人目については次に毒を伝える必要がないため毒以外を自由に3杯注げばよく、従ってこのルールは3人目までが遵守すれば問題ありません。
以上の情報を4人で共有して実行することが(少なくとも現在私の考えうる範囲で)最善策です。さらなる改良・最善策があれば是非教えて下さいませ(*´ω`*)
ちなみに分かる方限定のネタで恐縮なのですが、「2番から4番の中から仲間ハズレを探す」という単純な作業は、実は「全てのグラスから排他的論理和を取る」ことと本質的に同じなんです。この最善策においては、1番グラスを00、2番グラスを01、3番グラスを10、4番グラスを11として全てのグラスから1つずつ排他的論理和を取ってみていただければ「全く同じ」であることがお分かりいただけると思います。 から (、整数)の全ての二進整数の排他的論理和を取ると になるため、1つだけ「仲間ハズレ」があればそのまんま透けて見えるってワケですね。
もちろんこれらは仕組みを悪用すると「毒ワインを注ぎつつ毒の位置を正しく示す」という裏切り行為が可能です。また最後に入る囚人は次に伝える必要がないため毒を注ぎ放題。もし私がライアーゲームの脚本家ならこれを利用して話を盛り上げるか、マネーで契約させるなどの要素で封じていたかも知れませんね。
ここでは問題文に「自分が助かる確率が少しでも上がることを最優先し、そのときに限り協力しあう」という前提があるので、協力しあってもらいましょう。