鱼C论坛

 找回密码
 立即注册
查看: 5461|回复: 15

[技术交流] Python:每日一题 104

[复制链接]
发表于 2017-9-27 16:08:04 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 jerryxjr1220 于 2017-9-28 08:44 编辑

每日一题似乎好久不更新了,我来贡献一题吧。

首先我们的玩法做了一下改变:
1. 楼主不再提供答案。24小时后,会贴出参考解答。
2. 为了让大家独立思考,跟帖改为“回帖仅作者可见”,24小时后解除。
3. 鼓励大家积极答题,奖励的期限为出题后24小时内。
4. 根据答案的质量给予1~5鱼币的奖励。

题目:
  一对仇人被一个杀人魔抓了,关在了一个密室。杀人魔给他们出了一个题目,在限定时间,谁能够成功猜到是哪个日期,就可以打开门安全离开。
  首先杀人魔给出了十个日期:5月16、5月17、5月19、6月15、6月18、7月14、7月16、8月14、8月15、8月17,然后告诉了A月份,告诉了B几号。杀人魔知道他们不会将知道的告诉对方。
  限定时间准备到了的时候,A大笑说:“反正我是猜不出来,因为我很确定你也猜不出来”。突然b站起来开了门逃了出去,A才恍然大悟“我也猜出来了”,但是已经晚了。请问日期是多少?

先算算这个日期是什么?

如果能写程序的,就用程序来回答

提示:
这里面其实有3个条件:
1. 没有A的提示,B猜不出是哪天。
2. 经过A提示,B马上知道了哪天。
3. A在B知道了是哪天后,也马上知道了是哪天。
所以,python的程序也可以通过这3个条件来筛选。

本帖被以下淘专辑推荐:

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

使用道具 举报

发表于 2017-9-27 20:12:45 | 显示全部楼层
我认为是8-15。
18和19号很好排除。
如果A拿到的是6月,可以推出6-15。A先逃出了,这样也不成立。
在看其他项。号都有重复项。应该刚刚B排除了A的6-15,现在就只剩一个15号。
即B先出去,B出去了,A才能知道。

点评

不,我坚决不同意楼主的看法!: 5.0
不,我坚决不同意楼主的看法!: 5
不对哦,再想想  发表于 2017-9-27 20:23
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-27 20:29:45 | 显示全部楼层
因为我排除不了5月的其他两个。要是排除了其他两个5月的。就是7-16.

点评

我很赞同!: 5.0
我很赞同!: 5
7-16是对的,想想为什么  发表于 2017-9-27 21:19
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-9-28 08:52:52 | 显示全部楼层
贴一下参考解答:
  1. #先建立所有日期的字典
  2. T = {(i,j):0 for i in range(5,9) for j in range(14,20)}
  3. #把可能日期标记为1
  4. T1 = {(5,16):1,(5,17):1,(5,19):1,(6,15):1,(6,18):1,(7,14):1,(7,16):1,(8,14):1,(8,15):1,(8,17):1}
  5. #更新字典
  6. T.update(T1)
  7. #根据条件1排除有单个日期的月份(因为A知道B猜不出日期,所有这个月份是不可能有单个日期的)
  8. for j in range(14,20):
  9.         c = 0
  10.         for i in range(5,9):
  11.                 if T[i,j]:
  12.                         c += 1
  13.         if c < 2:
  14.                 for i in range(5,9):
  15.                         if T[i,j]:
  16.                                 for k in range(14,20):
  17.                                         T[i,k] = 0
  18. #根据条件2排除剩下可能月份中有重复日期的日期(因为B能猜到日期,必然不可能有重复日期了)
  19. for j in range(14,20):
  20.         d = 0
  21.         for i in range(5,9):
  22.                 if T[i,j]:
  23.                         d += 1
  24.         if d >= 2:
  25.                 for i in range(5,9):
  26.                         T[i,j] = 0
  27. #根据条件3排除剩下可能月份中有2个以上日期的月份(因为A也猜到了日期,这个月份中必然不能有2个以上的日期)
  28. for i in range(5,9):
  29.         e = 0
  30.         for j in range(14,20):
  31.                 if T[i,j]:
  32.                         e += 1
  33.         if e >= 2:
  34.                 for j in range(14,20):
  35.                         T[i,j] = 0
  36. #最终剩下的就是唯一答案
  37. for i,j in T:
  38.         if T[i,j]:
  39.                 print(f'The date is: {i} / {j}')
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-28 10:45:10 | 显示全部楼层

昨天我卡壳了。
因为A说“反正我猜不出来”这半句是废话,不论怎么样A单独肯定是猜不出来的。
“因为我很确定你也才不出来”,这句话中的“很确定”是关键。
先B如果是拿到单号的。就只有18和19,这样B就直接才出来了。即现排除了5-19和6-18。
先假设A为6月的话,只要A看见B不动,那A就可以出门了。即排除了整个6月。
B根据A说“很确定你也才不出来”。
假设A为5月份的话,A就不能对B说“很确定”只能说B也才不出来。#昨天就卡在这儿。
现在就剩下7月和8月。
7月和8月中都有14号。要是B拿到14号,是判断不出来的。B只可能拿到单号。即剩下7-16,8-15,8-17
这个时候B就已经出门了(这个时候我们不知道B,也不用知道B具体为哪个数)。
A这个时候说“也猜出来了”。因为剩下的3个日期中,只有7月是单个的。即最终日期为7-16

