知恵袋で見つけた判断推理の果物を分配する問題をPythonで解いてみました。(^_^;
A〜Eの5人がそれぞれ4個ずつ自分の好きな果物をとった。
果物の内訳は、みかんが4個、りんごが6個、バナナが3個、いちごが7個である。
次のア〜エのことがわかっているとき、確実に言えるものはどれか。
ア:みかんをとったのはAとCだけ
イ:りんごをとったのはB、C、D
ウ:バナナをとらなかったのはDとE
エ:いちごをとらなかったのは一人だけで、Cではない1、Aはいちごを1個とった。
2、Bはりんごを2個とった。
3、Cはみかんを2個とった。
4、Dはりんごを2個とった。
効率悪そうですが、最近のPCの高速化に甘えて、思い付きの発想のまま作ってみました。(^_^;
解が1通りに確定するようなので選択肢のチェックは省略しました。
ちなみに、この問題は下の表を使えば自力の方が簡単に解けるかも。(^_^;
0 1 2 3 \| O A B S |計 \| O A B S |計 \| O A B S |計 \| O A B S |計 ---+---------+--- ---+---------+--- ---+---------+--- ---+---------+--- A | o x o ? | 4 A | o x 1 ? | 4 A | 3 x 1 0 | 4 A | 3 x 1 0 | 4 B | x o o ? | 4 B | x o 1 ? | 4 B | x o 1 o | 4 B | x 2 1 1 | 4 C | o o o o | 4 ⇒ C | 1 1 1 1 | 4 ⇒ C | 1 1 1 1 | 4 ⇒ C | 1 1 1 1 | 4 D | x o x ? | 4 D | x o x ? | 4 D | x o x o | 4 D | x 3 x 1 | 4 E | x x x ? | 4 E | x x x 4 | 4 E | x x x 4 | 4 E | x x x 4 | 4 ---+---------+--- ---+---------+--- ---+---------+--- ---+---------+--- 計| 4 6 3 7 |20 計| 4 6 3 7 |20 計| 4 6 3 7 |20 計| 4 6 3 7 |20
● Fruits.py
# coding: UTF-8 # Fruits.py # [ミカン、リンゴ、バナナ、イチゴ]の個数をリストで得る def getNums(a): s = "".join(a)+'|' r = [] n = 0 for i in range(len(s)): if s[i]=='|': r.append(i-n) n = i+1 return r def main(): import itertools from time import time tm = time() # Timer Start cnt = 0 for pA in set(itertools.permutations('aaaa|||')): # 同じものを含む順列 nA = getNums(pA) if nA[1]!=0: continue # 高速化のため表から for pB in set(itertools.permutations('bbbb|||')): # 同じものを含む順列 nB = getNums(pB) if nB[0]!=0: continue # 高速化のため表から for pC in set(itertools.permutations('cccc|||')): # 同じものを含む順列 nC = getNums(pC) if 0 in nC: continue # 高速化のため表から(条件エ-2も含む) lO = [nA[0],nC[0]] if sum(lO)!=4 or 0 in lO: continue # 条件アとミカンの合計 lB = [nA[2],nB[2],nC[2]] if sum(lB)!=3 or 0 in lB: continue # 条件ウとバナナの合計 for pD in set(itertools.permutations('dddd|||')): # 同じものを含む順列 nD = getNums(pD) if sum([nD[0],nD[2]])!=0: continue # 高速化のため表から lA = [nB[1],nC[1],nD[1]] if sum(lA)!=6 or 0 in lA: continue # 条件イとリンゴの合計 for pE in set(itertools.permutations('eeee|||')): # 同じものを含む順列 nE = getNums(pE) if sum([nE[0],nE[1],nE[2]])!=0: continue # 高速化のため表から lS = [nA[3],nB[3],nC[3],nD[3],nE[3]] if sum(lS)!=7: continue # イチゴの合計 if lS.count(0)!=1: continue # 条件エ-1 # チェックを潜り抜けたものだけを表示 cnt+=1 print("[%d]"%cnt) print(" O A B S") print("A %s"%nA) print("B %s"%nB) print("C %s"%nC) print("D %s"%nD) print("E %s"%nE) print("Runtime : %.3f [sec]"%(time()-tm)) # Timer Stop & Disp if __name__ == '__main__': main()
●実行結果
[1] O A B S A [3, 0, 1, 0] B [0, 2, 1, 1] C [1, 1, 1, 1] D [0, 3, 0, 1] E [0, 0, 0, 4] Runtime : 0.359 [sec]
※参考URL
●要素の確認(in演算子, indexメソッド, countメソッド) - リスト - Python入門
http://www.pythonweb.jp/tutorial/list/index10.html