解S先生与P先生谜题,s先生谜题,Python语言: 解S


Python语言: 解S先生与P先生谜题#设有两个自然数X、Y,2<=X<=Y<=99,#S先生知道这两个数的和S,#P先生知道这两个数的积P,#他们二人进行了如下对话:#* S:我确信你不知道这两个数是什么,但我也不知道。#* P: 一听你说这句话,我就知道这两个数是什么了。#* S: 我也是,现在我也知道了。#现在你能通过他们的会话推断出这两个数是什么吗?#(当然,S和P先生都是非常聪明的)from math import sqrtMIN, MAX = 2, 99#只需要判断y的范围, 程序确保x的取值范围def BaseCondition(x, y):    if y >= MIN and y <= MAX and y >= x: return True    return False#S先生的S分析def S(x, y):    s = x + y    return [(x,s-x) for x in xrange(MIN, s/2+1)]#P先生的P分析def P(x, y):    p = x * y    return [(x,p/x) for x in xrange(MIN, int(sqrt(p)+1))            if p%x==0 and BaseCondition(x, p/x)]#所有待检查的数据def ToCheck():    return ((x,y) for x in xrange(MIN, MAX+1) for y in xrange(x, MAX+1))#条件1 - S:我确信你不知道这两个数是什么,但我也不知道。def Condition1(x, y):    s_sep = S(x, y)    if len(s_sep) == 1: return False # S分析唯一    for x1, y1 in s_sep:        if len(P(x1, y1)) == 1: return False #P分析唯一    return True#条件2 - P: 一听你说这句话,我就知道这两个数是什么了。def Condition2(x, y):    p_sep = [c for c in P(x,y) if c!=(x,y)] #除(x,y)之外的P分析    for item in p_sep:        if Condition1(*item): return False #若还有满足条件1的解则失败    return True#条件3 - S: 我也是,现在我也知道了。def Condition3(x, y):    s_sep = [c for c in S(x, y) if c!=(x,y)] #除(x,y)之外的S分析    for item in s_sep:        if Condition2(*item): return False #若还有满足条件2的解则失败    return True#需要同时满足上面3个条件def Condition(*c):    return Condition1(*c) and Condition2(*c) and Condition3(*c)result = (c for c in ToCheck() if Condition(*c))print result.next()#该片段来自于http://byrx.net

评论关闭