嘘つき族と正直族の問題をPython
で解いてみた。
答え合わせはしていない。Python
楽。
import itertools
# 嘘つきなら反対を答える
def ans( person, liars, b):
if person in liars:
b = not b
return b
def print_res(liars, cards):
print('-----')
for i in range(4):
print( '{}:{} {}'.format('ABCD'[i], '嘘' if i in liars else '正', cards[i]))
# 嘘つきな人 と カードの組み合わせ
liars_g = itertools.combinations(list(range(4)),2) # 嘘つきな人
cards_g = itertools.permutations(list(range(1,5))) # カード
for liars, cards in itertools.product(liars_g,cards_g):
# Aさん:私のカードは,偶数です.
# Bさん:私のカードは,3か4のどちらかです.
# Cさん:Bさんは,正直族です.
# Dさん:私のカードは,1です.
if ans( 0, liars, cards[0] % 2 == 0) and \
ans( 1, liars, cards[1] in (3,4)) and \
ans( 2, liars, 1 not in liars) and \
ans( 3, liars, cards[3] == 1):
print_res(liars, cards)
答え
-----
A:嘘 1
B:正 3
C:正 2
D:嘘 4
-----
A:嘘 1
B:正 3
C:正 4
D:嘘 2
-----
A:嘘 1
B:正 4
C:正 2
D:嘘 3
-----
A:嘘 1
B:正 4
C:正 3
D:嘘 2
-----
A:嘘 3
B:正 4
C:正 1
D:嘘 2
-----
A:正 4
B:嘘 2
C:嘘 3
D:正 1