这道逻辑题 用 Python 代码 如何实现?

2021-01-15 18:29:35 +08:00
 dwadewyp
1.第一个答案是 A 的问题是哪一个?  ()
	A:1  B:2  C:3  D:4

2.唯一的连续两个具有相同答案的问题是 ()
	A:5,6  B:6,7  C:7,8  D:8,9

3.本问题答案和哪一个问题的答案相同 ()
	A:4  B:9  C:8  D:2

4.答案是 A 的问题的个数是 ()
	A:5  B:4  C:3  D:2 

5.本问题答案和哪一个问题的答案相同 ()
	A:1  B:2  C:3  D:4

6.答案选 A 的问题的个数和答案选什么的问题的个数相同 ()	
	A:无  B:C  C:C  D:D

7.按照字母顺序, 本题答案与下一题相差 () {A 与 B 间,或 B 与 A 间均相差 1}
	A:3  B:2  C:1  D:0

8.十道题中答案为元音的题数为 ()
	A:0  B:1  C:2  D:3

9.十道题中答案为辅音的题数为 ()
	A:是合数  B:是质数  C:<5  D:是平方数

10.本题答案为 ()
	A:A  B:B  C:C  D:D
3228 次点击
所在节点    Python
25 条回复
washbrain
2021-01-16 14:43:15 +08:00
@dwadewyp 约束本身是很简单的
FirstA = ans(1), OnlySameAnswerIndex = ans(2), sameAnswerWithThree = ans(3) ..... 以此类推
关键是约束传播与更新这一步不太好做
从实际操作角度来说,最好是对每一道题目选某个值的约束传播简单分成两种
1. 添加全局约束检查,比如说题目 6,选 A 的时候,就添加一条检查约束,每次变量更新都做一个检查,判断是否回溯
2. 更新其他变量的值域, 比如说选择题目 1 选 D,就可以更新 1,2,3,4 的值域; 题目 3,5,7 这种直接更新的也不用说了
当然还有复合形的,比如题目 2 既有全局约束,又能更新值域
然后递归回溯,保存每一次搜索的具体值域和全局检查约束
不算通用的 CSP 问题解法,只是针对这种 CSP 问题的一种特定解法
polymer
2021-01-16 17:51:03 +08:00
A, C, B, C, A, C, D, D, B, A
chengfeng1992
2021-01-17 23:24:09 +08:00
https://gist.github.com/chengfeng-1992/1b552c64d43cba7bee3ddd72fc1592bf

用 java 写的,穷举然后各种判断,除了没判断选项的唯一,其它都差不多了。
JeffGe
2021-01-18 19:10:11 +08:00
https://paste.ubuntu.com/p/b3NYTy4mcB/

就算穷举都挺快的,0.882 秒。优化的话可以剪枝,最简单的剪枝方法之一就是在判断题目正确性的函数里面返回数字 n 代替 True/False,代表前 n 道题的答案就已经不满足要求了,穷举的下一项选择递增第 n 个答案,后面全置 A 即可。比如第二道题,“AAAAAAAAAA”的前两项可以直接判断题目 2 不可能满足,下一项判断“ABAAAAAAAA”即可,跳过了 65535 项。
washbrain
2021-01-18 21:43:55 +08:00
https://gist.github.com/hzura/d8885dcde0798916f7d6387f457f4016

@dwadewyp
用 js 写了一个约束传播剪枝 csp 的简单 demo,可以复制到浏览器 console 跑一下,搜索到正确结果只用了 61 次搜索,全部搜索完只用了 114 次搜索
当然这个 CSP 用的约束传播和选择算法还很粗糙,比如:
1. 约束传播是自己手动写的如何传播,主要是本题的约束相对复杂一点,手工作业比较多,不过具体是怎么传播的都写了注释
2. 选择下一个搜索目标是基于值域大小来的,可以有更好的方案,稍微优化一下选择搜索的方式,搜索次数可以减少到 27 次(见注释)
3. 不像真正的约束传播算法,我们这里其实值域只会在手动选择的时候做一次约束传播,理论上可以一直迭代变动到值域稳定为止,也有更多优化空间

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/745338

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX