鱼C论坛

 找回密码
 立即注册
查看: 3258|回复: 19

[技术交流] python小练习(028):这天星期几?

[复制链接]
发表于 2016-11-28 23:12:54 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 jerryxjr1220 于 2016-11-28 23:13 编辑

python小练习(027),传送门

下面来看看这道题:
某地有两个奇怪的村庄,张庄的人在星期一、三、五说谎,李村的人在星期二、四、六说谎。在其他日子他们说实话。一天,外地的小王来到这里,见到两个人,分别向他们提出关于日期的问题。两个人都说:“前天是我说谎的日子。”
如果被问的两个人分别来自张庄和李村,那么这一天是星期几?

请试着用python来解答。

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-11-28 23:29:50 | 显示全部楼层
  1. z = ['T', 'L', 'T', 'L', 'T', 'L', 'T']
  2. l = ['T', 'T', 'L', 'T', 'L', 'T', 'L']
  3. week = ['日', '一', '二', '三', '四', '五', '六']
  4. for i in range(7):
  5.     if set((z[i], z[(i - 2) % 7])) == {'T', 'L'} and set((l[i], l[(i - 2) % 7]))  == {'T', 'L'}:
  6.         print('这一天是星期%s'%week[i])
  7.         break
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-11-29 09:40:34 | 显示全部楼层
解答:
  1. z = {1:False,2:True,3:False,4:True,5:False,6:True,7:True}
  2. l = {2:False,1:True,4:False,3:True,6:False,5:True,7:True}
  3. for i in range(1,8):
  4.     t = (i+7-3)%7+1
  5.     if (z[i] and not z[t] and not l[i] and l[t]) or (not z[i] and z[t] and l[i] and not l[t]):
  6.         print ('这天星期%d' % i)
复制代码

输出:
这天星期1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-11-29 11:20:13 | 显示全部楼层
烧脑推理题延伸:
新加坡和东盟学校数学奥林匹克竞赛(SASMO)在脸书上公布一道烧脑推理题,题目难度其实不大。

                               
登录/注册后可看大图


简单翻译一下:
Alberty (以下简称 A)和 Bernard (以下简称 B)认识了一个叫 Cheryl(以下简称 C) 的朋友,他们两个都很想知道 C 的生日是哪一天。C 于是给了他们10个可能的日期。

5月15日, 5月16日, 5月19日
6月17日, 6月18日
7月14日, 7月16日
8月14日, 8月15日, 8月17日

然后 C 分别告诉了 A 是哪一个月,告知了 B 是具体是哪一天。接着:

A说:“我不知道C的生日,但我确定B肯定也不知道。”
B说:“刚开始我也不知道是哪一天,现在我知道了。”
A说:“那我现在也知道了。

求Cheryl的生日是哪一天?

                               
登录/注册后可看大图
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-11-29 12:38:47 | 显示全部楼层
本帖最后由 冬雪雪冬 于 2016-11-29 12:40 编辑
jerryxjr1220 发表于 2016-11-29 11:20
烧脑推理题延伸:
新加坡和东盟学校数学奥林匹克竞赛(SASMO)在脸书上公布一道烧脑推理题,题目难度其实不 ...


是不是我没搞清楚,总觉得最后一句应该是B说:“现在A也应该知道了”

又想了一下,题目是对的,我理解错了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-11-29 12:39:50 | 显示全部楼层
冬雪雪冬 发表于 2016-11-29 12:38
是不是我没搞清楚,总觉得最后一句应该是B说:“现在A也应该知道了”

题目没问题,你再想想
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-11-29 12:40:54 | 显示全部楼层
jerryxjr1220 发表于 2016-11-29 12:39
题目没问题,你再想想

是的,题目没错,我错了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-11-29 12:43:58 | 显示全部楼层
冬雪雪冬 发表于 2016-11-29 12:40
是的,题目没错,我错了。

那看看能否写个python算法出来?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-11-29 12:55:19 | 显示全部楼层
jerryxjr1220 发表于 2016-11-29 12:43
那看看能否写个python算法出来?

我想想,难度有些大。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-11-29 13:05:21 | 显示全部楼层
冬雪雪冬 发表于 2016-11-29 12:55
我想想,难度有些大。

