還記得網(wǎng)上流傳的刑偵推理試題嗎

該題如果是用筆和紙去推倒排除,確實(shí)要花不少時(shí)間。

但是通過(guò)程序來(lái)寫(xiě) 就是最基本的循環(huán)加匹配程序了。

看看題


思路

如果用程序來(lái)寫(xiě)的話 ? 最簡(jiǎn)單直接的思路 就是 創(chuàng)建出所有的答案 (有4的10次方個(gè)),然后遍歷所有答案看是否滿足題目所給的條件,全部滿足的剩下的都是正確答案。 按這種思路來(lái)寫(xiě) 基本所有的語(yǔ)言都能寫(xiě) ,c ,c++ ,php++ ,swift,python,java ,通通都能寫(xiě)

正好前段時(shí)間稍微看了看python 所以 我就權(quán)當(dāng)python基本語(yǔ)法練習(xí)題來(lái)寫(xiě)了,題目不難,重點(diǎn)是思路??戳讼鹿娞?hào),大概是用了python的約束庫(kù) 所以就不用寫(xiě)創(chuàng)建所有答案的那部分。 ? 不過(guò)整體思路都一樣,畢竟這題目還是很直接的,下面看python代碼


1.創(chuàng)建所有答案 ?循環(huán)或者遞歸創(chuàng)建 ?


#! /usr/bin/env python3

# -*- coding: utf-8 -*-


answers = ['a','b','c','d'] ?#四種答案

allanswers = [] ?#10道題的所有可能答案


#遞歸方式創(chuàng)建所有答案

def createAnswers(x = 0,tempAn = []):

? ? if x == 0:

? ? ? ? tempAn = []

? ? if x == 10:

? ? ? ? return

? ? for i in range(4):

? ? ? ? tempAn = tempAn[0:x]

? ? ? ? tempAn.append(answers[i])

? ? ? ? createAnswers(x+1,tempAn)

? ? ? ? if x == 9:

? ? ? ? ? ? allanswers.append(tempAn)


createAnswers()

#創(chuàng)建的所有答案可能性應(yīng)該是4的10次方

print(len(allanswers))

print(pow(4,10))



2.寫(xiě)出答案 需要滿足的所有條件

#題2

def func2(an):

? ? return ( an[4] == 'c' and? an[1] == 'a' ) or (an[4] == 'd' and an[1] == 'b') or \

? ? ? ? ? ? (an[4] == 'a' and an[1] == 'c') or (an[4] == 'b' and an[1] == 'd')

#題3

def func3(an):

? ? return? ( an[2] == 'a' and? an[5] == an[1] == an[3] !=? an[2] ) or ( an[2] == 'b' and an[2] == an[1] == an[3] !=? an[5] ) \

? ? ? ? ? ? or ( an[2] == 'c' and an[5] == an[2] == an[3] !=? an[1]? ) or (an[2] == 'd' and an[5] == an[1] == an[2] !=? an[3])

#題4

def func4(an):

? ? return (an[3]=='a' and an[0] == an[4]) or (an[3]=='b' and an[1] == an[6]) or \

? ? ? ? ? ? ( an[3]=='c' and an[0] == an[8]) or (an[3]=='d' and an[5] == an[9])

#題5

def func5(an):

? ? return (an[4] == an[7]? == 'a') or (an[4] == an[3]? == 'b') or \

? ? ? ? ? ? (an[4] == an[8]? == 'c') or (an[4] == an[6]? == 'd')

#題6

def func6(an):

? ? return (an[1] == an[3] == an[7] and an[5] == 'a') or (an[0] == an[5] == an[7] and an[5] == 'b') or \

? ? ? ? ? ? (an[2] == an[9] == an[7] and an[5] == 'c') or (an[4] == an[8] == an[7] and an[5] == 'd')


#獲取重復(fù)最少的答案

def getminZiMu(an):

? ? nums = [0,0,0,0]

? ? for a in an:

? ? ? ? index = ord(a) - ord('a')

? ? ? ? nums[index] += 1

? ? return answers[nums.index(min(nums))]


#題7

def func7(an):

? ? return (getminZiMu(an) == 'c' and an[6] == 'a') or? (getminZiMu(an) == 'b' and an[6] == 'b') or \

? ? ? ? ? ? (getminZiMu(an) == 'a' and an[6] == 'c') or (getminZiMu(an) == 'd' and an[6] == 'd')

#題8

def func8(an):

? ? return (abs(ord(an[0]) - ord(an[6])) != 1 and an[7] == 'a') or (abs(ord(an[0]) - ord(an[4])) != 1 and an[7] == 'b') or \

? ? ? ? ? ? (abs(ord(an[0]) - ord(an[1])) != 1 and an[7] == 'c') or (abs(ord(an[0]) - ord(an[9])) != 1 and an[7] == 'd')

#題9

def func9(an):

? ? ? t1 = (an[0] == an[5])

? ? ? equalT1 = lambda x: an[x] != an[4]

? ? ? return (an[8] == 'a' and? t1 == equalT1(5)) or (an[8] == 'b' and? t1 == equalT1(9)) or \

? ? ? ? ? ? ? (an[8] == 'a' and? ti == equalT1(1)) or (an[8] == 'a' and? ti == equalT1(8))


#獲取重復(fù)最多的答案的個(gè)數(shù)

def getmaxCount(an):

? ? nums = [0,0,0,0]

? ? for a in an:

? ? ? ? index = abs(ord('a') - ord(a))

? ? ? ? v = nums[index] + 1

? ? ? ? nums[index] = v

? ? return max(nums)

#獲取重復(fù)最少的答案的個(gè)數(shù)

def getminCount(an):

? ? nums = [0,0,0,0]

? ? for a in an:

? ? ? ? index = abs(ord('a') - ord(a))

? ? ? ? v = nums[index] + 1

? ? ? ? nums[index] = v

? ? return min(nums)


#題10

def func10(an):

? ? value = getmaxCount(an) - getminCount(an)

? ? return ( value == 3) or? (value == 2) or? (value == 4) or? (value == 1)


3.便利所有答案 ?找出滿足所有條件的答案


matchAnswers = []

for an in allanswers:

? ? #遍歷所有答案 滿足所有條件

? ? if func2(an) and func3(an) and func4(an) and? func5(an) and func6(an) and func7(an) and func8(an)? and func9(an) and func10(an):

? ? ? ? matchAnswers.append(an)


print('可能的結(jié)果%d'%len(matchAnswers))

for ans in matchAnswers:

? ? print(ans)


4.結(jié)果 只有一個(gè)如下

#1

#['b', 'c', 'a', 'c', 'a', 'c', 'd', 'a', 'b', 'a']


代碼地址

解題代碼地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容