題目來自于2018年江蘇省招聘刑偵警察的推理筆試題偿荷,題目如下
閱讀題目后,顯然這是10個(gè)前后邏輯嚴(yán)謹(jǐn)?shù)耐评眍}寺庄,基于程序員本能可以大致抽象出兩點(diǎn)
(1):題目中的選項(xiàng)答案斗塘,即是其自身的答案(如第一題馍盟,第二題等)
(2):題目中的選項(xiàng)答案贞岭,指的是答案中對(duì)應(yīng)題目的答案瞄桨,即答案中的答案(如第三題尿孔,第四題得分)
顯然活合,這個(gè)題目可以單純的靠著邏輯學(xué)和排除法白指,用筆和紙通過假設(shè)推導(dǎo)或者畫圖推理出來告嘲。但是作為程序員橄唬,顯然應(yīng)該通過編程的方法(趣味編程)参歹,來尋找那唯一的真相
根據(jù)題目分析犬庇,我們可以輕松的抽象出其數(shù)學(xué)模型:無(wú)非是編寫一個(gè)邏輯函數(shù)捂襟,這個(gè)函數(shù)接收一個(gè)隨機(jī)的答案排列為輸入欢峰,然后經(jīng)過有限個(gè)邏輯約束來判斷闯狱,中途只要違背一個(gè)條件約束哄孤,就返回False來重新接受新的隨機(jī)答案排列瘦陈,如果到最后都沒有違背任意一個(gè)條件約束晨逝,就返回True捉貌,即證明輸入的答案排列就是其真實(shí)的答案排列
下面我們來構(gòu)造邏輯函數(shù)judge(inputs)趁窃,形參inputs代表輸入隨機(jī)答案排列醒陆,而函數(shù)里的有限個(gè)邏輯約束就是這10個(gè)題目要求,我們需要將這些題目翻譯成邏輯代碼
在翻譯之前世吨,我們定義兩個(gè)表達(dá)式來表達(dá)上面抽象出的兩點(diǎn)
select[answer]:指的是該題自身的答案
inputs[select[answer]]:指的是答案中答案(題目)的答案像屋,或者是第select[answer]個(gè)題目對(duì)應(yīng)的答案
對(duì)于第1題沒什么可以翻譯的己莺,我們從第2題分析凌受,第2題的要求是第5題的答案是什么挠进,也就是說如果第2題的答案不是第5題的答案领突,則這組答案一定錯(cuò)誤君旦,則我們可以編寫
同理,分析第3題,要求選擇的答案對(duì)應(yīng)題目的答案鹅巍,不在剩余答案所對(duì)應(yīng)的題目的答案里
分析第4題,要求選擇的答案對(duì)應(yīng)題目的答案應(yīng)該一致
分析第5題梧宫,要求選擇的答案對(duì)應(yīng)題目的答案應(yīng)該等于第5題自身的答案
分析第6題脓豪,要求選擇的答案對(duì)應(yīng)題目的答案應(yīng)該等于第8題自身的答案
分析第7題驰徊,要求其自身的答案等于所有題目里選項(xiàng)最少的答案
分析第8題,要求選擇的答案對(duì)應(yīng)題目的答案浦马,應(yīng)該和第1題的答案不相鄰
分析第9題,要求"選擇的答案對(duì)應(yīng)題目的答案和第5題的答案是否相同"與"第1題和第6題的答案是否相同"互斥
分析第10題仅政,要求其自身的答案等于所有題目里答案出現(xiàn)次數(shù)最少的次數(shù)
至此我們完成了對(duì)這10個(gè)邏輯約束的翻譯躯喇,也完成了邏輯函數(shù)的編程倦微,還有一點(diǎn)值得注意焦履,題目答案的編碼嘉裤,我們利用了0123帶代表ABCD,這樣方便我們可以直接作為數(shù)組索引來尋址到任意一個(gè)題目的答案,也方便我們用加減法計(jì)算是否相鄰
最后获枝,只要利用計(jì)算機(jī)算力的高性能,使用窮舉法跑我們的邏輯函數(shù)骇笔,就可以在有限的時(shí)間內(nèi)找到真正的答案(由于使用了窮舉法省店,答案的輸入是完全隨機(jī)的嚣崭,所以計(jì)算時(shí)間也是不一定的)
從結(jié)果上可以看到,計(jì)算機(jī)成功扮演了偵探角色懦傍,很快的找到了唯一的真相雹舀!
也可以看出,程序員 > 偵探
案例代碼見:刑偵推理題