|
A: 我找不出来,我知道你也找不出来。
分析:B不知道,也就是说B不可能只根据积来猜出3个数。有的数如果知道积是可以猜出3个数的,例如 X*Y*Z = 10 , 那3个数肯定是 5,2,1 。 这样的数要排除。
A不知道,也就是说A也不可能只根据合来猜出3个数 。例如 X+Y+Z=7,可以确定肯定是 4,2,1 这样的数也要排除。但是上面B排除的数里已经包含了这类数。
A不知道,B也不知道。也就是说,A不知道,B也许知道是不行可以的。
例如, 如果A的合是8的话, 有两种情况, 5,2,1 和 4,3,1,这个时候A不知道, 因为两个中到底是哪个。
但是,他们的积是 5*2*1=10 和 4*3*1=12 。 10 和 12 ,上面已经说了积是10的只有一种情况 5,2,1,已经可以唯一确定了。积是12的有两种,4,3,1和 6,2,1
所以,如果A是8 的话, B也许知道。这个跟上面不满足,所以, A不可能是 8 。
所以, 要把 A不知道,B也许知道的情况排除。
B: 这是很有用的信息,但我还是找不出来。
下面的分析就简单了, 请直接看程序理解。
WITH T AS ( -- 所有可能的结果
SELECT STR
,X,Y,Z
,X+Y+Z S -- 合计
,X*Y*Z P -- 积
,COUNT(1)OVER(PARTITION BY X+Y+Z) S_CNT -- 合,出现的次数
,COUNT(1)OVER(PARTITION BY X*Y*Z) P_CNT -- 积,出现的次数, 如果次数是1, 可以唯一确定一组数
FROM (
SELECT SUBSTR(STR,2) STR
,REGEXP_SUBSTR(STR,'[^,]+',1,1) X
,REGEXP_SUBSTR(STR,'[^,]+',1,2) Y
,REGEXP_SUBSTR(STR,'[^,]+',1,3) Z
FROM (
SELECT SYS_CONNECT_BY_PATH(N,',') STR
FROM (SELECT LEVEL N FROM DUAL CONNECT BY LEVEL < 16)
WHERE LEVEL = 3
CONNECT BY LEVEL <= 3 AND N < PRIOR N
)
)
)
,T1 AS ( -- 要排除的对象
SELECT P,S
FROM T
WHERE P_CNT = 1 -- 积,可以唯一确定一组数
)
,T2 AS (
SELECT STR, X, Y, Z, S, P
,COUNT(1)OVER(PARTITION BY P) P_CNT2 -- 第一轮排除以后,积的出现次数
FROM T
WHERE T.P NOT IN (SELECT T1.P FROM T1) -- A不知道,B也许知道的情况排除
AND T.S NOT IN (SELECT T1.S FROM T1) -- B知道排除
)
,T3 AS (
SELECT T2.*
,COUNT(1)OVER(PARTITION BY S) S_CNT2 -- 合出现的次数
FROM T2
WHERE T2.P_CNT2 > 1 -- B: 这是很有用的信息,但我还是找不出来。
)
SELECT STR
FROM T3
WHERE T3.S_CNT2 = 1 -- A: 现在我找出来了。
;
|
|