还记得网上流传的刑侦推理试题吗

该题如果是用笔和纸去推倒排除,确实要花不少时间。

但是通过程序来写 就是最基本的循环加匹配程序了。

看看题


思路

如果用程序来写的话   最简单直接的思路 就是 创建出所有的答案 (有4的10次方个),然后遍历所有答案看是否满足题目所给的条件,全部满足的剩下的都是正确答案。 按这种思路来写 基本所有的语言都能写 ,c ,c++ ,php++ ,swift,python,java ,通通都能写

正好前段时间稍微看了看python 所以 我就权当python基本语法练习题来写了,题目不难,重点是思路。看了下公众号,大概是用了python的约束库 所以就不用写创建所有答案的那部分。   不过整体思路都一样,毕竟这题目还是很直接的,下面看python代码


1.创建所有答案  循环或者递归创建  


#! /usr/bin/env python3

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


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

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


#递归方式创建所有答案

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()

#创建的所有答案可能性应该是4的10次方

print(len(allanswers))

print(pow(4,10))



2.写出答案 需要满足的所有条件

#题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')


#获取重复最少的答案

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))


#获取重复最多的答案的个数

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)

#获取重复最少的答案的个数

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('可能的结果%d'%len(matchAnswers))

for ans in matchAnswers:

    print(ans)


4.结果 只有一个如下

#1

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


代码地址

解题代码地址

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354

推荐阅读更多精彩内容