提供你个思路,可以考虑利用候选列表的pop()功能,把所有可能项加入候选列表,依次pop出来尝试,如果与条件不符,就继续pop()下一个,如果符合条件就再加回候选列表,如此循环,直到候选列表剩下1个值的时候就是答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-11-29 16:36:00 | 显示全部楼层
看不懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-11-29 17:12:49 | 显示全部楼层
表示确实挺绕的。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-11-29 17:36:48 | 显示全部楼层
本帖最后由 jerryxjr1220 于 2016-11-29 20:06 编辑
jerryxjr1220 发表于 2016-11-29 13:05
提供你个思路,可以考虑利用候选列表的pop()功能,把所有可能项加入候选列表,依次pop出来尝试,如果与 ...

  1. p = ['5-15','5-16','5-19','6-17','6-18','7-14','7-16','8-14','8-15','8-17']
  2. notm = []        #不可能的月份列表
  3. for i in p:
  4.     flag = 0
  5.     for j in p:
  6.         if i != j and i[-2:] == j[-2:]:
  7.             flag = 1
  8.     if flag == 0:
  9.         notm.append(i[0])        #把有孤立日期的月份加入不可能月份列表(因为如果是孤立日期的话,B马上就知晓生日了)
  10. c = 0
  11. while c<10:        #从候选列表里依次排除不可能的月份
  12.     c += 1
  13.     date = p.pop(0)
  14.     m = date[0]
  15.     if m in notm:
  16.         continue
  17.     else:
  18.         p.append(date)
  19. q = []
  20. for i in p:
  21.     flag = 0
  22.     for j in p:
  23.         if i != j and i[-2:] == j[-2:]:        #根据“B听了A的回答后马上就知晓答案”可以判断,在剩下的候选数中,日期必然是孤立值
  24.             flag = 1
  25.     if flag == 0:
  26.         q.append(i)                #把孤立日期放入候选列表中
  27. for i in q:
  28.     flag = 0
  29.     for j in q:
  30.         if i != j and i[0] == j[0]:                #根据“A听了B的回答后也马上知晓了答案”可以判断,在剩下的候选数中,月份也必然是孤立值
  31.             flag = 1
  32.     if flag == 0:
  33.         print i                         #因此可以得到唯一答案
复制代码

@冬雪雪冬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-11-29 20:30:12 | 显示全部楼层

用笨办法写了一个。
  1. list1 = [[5,15],[5,16],[5,19],[6,17],[6,18],[7,14],[7,16],[8,14],[8,15],[8,17]]
  2. list2 = []
  3. list3 = []
  4. #A说:“我不知道C的生日,但我确定B肯定也不知道。”
  5. for i in list1:
  6.     if i[1] not in list2:
  7.         list2.append(i[1])
  8.     else:
  9.         list2.remove(i[1])
  10. for i in list1:
  11.     if i[1] in list2:
  12.         list3.append(i[0])
  13. list1 = [x for x in list1 if x[0] not in list3]
  14. #B说:“刚开始我也不知道是哪一天,现在我知道了。”
  15. list4 = []
  16. for i in list1:
  17.     if i[1] not in list4:
  18.         list4.append(i[1])
  19.     else:
  20.         list4.remove(i[1])
  21. list1 = [x for x in list1 if x[1] in list4]
  22. #A说:“那我现在也知道了。
  23. list5 = []
  24. for i in list1:
  25.     if i[0] not in list5:
  26.         list5.append(i[0])
  27.     else:
  28.         list5.remove(i[0])
  29. list1 = [x for x in list1 if x[0] in list5]
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-11-29 20:41:25 | 显示全部楼层
冬雪雪冬 发表于 2016-11-29 20:30
用笨办法写了一个。

嗯,代码比我写得好,可读性强!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-23 17:28:31 | 显示全部楼层
第一题只想print(‘星期一’)....
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-15 19:38:41 From FishC Mobile | 显示全部楼层
#1=true 0=false
z=[0,1,0,1,0,1,1]
l=[1,0,1,0,1,0,1]
for i in range(7):
    if (z[i]==0 and l[i]==1 and l[i-2]==0) or (l[i]==0 and z[i]==1 and z[i-2]==0):
        print(i)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-15 20:07:05 From FishC Mobile | 显示全部楼层
<code
Avid
/code>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-16 17:31:43 | 显示全部楼层
  1. zhang = {1:False, 2:True, 3:False, 4:True, 5:False, 6:True, 7:True}
  2. li = {1:True, 2:False, 3:True, 4:False, 5:True, 6:False, 7:True}
  3. week = {1:'一',2:'二',3:'三',4:'四',5:'五',6:'六',7:'日'}

  4. for today in range(1, 8):
  5.     if today == 1 or today == 2:
  6.         qiantian = today + 5
  7.     else:
  8.         qiantian = today - 2
  9.     if (zhang[today] == True and zhang[qiantian] == False and li[today] == False and li[qiantian] == True) or\
  10.        li[today] == True and li[qiantian] == False and zhang[today] == False and zhang[qiantian] == True:
  11.         print('今天是星期{}.'.format(week[today]))

  12. #  今天是星期一.
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-18 16:46:57 | 显示全部楼层
  1. zhang,li=[1,0,1,0,1,0,1],[1,1,0,1,0,1,0]
  2. for i in range(7):       
  3.         if zhang[i] !=zhang[i-2] and li[i]!=li[i-2]:
  4.                 print ('这天星期%s' % '日一二三四五六'[i])
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-24 18:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表