刑侦高考:如何用SQL解决环环相扣的刑侦推理问题

简介:

高考期间看到一个朋友在朋友圈里面贴了个图,上面是2018年刑侦科推理试题,看了一下题目,这些题目都是彼此依赖,很难找到一个题目作为入手点可以进一步分析,因此可能需要用纸笔配合大量的假设和试错才能继续完成。

原题如下,大家可以先烧烧脑,再来看解决方案:

daf5374ea9456868076a65e7ac15436aa0ef3a81

这种问题其实是SQL擅长的领域,于是一时手痒,写了一个SQL语句:

SQL> WITH T AS

2 (SELECT ASCII('A') R FROM DUAL

3 UNION ALL

4 SELECT ASCII('B') FROM DUAL

5 UNION ALL

6 SELECT ASCII('C') FROM DUAL

7 UNION ALL

8 SELECT ASCII('D') FROM DUAL),

9 RESULT AS

10 (SELECT T1.R R1, T2.R R2, T3.R R3, T4.R R4, T5.R R5, T6.R R6, T7.R R7, T8.R R8, T9.R R9, T10.R R10,

11 DECODE(T1.R, ASCII('A'), 1, 0) + DECODE(T2.R, ASCII('A'), 1, 0) + DECODE(T3.R, ASCII('A'), 1, 0) + DECODE(T4.R, ASCII('A'), 1, 0)

12 + DECODE(T5.R, ASCII('A'), 1, 0) + DECODE(T6.R, ASCII('A'), 1, 0) + DECODE(T7.R, ASCII('A'), 1, 0)

13 + DECODE(T8.R, ASCII('A'), 1, 0) + DECODE(T9.R, ASCII('A'), 1, 0) + DECODE(T10.R, ASCII('A'), 1, 0) A,

14 DECODE(T1.R, ASCII('B'), 1, 0) + DECODE(T2.R, ASCII('B'), 1, 0) + DECODE(T3.R, ASCII('B'), 1, 0) + DECODE(T4.R, ASCII('B'), 1, 0)

15 + DECODE(T5.R, ASCII('B'), 1, 0) + DECODE(T6.R, ASCII('B'), 1, 0) + DECODE(T7.R, ASCII('B'), 1, 0)

16 + DECODE(T8.R, ASCII('B'), 1, 0) + DECODE(T9.R, ASCII('B'), 1, 0) + DECODE(T10.R, ASCII('B'), 1, 0) B,

17 DECODE(T1.R, 'C', 1, 0) + DECODE(T2.R, ASCII('C'), 1, 0) + DECODE(T3.R, ASCII('C'), 1, 0) + DECODE(T4.R, ASCII('C'), 1, 0)

18 + DECODE(T5.R, ASCII('C'), 1, 0) + DECODE(T6.R, ASCII('C'), 1, 0) + DECODE(T7.R, ASCII('C'), 1, 0)

19 + DECODE(T8.R, ASCII('C'), 1, 0) + DECODE(T9.R, ASCII('C'), 1, 0) + DECODE(T10.R, ASCII('C'), 1, 0) C,

20 DECODE(T1.R, ASCII('D'), 1, 0) + DECODE(T2.R, ASCII('D'), 1, 0) + DECODE(T3.R, ASCII('D'), 1, 0) + DECODE(T4.R, ASCII('D'), 1, 0)

21 + DECODE(T5.R, ASCII('D'), 1, 0) + DECODE(T6.R, ASCII('D'), 1, 0) + DECODE(T7.R, ASCII('D'), 1, 0)

22 + DECODE(T8.R, ASCII('D'), 1, 0) + DECODE(T9.R, ASCII('D'), 1, 0) + DECODE(T10.R, ASCII('D'), 1, 0) D

23 FROM T T1, T T2, T T3, T T4, T T5, T T6, T T7, T T8, T T9, T T10

24 WHERE DECODE(CHR(T2.R), 'A', 'C', 'B', 'D', 'C', 'A', 'B') = CHR(T5.R)

25 AND (CASE CHR(T3.R) WHEN 'A' THEN LEAST(T2.R, T4.R, T6.R) - GREATEST(T2.R, T4.R, T6.R)

26 WHEN 'B' THEN LEAST(T2.R, T3.R, T4.R) - GREATEST(T2.R, T3.R, T4.R)

27 WHEN 'C' THEN LEAST(T3.R, T4.R, T6.R) - GREATEST(T3.R, T4.R, T6.R)

28 ELSE LEAST(T2.R, T3.R, T6.R) - GREATEST(T2.R, T3.R, T6.R) END) = 0

29 AND (CASE CHR(T3.R) WHEN 'A' THEN T2.R - T3.R

30 WHEN 'B' THEN T2.R - T6.R

31 WHEN 'C' THEN T3.R - T2.R

32 ELSE T2.R - T4.R END) != 0

33 AND (CASE CHR(T4.R) WHEN 'A' THEN T1.R - T5.R

34 WHEN 'B' THEN T2.R - T7.R

35 WHEN 'C' THEN T1.R - T9.R

36 ELSE T6.R - T10.R END) = 0

37 AND (CASE CHR(T5.R) WHEN 'A' THEN T8.R - ASCII('A')

38 WHEN 'B' THEN T4.R - ASCII('B')

39 WHEN 'C' THEN T9.R - ASCII('C')

40 ELSE T10.R - ASCII('D') END) = 0

41 AND (CASE CHR(T6.R) WHEN 'A' THEN LEAST(T2.R, T4.R, T8.R) - GREATEST(T2.R, T4.R, T8.R)

42 WHEN 'B' THEN LEAST(T1.R, T6.R, T8.R) - GREATEST(T1.R, T6.R, T8.R)

43 WHEN 'C' THEN LEAST(T3.R, T10.R, T8.R) - GREATEST(T3.R, T10.R, T8.R)

44 ELSE LEAST(T5.R, T9.R, T8.R) - GREATEST(T5.R, T9.R, T8.R) END) = 0

45 AND (CASE CHR(T8.R) WHEN 'A' THEN ABS(T7.R - T1.R)

46 WHEN 'B' THEN ABS(T5.R - T1.R)

47 WHEN 'C' THEN ABS(T2.R - T1.R)

48 ELSE ABS(T10.R - T1.R) END) != 1

49 AND CASE CHR(T9.R) WHEN 'A' THEN T1.R - T6.R + T5.R - T6.R ELSE 1 END != 0

50 AND CASE CHR(T9.R) WHEN 'A' THEN (T1.R - T6.R) * (T5.R - T6.R) ELSE 0 END = 0

51 AND CASE CHR(T9.R) WHEN 'B' THEN T1.R - T6.R + T5.R - T10.R ELSE 1 END != 0

52 AND CASE CHR(T9.R) WHEN 'B' THEN (T1.R - T6.R) * (T5.R - T10.R) ELSE 0 END = 0

53 AND CASE CHR(T9.R) WHEN 'C' THEN T1.R - T6.R + T5.R - T2.R ELSE 1 END != 0

54 AND CASE CHR(T9.R) WHEN 'C' THEN (T1.R - T6.R) * (T5.R - T2.R) ELSE 0 END = 0

55 AND CASE CHR(T9.R) WHEN 'D' THEN T1.R - T6.R + T5.R - T9.R ELSE 1 END != 0

56 AND CASE CHR(T9.R) WHEN 'D' THEN (T1.R - T6.R) * (T5.R - T9.R) ELSE 0 END = 0)

