python的约束库constraint解决《2018刑侦科题目》
Github地址:https://github.com/ZJW9633/hello-word/blob/master/Xingzhenke

题目分析:
10道题互相关联,耦合性强,暴力求解需4^10种可能,本人使用python的约束库constraint设置约束进行解决。
python代码:
#-*- coding:utf-8 -*-
# 《2018刑侦科推理试题》非穷举的 Python 解法
# 需要先安装约束解决库 `pip install python-constraint`
# author:jinwei
# date:2018/04/1 from constraint import *
from time import time
problem = Problem() # a1 - a10 表示第一题到第十题的答案变量,答案使用“1”表示“A”, “2”表示“B”,以此类推
vars = ["a1", "a2", "a3", "a4", "a5", "a6", "a7", "a8", "a9", "a10"]
problem.addVariables(vars, [1, 2, 3, 4]) #第 1 题
#略
#第 2 题
def a2_func(a2, a5):
return (a2 == 1 and a5 == 3) or (a2 == 2 and a5 == 4) or (a2 == 3 or a5 == 1) or (a2 == 4 or a5 == 2)
problem.addConstraint(a2_func, ["a2", "a5"]) #第 3 题
def a3_func(a2, a3, a4,a6):
return (a3 == 1 and a6 == a2 == a4 != a3) or (a3 == 2 and a3 == a2 == a4 != a6) \
or (a3 == 3 and a3 == a6 == a4 != a2) or (a3 == 4 and a3 == a6 == a2 != a4)
problem.addConstraint(a3_func, ['a2','a3','a4','a6']) #第 4 题
def a4_func(a1, a2, a4, a5, a6, a7, a9, a10):
return (a4 == 1 and a1 == a5) or (a4 == 2 and a2 == a7) or (a4 == 3 and a1 == a9) or (a4 == 4 and a6 == a10)
problem.addConstraint(a4_func, ['a1','a2','a4','a5','a6','a7','a9','a10']) #第 5 题
def a5_func( a4, a5, a7, a8, a9):
return (a5 == a8 == 1) or (a5 == a4 == 2) or (a5 == a9 == 3) or (a5 == a7 == 4)
problem.addConstraint(a5_func, ['a4','a5','a7','a8','a9']) #第 6 题
def a6_func(a1, a2, a3, a4, a5, a6 ,a8, a9, a10):
return (a6 == 1 and a2 == a4 == a8) or (a6 == 2 and a1 == a6 == a8) \
or (a6 == 3 and a3 == a10 == a8) or (a6 == 4 and a5 == a9 == a8)
problem.addConstraint(a6_func, ['a1','a2','a3','a4','a5','a6','a8','a9','a10']) #第 7 题
def a7_func(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10):
all_answers = [a1, a2, a3, a4, a5, a6, a7, a8, a9, a10]
counter = [0, 0, 0, 0]
for a in all_answers:
counter[a - 1] += 1
imin = counter.index(min(counter)) + 1
n = len(set(counter))
# 这题为“此10题种被选中的选项最少的为,ABCD选择,说明 ABCD 的数量个不相同”
return n == 4 and ((a7 == 1 and imin == 3) or (a7 == 2 and imin == 2) or (a7 == 3 and imin == 1) or (a7 == 4 and imin == 4))
problem.addConstraint(a7_func, vars) #第 8 题
def a8_func(a8, a7, a5, a2, a10, a1):
adj = lambda x: abs(a1 - x) != 1
return (a8 == 1 and adj(a7)) or (a8 == 2 and adj(a5)) or (a8 == 3 and adj(a2)) or (a8 == 4 and adj(a10))
problem.addConstraint(a8_func, ["a8", "a7", "a5", "a2", "a10", "a1"]) #第 9 题
def a9_func(a1, a2, a5, a6, a9, a10):
cond1 = a1 == a6
cond = lambda x: cond1 != (x == a5)
return (a9 == 1 and cond(a6)) or (a9 == 2 and cond(a10)) or (a9 == 3 and cond(a2)) or (a9 == 4 and cond(a9))
problem.addConstraint(a9_func, ["a1", "a2", "a5", "a6", "a9", "a10"]) #第 10 题
def a10_func(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10):
all_answers = [a1, a2, a3, a4, a5, a6, a7, a8, a9, a10]
counter = [0, 0, 0, 0]
for a in all_answers:
counter[a - 1] += 1
v = abs(max(counter) - min(counter))
return (a10 == 1 and v == 3) or (a10 == 2 and v == 2) or (a10 == 3 and v == 4) or (a10 == 4 and v == 1)
problem.addConstraint(a10_func, vars) # 约束设置完毕,开始求解
start_time=time()
solutions = problem.getSolutions()
elsap_time=time()-start_time
print("解决时间:{0}s".format(elsap_time))
print("答案组数:{0}".format(len(solutions))) chars = ['A', 'B', 'C', 'D'] for si in range(0, len(solutions)):
print("\n---------- 第 {0} 组结果 ----------".format(si + 1))
s = solutions[si]
for i in range(1, 11):
key = "a" + str(i)
answer = chars[s[key] - 1]
print("{0}".format( answer),end='')
代码结果:
解决时间:0.5780596733093262s
答案组数:1 ---------- 第 1 组结果 ----------
BCACACDABA
Process finished with exit code 0
总结:
出现的问题:在进行约束条件的时,将传入所有参数a1~a10,并且将vars传入constraint中,增加了不必要的计算,大大降低了效率。
改进前运行所需时间:

改进:重新编写约束函数,只传入必要的参数,提高效率
改进后的运行时间:0.5s
python的约束库constraint解决《2018刑侦科题目》的更多相关文章
- 【python】对于程序员来说,2018刑侦科推理试卷是问题么?
最近网上很火的2018刑侦科推理试卷,题目确实很考验人逻辑思维能力. 可是对于程序员来说,这根本不是问题.写个程序用穷举法计算一遍即可,太简单. import itertools class Solu ...
- 解决python的requests库在使用过代理后出现拒绝连接的问题
在使用过代理后,调用python的requests库出现拒绝连接的异常 问题 在windows10环境下,在使用代理(VPN)后.如果在python中调用requests库来地址访问时,有时会出现这样 ...
- Python安装第三方库的安装技巧
电脑:Windows10 64位. Python IDE 软件:JetBrains PyCharm Community Edition 2018.1.3 x64 Python version : Py ...
- python中requests库使用方法详解
目录 python中requests库使用方法详解 官方文档 什么是Requests 安装Requests库 基本的GET请求 带参数的GET请求 解析json 添加headers 基本POST请求 ...
- Python常用的库简单介绍一下
Python常用的库简单介绍一下fuzzywuzzy ,字符串模糊匹配. esmre ,正则表达式的加速器. colorama 主要用来给文本添加各种颜色,并且非常简单易用. Prettytable ...
- Python virtualenv安装库报错SSL: CERTIFICATE_VERIFY_FAILED
Python virtualenv安装库报错SSL: CERTIFICATE_VERIFY_FAILED 问题描述 使用pip按照virtualenv报错,如下: pip install virtua ...
- 使用boost.python封装C++库
使用boost.python封装C++库 C++以高性能著称,但是编写较为复杂.而简洁是Python的强项.如果能珠联璧合,就能发挥两家之长.本文尝试用boost库的python模块封装C++ 前期准 ...
- python 各种开源库
测试开发 来源:https://www.jianshu.com/p/ea6f7fb69501 Web UI测试自动化 splinter - web UI测试工具,基于selnium封装. 链接 sel ...
- python爬虫---selenium库的用法
python爬虫---selenium库的用法 selenium是一个自动化测试工具,支持Firefox,Chrome等众多浏览器 在爬虫中的应用主要是用来解决JS渲染的问题. 1.使用前需要安装这个 ...
随机推荐
- 解决在onCreate()过程中获取View的width和Height为0的方法
最近在看Android底层代码的view绘制原理的时候讲到一个很有意思的事情,也是我几年前刚开始学习Android开发的时候比较纳闷的一个问题,如果你不理解Android的底层绘制,请看我之前一片文章 ...
- 网站开发进阶(二十四)HTML颜色代码表
HTML颜色代码表 设置背景色:style='background-color:red' 设置字体颜色:style='color:red' 生活在于学习,知识在于积累.
- mysql进阶(十)不靠谱的FLOAT数据类型
今天在设计数据表时,突然发现原来FLOAT原来是很不靠谱的,所以在这里建议大家换成DOUBLE类型, 原因是: 在mysql手册中讲到,在MySQL中的所有计算都是使用双精度完成的,使用float(单 ...
- 高通android开发摘要
一部分是开源的,可以从codeaurora.org上下载,还有一部分是高通产权的,需要从高通的网站上下载. 将高通产权的代码放到:vendor/qcom/proprietary 1. 设置bms一些参 ...
- 中国象棋游戏Chess(3) - 实现走棋规则
棋盘的绘制和走棋参看博文:中国象棋游戏Chess(1) - 棋盘绘制以及棋子的绘制,中国象棋游戏Chess(2) - 走棋 现在重新整理之前写的代码,并且对于每个棋子的走棋规则都进行了限制,不像之前那 ...
- jQuery的ajax使用
一:jQuery.ajax语法基础 jQuery.ajax([options]) 概述:通过 HTTP 请求加载远程数据. jQuery 底层 AJAX 实现.简单易用的高层实现见 $.get, $. ...
- 数据库用户映射到SQL Server登录名
由于不是固定在一如电脑开始,经常需要把数据备份与恢复.或者是帮助客户修改程序,接收到客户备份好的数据,需要在电脑恢复. 这样就需要将数据库用户映射到 SQL Server 登录名.如何映射?可使用下面 ...
- Bloom filter 2
1 Bloom filter 计算方法 如需要判断一个元素是不是在一个集合中,我们通常做法是把所有元素保存下来,然后通过比较知道它是不是在集合内,链表.树都是基于这种思路,当集合内元素个数的变大,我们 ...
- Mina源码阅读笔记(七)—Mina的拦截器FilterChain
Filter我们很熟悉,在Mina中,filter chain的用法也类似于Servlet的filters,这种拦截器的设计思想能够狠轻松的帮助我们实现对资源的统一处理.我们先大致连接下mina中的f ...
- 机器学习算法与Python实践之(五)k均值聚类(k-means)
机器学习算法与Python实践这个系列主要是参考<机器学习实战>这本书.因为自己想学习Python,然后也想对一些机器学习算法加深下了解,所以就想通过Python来实现几个比较常用的机器学 ...