ITPub博客

首页 > > > 看SQL如何求解刑侦科目推理题?

看SQL如何求解刑侦科目推理题?

作者:liyue071714118 时间:2018-12-09 15:14:37 0 删除 编辑

点击上方SQL数据库开发,关注获取SQL视频教程


SQL专栏

SQL数据库基础知识汇总

SQL数据库高级知识汇总

网传一则《2018年刑侦科目推理试题,你能做出来吗?》,虽然这题已经过去很久了,而且网上也有很多程序员用各种开发语言已经求解出来,今天我们用PL/SQL语言来试试该如何求解?

试题内容

2018年刑侦科目推理试题 (试题内容有修改,非网上原题,请勿用网上答案来检测。)

单项选择(每题10分,共100分)。

1.这道题的答案是:
A.A           B.B

C.C          D.D

2.第5题的答案是:
A.A      
     B.D

C.B           D.C

3.以下选项中哪一道题的答案与其它三项不同:
A.第3题     
 B.第6题

C.第2题      D.第4题

4.以下选项中哪两道题的答案相同:
A.第1、5题     
   B.第2、7题

C.第1、9题        D.第6、10题

5.以下选项中哪一道题的答案与本题相同:
A.第8题     
 B.第4题 

C.第9题      D.第7题

6.以下选项中哪两道题的答案与第8题相同:
A.第2、4题     
   B.第1、6题

C.第3、10题      D.第5、9题

7.在此十道题中,被选中次数最少的选项字母为:
A.C     
      B.B

C.A           D.D

8.以下选项中哪一道题的答案与第1题的答案在字母中不相邻:
A.第7题     
      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   


求解过程

我们用Oracle数据库的PL/SQL来解决一下这个问题 

--定义一个保存ABCD选项的临时表T
WITH T AS
(
SELECT 'A' AS ID FROM DUAL UNION ALL
SELECT 'B' AS ID FROM DUAL UNION ALL
SELECT 'C' AS ID FROM DUAL UNION ALL
SELECT 'D' AS ID FROM DUAL
),
--定义一个存放每一道题的结果的临时表,最后一列是最终结果列
X AS(
SELECT
T1.ID ID1,
T2.ID ID2,
T3.ID ID3,
T4.ID ID4,
T5.ID ID5,
T6.ID ID6,
T7.ID ID7,
T8.ID ID8,
T9.ID ID9,
T10.ID ID10,
T1.ID||T2.ID||T3.ID||T4.ID||T5.ID||T6.ID||T7.ID||T8.ID||T9.ID||T10.ID ID100
FROM T T1,T T2,T T3,T T4,T T5,T T6,T T7,T T8,T T9,T T10)
--根据每道题的逻辑,我们按要求在WHERE条件中写出每个题的逻辑思路进行排除。
SELECT ID1,ID2,ID3,ID4,ID5,ID6,ID7,ID8,ID9,ID10 FROM X
WHERE ID2=CASE WHEN ID5='A' THEN 'A'
             WHEN ID5='D' THEN 'B'
             WHEN ID5='B' THEN 'C'
             WHEN ID5='C' THEN 'D' END
AND ID3=CASE WHEN ID3 NOT IN(ID2,ID4,ID6) THEN 'A'
             WHEN ID6 NOT IN(ID3,ID4,ID2) THEN 'B'
             WHEN ID2 NOT IN(ID3,ID4,ID6) THEN 'C'
             WHEN ID4 NOT IN(ID3,ID6,ID2) THEN 'D' END
AND ID4=CASE WHEN ID1=ID5 THEN 'A'
             WHEN ID2=ID7 THEN 'B'
             WHEN ID1=ID9 THEN 'C'
             WHEN ID6=ID10 THEN 'D' END
AND ID5=CASE WHEN INSTR(ID8||ID4||ID9||ID7,ID5)=1 THEN 'A'
             WHEN INSTR(ID8||ID4||ID9||ID7,ID5)=2 THEN 'B'
             WHEN INSTR(ID8||ID4||ID9||ID7,ID5)=3 THEN 'C'
             WHEN INSTR(ID8||ID4||ID9||ID7,ID5)=4 THEN 'D' END
AND ID6=CASE WHEN ID8||ID8=ID2||ID4  THEN 'A'
             WHEN ID8||ID8=ID1||ID6  THEN 'B'
             WHEN ID8||ID8=ID3||ID10 THEN 'C'
             WHEN ID8||ID8=ID5||ID9  THEN 'D' END
AND ID7=DECODE(
    GREATEST(LENGTH(REPLACE(ID100,'A','')),
             LENGTH(REPLACE(ID100,'B','')),
             LENGTH(REPLACE(ID100,'C','')),
             LENGTH(REPLACE(ID100,'D',''))),
             LENGTH(REPLACE(ID100,'C','')) , 'A',
             LENGTH(REPLACE(ID100,'B','')) , 'B',
             LENGTH(REPLACE(ID100,'A','')) , 'C',
             LENGTH(REPLACE(ID100,'D','')) , 'D' )
   AND ID8=CASE WHEN ID1||ID7  NOT IN('AB','BA','BC','CB','CD','DC') THEN 'A'
                WHEN ID1||ID5  NOT IN('AB','BA','BC','CB','CD','DC') THEN 'B'
                WHEN ID1||ID2  NOT IN('AB','BA','BC','CB','CD','DC') THEN 'C'
                WHEN ID1||ID10 NOT IN('AB','BA','BC','CB','CD','DC') THEN 'D' END
   AND ID9=CASE WHEN DECODE(ID1,ID6,1,0)+DECODE(ID6 ,ID5,1,0)=1 THEN 'A'
                WHEN DECODE(ID1,ID6,1,0)+DECODE(ID10,ID5,1,0)=1 THEN 'B'
                WHEN DECODE(ID1,ID6,1,0)+DECODE(ID2 ,ID5,1,0)=1 THEN 'C'
                WHEN DECODE(ID1,ID6,1,0)+DECODE(ID9 ,ID5,1,0)=1 THEN 'D' END
   AND ID10=DECODE(GREATEST(LENGTH(REPLACE(ID100,'A','')),
             LENGTH(REPLACE(ID100,'B','')),
             LENGTH(REPLACE(ID100,'C','')),
             LENGTH(REPLACE(ID100,'D','')))
             -LEAST(LENGTH(REPLACE(ID100,'A','')),
             LENGTH(REPLACE(ID100,'B','')),
             LENGTH(REPLACE(ID100,'C','')),              
             LENGTH(REPLACE(ID100,'D',''))),3,'A',2,'B',4,'C',1,'D')

(提示:可以左右滑动代码)

解题结果为:

 

小伙伴们可以将试题结果带进试题中去验证一下看是否正确。

               

解题思路 

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

把十道题的所有结果选项通过笛卡尔积穷举生成出来;

按照题意通过 WHERE 语句对这些生成的选项结果进行条件限制;

符合WHERE条件的就是最后的结果啦   


本想用T-SQL语言来重写,但是发现T-SQL里面很多函数不支持,需要自定义函数,还是PL/SQL在功能逻辑处理方面强一点。有兴趣的可以自己动手尝试一下,特别是里面用到的一些函数可以了解一下~   

推荐阅读

(点击标题可跳转阅读)

如何用存储过程自动生成一张日历表

SQL Server删除重复数据只保留一行

MySQL 中一个双引号的错位引发的血案

技术交流请加QQ群:875156894

看完本文有收获?请转发分享给更多人

长按识别二维码,
更多咨询早知道!

回复进群,拉你进微信群

原文作者:;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2021-12-10

  • 博文量
    1486
  • 访问量
    11399