57 SELECT CHR(R1) R1, CHR(R2) R2, CHR(R3) R3, CHR(R4) R4, CHR(R5) R5,

58 CHR(R6) R6, CHR(R7) R7, CHR(R8) R8, CHR(R9) R9, CHR(R10) R10

59 FROM RESULT

60 WHERE (CASE CHR(R7) WHEN 'A' THEN C

61 WHEN 'B' THEN B

62 WHEN 'C' THEN A

63 ELSE D END) = LEAST(A, B, C, D)

64 AND (CASE CHR(R10) WHEN 'A' THEN 3

65 WHEN 'B' THEN 2

66 WHEN 'C' THEN 4

67 ELSE 1 END) = (GREATEST(A, B, C, D) - LEAST(A, B, C, D));

R1 R2 R3 R4 R5 R6 R7 R8 R9 R10

------- ------- ------- ------- ------- ------- ------- ------- ------- -------

B C A C A C D A B A

这个SQL的主要逻辑是:

通过 WITH 构造 A、B、C、D 四个选项;

把十道题的所有选项可能性穷举生成;

按照题意通过 WHERE 语句来进行条件限制;

第三题和第九题都是一道题对应一个 WHERE 语句;

第七题和第十题无法在第一层查询中获取,需要在第二层中过滤。


原文发布时间为:2018-06-10
本文作者:杨廷琨
本文来自云栖社区合作伙伴“ 数据和云”,了解相关信息可以关注“ 数据和云”。
相关文章
|
SQL 索引 Perl
通过错误的sql来测试推理sql的解析过程(二)
 之前总结过一篇  通过错误的sql来测试推理sql的解析过程 http://blog.itpub.net/23718752/viewspace-1848816/ 也算是以毒攻毒,当然也分析出来一些有意思的内容来,让原本看起来枯燥的内容有了更多的实践意义。
1083 0
|
SQL Oracle 关系型数据库
通过错误的sql来测试推理sql的解析过程
在学习Oracle的时候,必然会接触到sql解析的过程。这个过程大体是这样的步骤。 1.对sql的文法检查,查看是否有文法错误,比如from,select拼写错误等。 2.在数据字典里校验sql涉及的对象是否存在。
1061 0
|
关系型数据库 MySQL 网络安全
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
|
SQL 存储 监控
SQL Server的并行实施如何优化?
【7月更文挑战第23天】SQL Server的并行实施如何优化?
565 13
解锁 SQL Server 2022的时间序列数据功能
【7月更文挑战第14天】要解锁SQL Server 2022的时间序列数据功能,可使用`generate_series`函数生成整数序列,例如:`SELECT value FROM generate_series(1, 10)。此外,`date_bucket`函数能按指定间隔(如周)对日期时间值分组,这些工具结合窗口函数和其他时间日期函数,能高效处理和分析时间序列数据。更多信息请参考官方文档和技术资料。
382 9
|
SQL 存储 网络安全
关系数据库SQLserver 安装 SQL Server
【7月更文挑战第26天】
276 6
|
SQL Oracle 关系型数据库
MySQL、SQL Server和Oracle数据库安装部署教程
数据库的安装部署教程因不同的数据库管理系统(DBMS)而异,以下将以MySQL、SQL Server和Oracle为例,分别概述其安装部署的基本步骤。请注意,由于软件版本和操作系统的不同,具体步骤可能会有所变化。
1220 3
|
存储 SQL C++
对比 SQL Server中的VARCHAR(max) 与VARCHAR(n) 数据类型
【7月更文挑战7天】SQL Server 中的 VARCHAR(max) vs VARCHAR(n): - VARCHAR(n) 存储最多 n 个字符(1-8000),适合短文本。 - VARCHAR(max) 可存储约 21 亿个字符,适合大量文本。 - VARCHAR(n) 在处理小数据时性能更好,空间固定。 - VARCHAR(max) 对于大文本更合适,但可能影响性能。 - 选择取决于数据长度预期和业务需求。
1209 1