パソコン活用研究5番街(Visual Basic、Excel(VBA)、BASIC プログラミング研究)

Short Program 推論の問題〜自分の帽子の色が分かるのは誰? (準備中)


自分の帽子の色が分かるのは誰? という問題をプログラムで解いてみる。

もともとの問題は、「自分の帽子の色が分かるのは誰?」にある通りですが、
ここでは、以下を求めるプログラムを作れ、という問題に置き換えてみます。


以下の前提条件のもと、A,B,C,Dの帽子の色を入力した時に、自分の帽子の色が分かる人を出力せよ。

前提条件
・4人(ABCD)は、赤or青のどちらかの帽子をかぶっている(帽子の色は知らない)
・帽子の数は赤2つ、青2つ。4人とも、このことを知っている。また、誰がどの位置にいるのかも全員知っている
・4人は後ろを振り向いてはならず、動いてはいけない(自分の帽子の色を確認することはできない)
・Cは目の前にいるBの帽子の色を見ることができ、DはCとBの帽子の色を見ることができる。AとB,C,Dの間には壁があり、Aは誰の帽子の色も見ることができない
・自分がかぶっている帽子の色がわかった時だけ、自分の帽子の色を叫んでよい。その声はABCDの全員が聞くことができる。

入力値は、以下の例のように、カンマ区切りで4人の帽子の色をblueまたはredで指定する。
(入力例) blue,red,red,blu

10 cls
20 dim fact$(4),a$(4),b$(4),c$(4),d$(4)
25 a=0:b=1:c=2:d=3
30 for i=0 to 3
40 a$(i)="unknown":b$(i)="unknown":c$(i)="unknown":d$(i)="unknown"
50 next
60 input fact$(a),fact$(b),fact$(c),fact$(d)
100 rem 前提条件 
110 c$(b)=fact$(b):d$(b)=fact$(b):d$(c)=fact$(c)
120 rem Dの推論
130 if d$(b)="red" and d$(c)="red" then d$(a)="blue":d$(d)="blue": print"D:blue":a$(d)="blue":b$(d)="blue":c$(d)="blue"
140 if d$(b)="blue" and d$(c)="blue" then d$(a)="red":d$(d)="red": print"D:red":a$(d)="red":b$(d)="red":c$(d)="red"
150 rem Cの推論
160 if c$(d)="red" then c$(a)="red":c$(c)="blue":print"C:blue":a$(c)="blue":b$(c)="blue"
170 if c$(d)="blue" then c$(a)="blue":c$(c)="red":print"C:red":a$(c)="red":b$(c)="red"
180 if c$(d)="unknown" then if c$(b)="red" then c$(c)="blue":print"C:blue": a$(c)="blue":b$(c)="blue"
190 if c$(d)="unknown" then if c$(b)="blue" then c$(c)="red":print"C:red": a$(c)="red":b$(c)="red"
200 rem Bの推論
210 if b$(d)="red" then b$(a)="red":b$(b)="blue":print"B:blue":a$(b)="blue"
220 if b$(d)="blue" then b$(a)="blue":b$(b)="red":print"B:red":a$(b)="red"
230 if b$(d)="unknown" and b$(c)="red" then b$(b)="blue":print"B:blue":a$(b)="blue"
240 if b$(d)="unknown" and b$(c)="blue" then b$(b)="red":print"B:red":a$(b)="red"
250 rem Aの推論
260 if a$(d)="red" then a$(a)="red":print"A:red"
270 if a$(d)="blue" then a$(a)="blue":print"A:blue"

変数
fac$() A,B,C,Dの帽子の色を格納する。 blueかred
a$(),b$(),c$(),d$() A,B,C,Dが自分および他のメンバーの帽子の色を知っているかどうかを格納する変数。
知らない場合はunknown(40行目で初期化している)。(自分を含め)誰かの帽子の色を知っている場合はblueかredが
格納される。

25〜50行 変数の初期化
100行 前提条件の処理。CはBの帽子の色がわかり、DはB,Cの帽子の色が分かる。
130〜140行 Dの推論
160〜190行 Cの推論
210〜240行 Bの推論
260〜270行 Aの推論


実行例





TOP PAGE >Basic活用研究目次