有罪無罪の論理問題をPythonで解いてみました。(^_^;
4人の被告 A,B,C,Dが関与していて次の事実が明らかになった.
(1) AとBがともに有罪なら,Cは共犯者だ.
(2) Aが有罪ならば,BかCの少なくとも一人が共犯者だ.
(3) Cが有罪ならば,Dは共犯者だ.
(4) Aが潔白ならば,Dは有罪だ.
確実に有罪なのは誰か.
1.A 2.B 3.C 4.D
ただし、問題を一部修正して、選択肢を付けてみました。(^_^;
有罪をTrue、無罪(潔白)をFalseとし、論理包含Impをとって回してみました。(^_^;
● Logic3.py
# coding: UTF-8 # Logic3.py import itertools from time import time # 論理包含「A⇒B」の真理値を得る def Imp(a,b): return not a or b # 真理値表の1行を文字列で得る def getRowOfTFTbl(li): return ' '.join([str(b)[0] for b in li]) # 確実にいえる選択肢を得る def getAns(cho,lbl='12345'): return ','.join([lbl[i] for i in range(len(cho)) if cho[i]]) def main(): tm = time() # Timer Start choices = [True]*4 TF = (True, False) print("[A B C D]") for p in itertools.product(TF,repeat=4): a,b,c,d = p if not Imp(a and b, c): continue # 条件(1) if not Imp( a, b or c): continue # 条件(2) if not Imp( c, d): continue # 条件(3) if not Imp( not a, d): continue # 条件(4) pass # チェックを潜り抜けたものを表示 print('[%s]'%getRowOfTFTbl(p)) pass # 選択肢のチェック choices[0] &= a choices[1] &= b choices[2] &= c choices[3] &= d print("∴%s"%getAns(choices,'ABCD')) print("Runtime : %.3f [sec]"%(time()-tm)) # Timer Stop & Disp if __name__ == '__main__': main()
●実行結果
[A B C D] [T T T T] [T F T T] [F T T T] [F T F T] [F F T T] [F F F T] ∴D Runtime : 0.000 [sec]
※参考URL
●数学とプログラミングに弱い学生が論理パズルをPythonで解きたい話 - a symmetry
●知恵袋の判断推理の論理問題をPythonで解いてみた。 - rscのブログ
●知恵袋の判断推理の論理問題をPythonで解いてみた。(2) - rscのブログ
●【論理包含演算子Imp】の質問 - rscのブログ
●知恵袋の「ウソつき問題」をPythonで解いてみた。 - rscのブログ
●知恵袋の「ウソつき問題」をPythonで解いてみた。(5) - rscのブログ