🌈据说,看我文章时 关注、点赞、收藏 的 帅哥美女们 心情都会不自觉的好起来。
前言:
🧡作者简介:大家好我是 user_from_future ,意思是 “ 来自未来的用户 ” ,寓意着未来的自己一定很棒~
✨个人主页:点我直达,在这里肯定能找到你想要的~
👍专栏介绍:Python实践 ,一个很哇塞的专栏~
想看往期历史文章,可以浏览此博文: 历史文章目录,后续所有文章发布都会同步更新此博文~

前言
今天,翻到了以前刷到的一套《2018年刑侦推理试题》:

快速浏览了一遍,我直接CPU都烧了,完全不知道该从何下手,然后百度了一下,发现推理过程有那么亿点点复杂!【推理解析网站】 还没看完这个网站,我的脑细胞就死了一大片。
为了保护我的脑细胞,我决定用Python来处理这题。
完整题目
2018年刑侦科推理试题
单项选择,(每题10分,共100分)
1这道题的答案是:
A.A B.B C.C D.D
2.第5题的答案是:
A.C B.D C.A D.B
3.以下选项中哪-题的答案与其他三项不同:
A.第3题 B.第6题 C.第2题 D.第4题
4.以下选项中哪两题的答案相同:
A.第1,5题 B.第2,9题 C.第1,9题 D.第6,10题
5.以下选项中哪一题的答案与本题相同:
A.第8题 B.第4题 C.第9题 D.第9题
6.以下选项中哪两题的答案与第8题相同:
A.第2,4题 B.第1,6题 C.第3,10题 D.第5,9题
9.在此十道题中,被选中次数最少的选项字母为:
A.C B.B C.A D.D
8.以下选项中哪-题的答案 与第1题的答案在字母中不相邻:
A.第9题 B.第5题 C.第2题 D.第10题
9.已知“第1题与第6题的答案相同”与"第X题与第5题的答案相同”的真假性相反,那么X为:
A.第6题 B.第10题 C.第2题 D.第9题
10.在此10道题中,ABCD四个字母出现次数最多与最少者的差为:
A.3 B.2 C.4 D.1
简述
推理实际上是先进行线索之间的联系梳理,然后再对符合线索的可能进行穷举判断,对于CPU比较菜的我来说,不如完全穷举,然后一题一题的判断出来。
于是我们的代码结构应该是这样的:
def make_answers(scope, length):
"""
生成答案
"""
pass
def check_answer(ans):
"""
检查答案
"""
pass
for answer in make_answers(['A', 'B', 'C', 'D'], 10):
if check_answer(answer):
print(answer)
break
生成答案
由于我们的答案相当于有 410 种,不方便用普通的循环写,所以我们这里使用递归生成答案:
def make_answers(scope, length, ans=''):
"""
生成答案
"""
if length > 0:
for s in scope:
yield from make_answers(scope=scope, length=length - 1, ans=ans + s)
else:
yield ans
这样我们就能穷举出所有的答案了,穷举完之后,你可以添加一些过滤,比如全A、全B、全C、全D的,肯定不可能是最终答案。
检查答案
在这里,实际上就是一题一题往上写。由于第一题是开放的,所以由第二题开始写条件。
第二题
2.第5题的答案是:
A.C B.D C.A D.B
(ans[1] == 'A' and ans[4] == 'C') \
or (ans[1] == 'B' and ans[4] == 'D') \
or (ans[1] == 'C' and ans[4] == 'A') \
or (ans[1] == 'D' and ans[4] == 'B')
第三题
3.以下选项中哪-题的答案与其他三项不同:
A.第3题 B.第6题 C.第2题 D.第4题
(ans[2] == 'A' and {
ans[5], ans[1], ans[3]} == {
ans[5]} and ans[2] != ans[5]) \
or (ans[2]=='B'and{
ans[2], ans[1], ans[3]} == {
ans[2]} and ans[5] != ans[2]) \
or (ans[2] == 'C' and {
ans[2], ans[5], ans[3]} == {
ans[2]} and ans[1] != ans[2]) \
or (ans[2] == 'D' and {
ans[2], ans[5], ans[1]} == {
ans[2]} and ans[3] != ans[2])
第四题
4.以下选项中哪两题的答案相同:
A.第1,5题 B.第2,9题 C.第1,9题 D.第6,10题
(ans[3] == 'A' and ans[0] == ans[4]) \
or (ans[3] == 'B'andans[1]==ans[6]) \
or (ans[3] == 'C' and ans[0] == ans[8]) \
or (ans[3] == 'D' and ans[5] == ans[9])
第五题
5.以下选项中哪一题的答案与本题相同:
A.第8题 B.第4题 C.第9题 D.第9题
(ans[4] == 'A' and ans[4] == ans[9]) \
or (ans[4]== 'B'andans[4] == ans[3]) \
or (ans[4] == 'C' and ans[4] == ans[8]) \
or (ans[4] == 'D' and ans[4] == ans[6])
第六题
6.以下选项中哪两题的答案与第8题相同:
A.第2,4题 B.第1,6题 C.第3,10题 D.第5,9题
(ans[5] == 'A' and {
ans[1], ans[3]} == {
ans[7]}) \
or (ans[5]== 'B'and{
ans[0], ans[5]} == {
ans[7]}) \
or (ans[5] == 'C' and {
ans[2], ans[9]} == {
ans[7]}) \
or (ans[5] == 'D' and {
ans[4], ans[8]} == {
ans[7]})
第七题
9.在此十道题中,被选中次数最少的选项字母为:
A.C B.B C.A D.D
选项次数排序
ans_count ={
a: ans.count(a) for a in set(ans)}
ans_count_sorted = sorted(['A', 'B', 'C', 'D'], key=lambda key: ans_count.get(key, 0))
(ans
用Python解决2018年刑侦推理试题

最低0.47元/天 解锁文章

614

被折叠的 条评论
为什么被折叠?



