鱼C论坛

 找回密码
 立即注册
12
返回列表 发新帖
楼主: jerryxjr1220

[已解决]来来来,小学三年级的题目有多少大人能做出来?

[复制链接]
发表于 2017-8-31 01:25:34 From FishC Mobile | 显示全部楼层
手机发的  不会发成代码格式 而且 最开始的 那个 叉也没显示出来。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-31 10:12:53 | 显示全部楼层
#思路
"""
一开始惯性思维是问which_day,
但想了很久发现不对,应该是how to plan.
这应该是一个扫雷游戏,先确定安全区域,然后判断雷区在哪.
"""
import pandas as pd

week = ["Sunday","Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]
Flowers_Boolm_Day = {}

#向日葵,二、四、日不开花
Flowers_Boolm_Day["Sunflower"] = [False,True,False,True,False,True,True]
#百合,四、六不开花
Flowers_Boolm_Day["Lily"] = [True,True,True,True,False,True,False]
#牡丹,周日不开花
Flowers_Boolm_Day["Peony"] = [False,True,True,True,True,True,True]

df=pd.DataFrame(data=Flowers_Boolm_Day,index=week)
df=df.applymap(lambda x:"Undefine" if x==True else "Fall")
# print(df)

"""
花园有三种花:向日葵,茉莉,百合.
1.一个星期内,只有一天是三种花都开花
2.没有一种花能连续开三天(每种花最多只能开两天)
3.任何两种花同时不开花不能超过一天
4.向日葵,二、四、日不开花
5.百合,四、六不开花
6.牡丹,周日不开花
"""


# 1.一个星期内,只有一天是三种花都开花

# 3.任何两种花同时不开花不能超过一天
df.loc[["Tuesday","Thursday"],"Peony"] = "Boolm"
df.loc["Saturday","Sunflower"] = "Boolm"
df.loc[["Sunday","Tuesday"],"Lily"] = "Boolm"
# 2.没有一种花能连续开三天(每种花最多只能开两天)
df.loc["Monday","Lily"] = "Fall"
df.loc["Monday","Sunflower"] = "Boolm"
df.loc["Wednesday","Peony"] = "Fall"
df.loc["Wednesday","Sunflower"] = "Boolm"
print(df)


这是一步步填出来的,不太科学,比较笨的方法,最后合乎条件的,只能是周五
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-31 11:18:06 | 显示全部楼层
kio 发表于 2017-8-31 10:12
#思路
"""
一开始惯性思维是问which_day,

你这个和填excel表差不多,应该不能算是程序自动求解的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-1 10:34:14 | 显示全部楼层
【1 0 1 0 1 0 0】
【1 0 1 0 0 0 1】
【1 1 0 1 0 1 0】

我日为什么我觉得周一可以

额,理解错3了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-1 19:58:59 | 显示全部楼层
完整分析:

QQ图片20170901195942.png

分析:
1、根据第一遍阅读题目得知,三种花同时开放的日子有三种可能,那就是周一,周二和周日;

2、由于周四向日葵和百合同时不开,所以牡丹必开;周日向日葵和牡丹不开,所以百合必开;

3、对于周二,向日葵不开,所以百合和牡丹可能开,但是两种花同时不开的时间只有一天,所以百合周二必开,牡丹周二必开。

4、由于百合周日必开,但是却不能连续三天,所以百合周一不开;故排除周一三种花同时开放的可能。牡丹周三不开,故排除周三三种花同时开放的可能。
       
5、所以,三种花同时开放的日子只有周五。


代码么…………小白一个,正在琢磨…………
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-2 03:11:03 | 显示全部楼层
有空,把题目写完~

  1. import numpy as np
  2. from pandas import rolling_sum
  3. from itertools import product

  4. def 条件2(arr):
  5.     a=np.hstack((arr[:,-2:], arr))
  6.     return np.all(rolling_sum(a, 3, 0, axis=1)[:,2:]<3)   

  7. def 条件3(arr):
  8.     return all(np.sum(np.sum(arr[rows]==0,0)==2)<2
  9.                for rows in [[0,1],[0,2],[1,2]])

  10. # 条件 4、5、6
  11. idx=(np.array([0, 0, 0, 1, 1, 2]),
  12.      np.array([2, 4, 7, 4, 6, 7])-1)

  13. for p in product(range(2),repeat=21):
  14.     arr = np.array(p).reshape(3,7)
  15.     if (np.all(arr[idx]==0) and # 条件 4、5、6
  16.         np.sum(np.sum(arr,0)==3)==1 and # 条件1
  17.         条件2(arr) and
  18.         条件3(arr)):
  19.         print('三种花在星期%s同时绽放' % (np.where(np.sum(arr,0)==3)[0][0]+1),
  20.               arr, sep='\n')
  21.    
复制代码
  1. 三种花在星期5同时绽放
  2.   [[1 0 1 0 1 1 0]
  3.    [0 1 1 0 1 0 1]
  4.    [1 1 0 1 1 0 0]]
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-2 19:42:16 | 显示全部楼层
谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-9-6 23:46:56 | 显示全部楼层
本帖最后由 kio 于 2017-9-7 08:54 编辑

用FOR循环来解题的,我个人的看法,是错的.虽然也能算出答案,但思维方式不对.

这么简单的题,我想了一个星期才想出来.
答案是一早推出来了,但抽象成程序,有点难.
  1. import pandas as pd

  2. week = ["Sunday","Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]
  3. Flowers_Boolm_Day = {}
  4. #向日葵,二、四、日不开花 (False表示不开花,True表示未确定开花或不开花)
  5. Flowers_Boolm_Day["Sun"] = [False,True,False,True,False,True,True]
  6. #百合,四、六不开花
  7. Flowers_Boolm_Day["Lily"] = [True,True,True,True,False,True,False]
  8. #牡丹,周日不开花
  9. Flowers_Boolm_Day["Peony"] = [False,True,True,True,True,True,True]

  10. df=pd.DataFrame(data=Flowers_Boolm_Day,index=week)
  11. df=df.applymap(lambda x:0 if x==True else -1) #1表示开花,0表示不确定,-1表示不开花.
  12.    

  13. def cheack_same_day():
  14.     global df   
  15.     df["lp"]=df["Lily"]+df["Peony"]
  16.     df["ls"]=df["Lily"]+df["Sun"]
  17.     df["sp"]=df["Sun"]+df["Peony"]
  18.     #统计有多少天
  19.     df["undefine"]=df.apply(lambda x:len(x[:3][x==0]),axis=1)

  20. #定义任何两种花同时不开花不能超过一天,统计同一天不开花的时间,如果-2则表示同一天不开化
  21. #比较两组数据,x,y
  22. def compare_LeftRight(s,x,y):   
  23.     if s[x]==0 and s[y]==-1:
  24.         s[x]=1        
  25.     elif s[x]==-1 and s[y]==0:
  26.         s[y]=1        
  27.     return s

  28. #横向填空
  29. def fill_x():
  30.     cheack_same_day()#更新数据,保证是最新数据
  31.     global df   
  32.     if -2 in df["lp"].values:
  33.         df = df.apply(compare_LeftRight,axis=1,args=("Lily","Peony"))
  34.     if -2 in df["ls"].values:
  35.         df = df.apply(compare_LeftRight,axis=1,args=("Lily","Sun"))
  36.     if -2 in df["sp"].values:
  37.         df = df.apply(compare_LeftRight,axis=1,args=("Sun","Peony"))
  38.     cheack_same_day()#更新数据,保证是最新数据

  39. #定义没有一种花能连续开三天(每种花最多只能开两天)
  40. def compare_UpDown(s):
  41.     """
  42.     1.找到未确定的位置,(一个字符串列表)
  43.     2.循环列表
  44.     3.对比上下
  45.     """
  46.     undefines = s[s==0]
  47.     for i in undefines.index:
  48.         if s.shift(-1)[i]==1 and s.shift(1)[i]==1:
  49.             s[i]=-1
  50.     return s   

  51. #竖向填空
  52. def fill_y():
  53.     cheack_same_day()#更新数据,保证是最新数据
  54.     global df
  55.     df = df.apply(compare_UpDown,axis=0)
  56.     cheack_same_day()#更新数据,保证是最新数据

  57. #主函数,判断是否同一天开花
  58. def cheack_only():
  59.     cheack_same_day()
  60.     zeros_ = len(df[df["undefine"]==3])
  61.     if  zeros_ == 1:
  62.         print("同一天开花的时间是:%s" % df[df["undefine"]==3].index[0])
  63.         return df[df["undefine"]==3].index
  64.     fill_x()
  65.     fill_y()
  66.     cheack_same_day()
  67.     print("有可能的目标还有%d个"%zeros_)
  68.     return cheack_only()
  69. if __name__ == "__main__":
  70.     cheack_only()
复制代码



前面发过一个回复,当时的思路还比较混乱.
分析下思路,首先把这个花期,抽象成一张表格,
  1.      Lily   Peony     Sun
  2. Sunday     unknow     fall      fall
  3. Monday     unknow  unknow  unknow
  4. Tuesday    unknow  unknow     fall
  5. Wednesday  unknow  unknow  unknow
  6. Thursday      fall  unknow     fall
  7. Friday     unknow  unknow  unknow
  8. Saturday      fall  unknow  unknow
复制代码


然后,我们来深入一些.
把开花定义为1,不开花定义为-1,不知道开不开花的定义为0
我们就再得到了一张表:
  1.     Lily  Peony  Sun
  2. Sunday        0     -1   -1
  3. Monday        0      0    0
  4. Tuesday       0      0   -1
  5. Wednesday     0      0    0
  6. Thursday     -1      0   -1
  7. Friday        0      0    0
  8. Saturday     -1      0    0
复制代码



跟着我们把这个表扩展一下,增加几个属性,
主要是用来描述,两种花有没有在同一天不开花,
lp是Lily和Peony的和,如果产生了一个-2的值,就说明这一天,两种花都同是开花了,-1则只知道有一种花没开,0表示全不知道
ls,sp分别对应Lily+Sun和Sun+Peony

  1.       Lily  Peony  Sun  lp  ls  sp  undefine
  2. Sunday        0     -1   -1  -1  -1  -2         1
  3. Monday        0      0    0   0   0   0         3
  4. Tuesday       0      0   -1   0  -1  -1         2
  5. Wednesday     0      0    0   0   0   0         3
  6. Thursday     -1      0   -1  -1  -2  -1         1
  7. Friday        0      0    0   0   0   0         3
  8. Saturday     -1      0    0  -1  -1   0         2
复制代码


因为条件3,对其它项目的影响不大,而且条件最明确,所以我们先来个横填空.
  1.       Lily  Peony  Sun  lp  ls  sp  undefine
  2. Sunday        1     -1   -1   0   0  -2         0
  3. Monday        0      0    0   0   0   0         3
  4. Tuesday       1      1   -1   2   0   0         0
  5. Wednesday     0      0    0   0   0   0         3
  6. Thursday     -1      1   -1   0  -2   0         0
  7. Friday        0      0    0   0   0   0         3
  8. Saturday     -1      0    1  -1   0   1         1
复制代码


满足了条件3后,填条件2的时机也成熟了.
  1.       Lily  Peony  Sun  lp  ls  sp  undefine
  2. Sunday        1     -1   -1   0   0  -2         0
  3. Monday       -1      0    0  -1  -1   0         2
  4. Tuesday       1      1   -1   2   0   0         0
  5. Wednesday     0     -1    0  -1   0  -1         2
  6. Thursday     -1      1   -1   0  -2   0         0
  7. Friday        0      0    0   0   0   0         3
  8. Saturday     -1      0    1  -1   0   1         1
复制代码


填完了这里,我们就可以判断出,唯一可能乎合条件的就只能是星期五了,没错,是可能.

这里有个问题,在这个题目里,各位条件给的很到位,填一遍就能算出答案了.
但如果这个条件变一下,就会发现,横向填完,竖向的条件就变了,填完竖向,横向的条件也跟着发生变化了.
它们是两个互相影响的关系.在更多不确实的条件下,要不断的去循环这两步的工作,就像玩数独一样.
在这里就要用到递归的算法来解决了.


咱们玩个接龙游戏,我也出一题.
TIM截图20170907002338.png

分别在格子中填入1到9的数字,并满足下面的条件。
1.每一行都用到1,2,3,4,5,6,7,8,9
2.每一列都用到1,2,3,4,5,6,7,8,9
3.每3×3的格子都用到1,2,3,4,5,6,7,8,9

用程序来写吧.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-7 00:27:51 | 显示全部楼层
jerryxjr1220 发表于 2017-8-31 11:18
你这个和填excel表差不多,应该不能算是程序自动求解的

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

使用道具 举报

 楼主| 发表于 2017-9-7 13:50:02 | 显示全部楼层
kio 发表于 2017-9-6 23:46
用FOR循环来解题的,我个人的看法,是错的.虽然也能算出答案,但思维方式不对.

这么简单的题,我想了一个星 ...

这题不就是数独吗?
看我的数独程序:http://bbs.fishc.com/thread-82257-1-1.html
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-7 16:18:27 | 显示全部楼层
周三?
再见了,连小学三年级的题目都要用猜的了,我回去读幼儿园
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-8 12:51:43 | 显示全部楼层
本帖最后由 kio 于 2017-9-8 12:53 编辑
jerryxjr1220 发表于 2017-9-7 13:50
这题不就是数独吗?
看我的数独程序:http://bbs.fishc.com/thread-82257-1-1.html


果然是大神,像这种题,求任一解,才是正路,很多情况并不是唯一解.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-28 08:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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