美文网首页
还记得网上流传的刑侦推理试题吗

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

作者: Predor | 来源:发表于2018-03-29 12:04 被阅读0次

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

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

看看题

思路

如果用程序来写的话   最简单直接的思路 就是 创建出所有的答案 (有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']

代码地址

解题代码地址

相关文章

网友评论

      本文标题:还记得网上流传的刑侦推理试题吗

      本文链接:https://www.haomeiwen.com/subject/cilmcftx.html