優雅地解決「2018刑偵推理題」
來自專欄 Python 文科生7 人贊了文章
前段時間江蘇網警發布的「2018刑偵推理題」非常火,題目為:
沒想到的是,本來是一套推理題,結果各路程序員大佬,主要是Python大神各顯神通,運用Python內的 邏輯運算符 幾乎不怎麼費力地解決了這個問題。
我覺得有趣,便花了一些時間看了看大家的解法,把比較優雅的想法、代碼組合起來放在了這裡。
代碼:
import timeoptions = [1, 2, 3, 4]def rep(a): lll = {1: "A", 2: "B", 3: "C", 4: "D"} return lll[a]def Q2(a2, a5): return{ (3, 1): True, (4, 2): True, (1, 3): True, (2, 4): True, }.get((a5, a2), False)def Q3(a, a3, a6, a2, a4): return{ 1: (a3 != a6) and (a3 != a2) and (a3 != a4), 2: (a6 != a3) and (a6 != a2) and (a6 != a4), 3: (a2 != a3) and (a2 != a6) and (a2 != a4), 4: (a4 != a3) and (a4 != a6) and (a4 != a2), }.get(a)def Q4(a, a1, a5, a2, a7, a9, a6, a10): return{ 1: a1 == a5, 2: a2 == a7, 3: a1 == a9, 4: a6 == a10, }.get(a)def Q5(a, a8, a4, a9, a7): return{ 1: a == a8, 2: a == a4, 3: a == a9, 4: a == a7, }.get(a)def Q6(a, a8, a2, a4, a1, a6, a3, a10, a5, a9): return{ 1: a8 == a2 and a8 == a4, 2: a8 == a1 and a8 == a6, 3: a8 == a3 and a8 == a10, 4: a8 == a5 and a8 == a9, }.get(a)def Q7min(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10): stats = [0, 0, 0, 0] for i in [a1, a2, a3, a4, a5, a6, a7, a8, a9, a10]: stats[i - 1] += 1 return options[stats.index(min(stats))]def Q7(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10): minA = Q7min(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) return{ 1: minA == 3, 2: minA == 2, 3: minA == 1, 4: minA == 4, }.get(a7)def Q8(a8, a1, a7, a5, a2, a10): return{ 1: abs(a7 - a1) != 1, 2: abs(a5 - a1) != 1, 3: abs(a2 - a1) != 1, 4: abs(a10 - a1) != 1, }.get(a8)def Q9(a9, a6, a5, a10, a2, a1): return (a1 == a6) != { 1: a6 == a5, 2: a10 == a5, 3: a2 == a5, 4: a9 == a5, }.get(a9)def calDiff(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10): stats = [0, 0, 0, 0] for i in [a1, a2, a3, a4, a5, a6, a7, a8, a9, a10]: stats[i - 1] += 1 return max(stats) - min(stats)def Q10(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10): count = calDiff(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) return{ 1: count == 3, 2: count == 2, 3: count == 4, 4: count == 1, }.get(a10)def check(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10): # Processing form Q2 since Q1 is always right... if Q2(a2, a5) is False: return False if Q3(a3, a3, a6, a2, a4) is False: return False if Q4(a4, a1, a5, a2, a7, a9, a6, a10) is False: return False if Q5(a5, a8, a4, a9, a7) is False: return False if Q6(a6, a8, a2, a4, a1, a6, a3, a10, a5, a9) is False: return False if Q7(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) is False: return False if Q8(a8, a1, a7, a5, a2, a10) is False: return False if Q9(a9, a6, a5, a10, a2, a1) is False: return False if Q10(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) is False: return False return Truetime1 = time.time()for a1 in options: for a2 in options: for a3 in options: for a4 in options: for a5 in options: for a6 in options: for a7 in options: for a8 in options: for a9 in options: for a10 in options: if check(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10): print(答案是:, rep(a1), rep(a2), rep(a3), rep(a4), rep(a5), rep(a6), rep(a7), rep(a8), rep(a9), rep(a10)) breaktime2 = time.time()print(用時%s秒 % round(time2 - time1, 2))
這段代碼最後通過Python - REPL 得到的結果是:
答案是: B C A C A C D A B A用時1.63秒***Repl Closed***
優點:
- 易讀性。使用字典的get方法來表示了各個選項。
- 相對來講,速度還可以。
參考了:
- 2018年刑偵推理試題解答 (用字典以及get函數表示選項)
- 2018年刑偵推理試題解答-python (較快地遍歷答案)
更多資料:
- Python 代碼性能優化技巧- IBM
- 邏輯運算符
推薦閱讀:
※如何高效的產生一億組1到1億的隨機排列?
※從自學Python到選擇PHP培訓,我的一些看法
※十分鐘搞定pandas
※【Python3網路爬蟲開發實戰】4.3-使用pyquery
TAG:Python |