Crossin的编程教室

标题: 关于微信推送的生日问题 [打印本页]

作者: asphodelus    时间: 2017-12-5 12:04
标题: 关于微信推送的生日问题
新手上路,没看任何提示自己动手写。思路如下: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)     //新手上路怕出错,代码写的比较繁琐,见谅。
作者: TED    时间: 2017-12-5 13:52
没看懂你的思路,按着你的码跑了下,也没理出头绪,由于if语句有个判定l和l3长度一致,按代码的意思就是日期里的8位数字全不相同时才会出现,所以输出的情况很少 所以把每次产生l,l2,l3时给输出了下,更懵了。。
12.5.1.PNG



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

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

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

加个break,及时跳出循环就可以了
作者: asphodelus    时间: 2017-12-5 15:07
本帖最后由 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, 下载次数: 505)

1.png


作者: asphodelus    时间: 2017-12-5 15:08
braid 发表于 2017-12-5 14:57
加个break,及时跳出循环就可以了

有道理
作者: TED    时间: 2017-12-5 15:33
asphodelus 发表于 2017-12-5 15:07
根据题意,我在19000101-20171205这个范围里检索满足要求的8位数。
假设在这个范围里任意拿出一个8位数:
...

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

我去看看题目去

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

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

作者: asphodelus    时间: 2017-12-5 17:52
TED 发表于 2017-12-5 16:32
我按倒推写了个,更细化了关于年月日的要求,也更繁琐了。。

哈哈哈,原来不在一个频道上。
日期的定义是比我的细多了,看起来代码长点,其实你这个逻辑表达上比我的要准确。
作者: TED    时间: 2017-12-5 18:26
asphodelus 发表于 2017-12-5 17:52
哈哈哈,原来不在一个频道上。
日期的定义是比我的细多了,看起来代码长点,其实你这个逻辑表达上比我的 ...

毕竟一开始研究了半天你的代码。。

再写就取长补短了 哈哈




欢迎光临 Crossin的编程教室 (https://bbs.crossincode.com/) Powered by Discuz! X2.5