设为首页收藏本站

Crossin的编程教室

 找回密码
 立即加入
查看: 18848|回复: 10
打印 上一主题 下一主题

关于微信推送的生日问题

[复制链接]

1

主题

0

好友

25

积分

新手上路

Rank: 1

跳转到指定楼层
楼主
发表于 2017-12-5 12:04:32 |只看该作者 |倒序浏览
新手上路,没看任何提示自己动手写。思路如下:8位数字拆开扔进列表,set变集合去重后再转回列表,对比前后列表长度判断重复。最后输出前在月份和日期对应列表位置上加限制条件,输出的最后一个列表就是所求解。个人觉得这种方法有些繁琐,应该有更好的方法,还请先生赐教。
代码如下:
for a in range(19000101, 20171206):   
    date = str(a)
    l=[]
    for x in date:
        l.append(int(x))
    l2 = set(l)
    l3 = list(l2)
    if (len(l)==len(l3))&(l[4]<2)&(l[6]<3):
        print(l)     //新手上路怕出错,代码写的比较繁琐,见谅。
回复

使用道具 举报

6

主题

2

好友

654

积分

实习版主

Rank: 7Rank: 7Rank: 7

沙发
发表于 2017-12-5 13:52:50 |只看该作者
没看懂你的思路,按着你的码跑了下,也没理出头绪,由于if语句有个判定l和l3长度一致,按代码的意思就是日期里的8位数字全不相同时才会出现,所以输出的情况很少 所以把每次产生l,l2,l3时给输出了下,更懵了。。
12.5.1.PNG


回复

使用道具 举报

0

主题

0

好友

114

积分

注册会员

Rank: 2

板凳
发表于 2017-12-5 14:48:37 |只看该作者
嗯,思路大概没错。但是微信中说的是“自他出生之后到今天,再也没有这样的日子了”,所以我觉得应该倒着推算这日期才对,也就是说
  1. for a in range(20171206, 19000101, -1):
复制代码
回复

使用道具 举报

1

主题

0

好友

25

积分

新手上路

Rank: 1

地板
发表于 2017-12-5 14:55:48 |只看该作者
braid 发表于 2017-12-5 14:48
嗯,思路大概没错。但是微信中说的是“自他出生之后到今天,再也没有这样的日子了”,所以我觉得应该倒着推 ...

嗯,你说的没错。但是这么干最后你得倒回去找第一个输出的结果,这样很麻烦,所以我就没有设置倒序。
回复

使用道具 举报

0

主题

0

好友

114

积分

注册会员

Rank: 2

5#
发表于 2017-12-5 14:57:44 |只看该作者
asphodelus 发表于 2017-12-5 14:55
嗯,你说的没错。但是这么干最后你得倒回去找第一个输出的结果,这样很麻烦,所以我就没有设置倒序。 ...

加个break,及时跳出循环就可以了
回复

使用道具 举报

1

主题

0

好友

25

积分

新手上路

Rank: 1

6#
发表于 2017-12-5 15:07:39 |只看该作者
本帖最后由 asphodelus 于 2017-12-5 15:08 编辑
TED 发表于 2017-12-5 13:52
没看懂你的思路,按着你的码跑了下,也没理出头绪,由于if语句有个判定l和l3长度一致,按代码的意思就是日 ...

根据题意,我在19000101-20171205这个范围里检索满足要求的8位数。
假设在这个范围里任意拿出一个8位数:
1.先判断里面是否有重复的数字:
2.这个数字还得满足日期的格式,月份不能大于12,日期不能大于31(虽然没有影响最后的结果,但是这部分代码是有漏洞的)

for a in range(19000101, 20171206):   //设定检索范围
    date = str(a)  //int类型不能用split拆,所以先转str
    l=[]              //建一个空的list待用
    for x in date:      //把str类型的8位数全部拆开放进空列表l中,放进去的时候把元素转成int,这时候l中相当于有8个int类型的数
        l.append(int(x))
    l2 = set(l)     //把l转成集合类型,因为集合中不能有重复元素,所以会自动消去所有重复的数
    l3 = list(l2)   //将集合转回list后比较set前后两个list长度是否一致,以此判定list里是否有数字被消去,这样就能找到8位都不重复的8位数了。
    if (len(l)==len(l3))&(l[4]<2)&(l[6]<3):  //因为月份最大只能是12,日期最大只能是31,加上相应限制
        print(l)     //输出结果

1.png (61.59 KB, 下载次数: 692)

1.png

回复

使用道具 举报

1

主题

0

好友

25

积分

新手上路

Rank: 1

7#
发表于 2017-12-5 15:08:01 |只看该作者
braid 发表于 2017-12-5 14:57
加个break,及时跳出循环就可以了

有道理
回复

使用道具 举报

6

主题

2

好友

654

积分

实习版主

Rank: 7Rank: 7Rank: 7

8#
发表于 2017-12-5 15:33:18 |只看该作者
asphodelus 发表于 2017-12-5 15:07
根据题意,我在19000101-20171205这个范围里检索满足要求的8位数。
假设在这个范围里任意拿出一个8位数:
...

原。来。这。是。一。道。题。啊。。。。。。。
我还以为你在设计一个微信推送生日的什么算法。。。。。一头雾水。。。

我去看看题目去
回复

使用道具 举报

6

主题

2

好友

654

积分

实习版主

Rank: 7Rank: 7Rank: 7

9#
发表于 2017-12-5 16:32:44 |只看该作者
asphodelus 发表于 2017-12-5 15:07
根据题意,我在19000101-20171205这个范围里检索满足要求的8位数。
假设在这个范围里任意拿出一个8位数:
...

我按倒推写了个,更细化了关于年月日的要求,也更繁琐了。。
12.5.3.PNG
回复

使用道具 举报

1

主题

0

好友

25

积分

新手上路

Rank: 1

10#
发表于 2017-12-5 17:52:58 |只看该作者
TED 发表于 2017-12-5 16:32
我按倒推写了个,更细化了关于年月日的要求,也更繁琐了。。

哈哈哈,原来不在一个频道上。
日期的定义是比我的细多了,看起来代码长点,其实你这个逻辑表达上比我的要准确。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即加入

QQ|手机版|Archiver|Crossin的编程教室 ( 苏ICP备15063769号  

GMT+8, 2024-11-23 03:44 , Processed in 0.017185 second(s), 23 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部