评分

参与人数 1荣誉 +2 鱼币 +2 贡献 +1 收起 理由
jerryxjr1220 + 2 + 2 + 1 解题思路完全正确,我上面的程序就是按这个.

查看全部评分

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

使用道具 举报

发表于 2017-9-29 18:19:17 | 显示全部楼层
bush牛 发表于 2017-9-28 10:45
昨天我卡壳了。
因为A说“反正我猜不出来”这半句是废话,不论怎么样A单独肯定是猜不出来的。
“因为我 ...

求助
5月具体是怎么排除掉的?
我的想法:
  1. 1、B没跑,可见拿到的不是 19/18 这两个单独日期,去掉 5.19/6.18
  2. 2、然后A没跑,可见拿到的不是 6 这个剩余单独日期,去掉 6.15
  3. 3、然后B还没跑,可见B拿到的不是 15这个剩余单独日期, 去掉 8.15
复制代码
  1. 剩余:5.16/ 5.17/ 7.14/ 7.16/ 8.14/ 8.17
  2. 每个月份或者日都是成双的,无论如何都没办法100%猜到了
复制代码

感觉A无论是什么都能说“猜不到”
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-29 20:19:49 | 显示全部楼层
solomonxian 发表于 2017-9-29 18:19
求助
5月具体是怎么排除掉的?
我的想法:

A一个人是不可能跑出去的。
为什么排除5月的其他两个。要反复的读“很确定你也猜不出来”
假设A拿到了5月。A不知道B拿到了是否为19号。这个时候A不能说“很确定你也猜不出来”,顶多说“你也猜不出来”(同理6月这个时候也可以排除)。既然A确定了B也猜不出来。说明A拿到了是7月或者8月
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-29 21:44:19 | 显示全部楼层
bush牛 发表于 2017-9-29 20:19
A一个人是不可能跑出去的。
为什么排除5月的其他两个。要反复的读“很确定你也猜不出来”
假设A拿到了5 ...

(⊙o⊙)哦,我有点明白你的意思了
就是A不通过对方有没有行动来判断,
而是仅仅通过自己手中的月份来说出这句“很确定你也猜不出来”,

A“很确定”B猜不到,是因为自己手上的月份根本不是5或6
而不是因为B没跑出去

感觉这样的话,题目的描述有点勉强啊,
都到时间限定了,B如果是18、19早就跑了啊,
A这时候来一句“确定你猜不到”没什么毛病
···
如果设定AB不太醒目,
然后A一开始就来一句“确定你猜不到”可能比较合适
谢谢你啊

点评

我很赞同!: 5.0
问题是程序呢?^_^  发表于 2017-9-29 21:55
我很赞同!: 5
分析很到位!  发表于 2017-9-29 21:55
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-30 19:08:35 | 显示全部楼层
已经完全由人工来完成推理,不知道怎么写合适啊
  1. date = "5月16、5月17、5月19、6月15、6月18、7月14、7月16、8月14、8月15、8月17"
  2. date = [i.split("月") for i in date.split("、")]

  3. day = [i for _,i in date]
  4. month = [i for i,_ in date]

  5. # 条件1:排除单号日
  6. temp1 = [day.index(i) for i in day if day.count(i)==1]

  7. # 条件2:排除5/6月
  8. temp2 = [date.index(i) for i in date if i[0] in '56']
  9. for j in sorted(set(temp1 + temp2),reverse=True):
  10.     day.pop(j)
  11.     month.pop(j)
  12.    
  13. # 条件3:排除成双的日,然后排除成双的月
  14. temp3 = (1 if day.count(i) == 1 else 0 for i in day )
  15. result = [(j,k) for i,j,k in zip(temp3, month, day) if i]

  16. month = [i for i,_ in result]
  17. temp4 = [1 if month.count(i) == 1 else 0 for i in month]
  18. result = [j for i,j in zip(temp4, result) if i]
  19. print(*result)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-1 14:59:38 | 显示全部楼层
你好!我是学习python的新手,刚开始学习“零基础入门学习python”这本书,想跟着做Python每日一题。我想问一下,每日一题是随机出的还是由易到难一点点增加难度的?我想跟着做题,是要找到每日一题的题号1开始跟着练习吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-12-1 15:21:47 | 显示全部楼层
本帖最后由 jerryxjr1220 于 2017-12-1 15:26 编辑
moyuqqxing 发表于 2017-12-1 14:59
你好!我是学习python的新手,刚开始学习“零基础入门学习python”这本书,想跟着做Python每日一题。我想问 ...


http://bbs.fishc.com/forum.php?mod=collection&action=view&ctid=588
跟着题目做一遍,应该会对你的编程水平有提高。
哪怕做不来也可以看看别人的解答。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-19 22:34:08 | 显示全部楼层
所以B没有猜到,直接跑了出去
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 21:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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