鱼C论坛

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

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

[复制链接]
发表于 2017-12-11 14:07:35 | 显示全部楼层
import datetime as d
now=d.date.today()
t=True
d1=1
while t:
    if len(set(str(now-d.timedelta(days=d1))))==9:
        print(str(now-d.timedelta(days=d1)))
        t=False
    else:
        d1+=1
   
#1987-06-25
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-11 23:35:08 | 显示全部楼层
#!/usr/bin/python
# -*- UTF-8 -*-
import datetime
import time


def is_valid_date(str_date):
    try:
        if time.strptime(str_date, "%Y%m%d"):
            return True
    except:
        return False


date_now = datetime.datetime.now().strftime("%Y%m%d")
for i in reversed(range(int(date_now))):
    if len(set(str(i))) == 8:
        if is_valid_date(str(i)):
            print(i)
            break
else:
    print("not find")
   
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-12 04:19:04 | 显示全部楼层
def chercher():
    ajrd = datetime.date.today()
    brithday = str(ajrd.year) + str(ajrd.month) + str(ajrd.day)
    jour = ajrd.day
    mois = ajrd.month
    an = ajrd.year
    jours = [31,28,31,30,31,30,31,31,30,31,30,31]
   
    while len(set(brithday)) != len(brithday):
        jour -= 1
        if jour == 0:
            if mois != 0:
                mois -= 1
                jour = jours[mois - 1]
            else:
                mois = 12
                jour = 31
                an -= 1
                if an % 400 == 0 or (an % 4 == 0 and an % 100 != 0):
                    jours[1] = 29
                else:
                    jours[1] = 28

        brithday = '{}{:0>2}{:0>2}'.format(an, mois, jour)
   
    return brithday
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-12 11:26:34 | 显示全部楼层
没看懂题目呀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-12 17:28:35 | 显示全部楼层
bush牛 发表于 2017-12-8 12:23
这样写的效率比上面要高,上面运行2s左右,下面0.35s左右。
但是当t=23171207的时候(下一次出现这样的 ...

好聪明呀,长见识了。根据题目,日期确实只能是这个形式了。会用计算机以后,大脑已经越来越懒了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-12 21:43:47 | 显示全部楼层
def strcompare(s):
    for i in range(0,7):
        for j in range(i+1,8):
            if s[i] == s[j]:
                return "not match"
        
from datetime import datetime, timedelta
now = datetime.strptime('1972-04-30','%Y-%m-%d')
for i in range(1,30000):
    now = now + timedelta(days=1)
    str1 = str(now).replace('-','').strip()[0:8]
    if strcompare(str1) != "not match":
        lastdate = now
print lastdate
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-13 16:59:46 | 显示全部楼层
楼主不提供答案,题目答题结束以后,可不可以提供思路???其实不太懂题目。。原谅我很蠢
1987-06-25。。那1987-06-24为什么不是的???
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-12-13 17:21:12 | 显示全部楼层
Frank__3 发表于 2017-12-13 16:59
楼主不提供答案,题目答题结束以后,可不可以提供思路???其实不太懂题目。。原谅我很蠢{:10_2 ...

因为“从这个日期以后就再也没有出现这样的日期”这个条件。
1987-06-25如果成立的话,1987-06-24就是1987-06-25之前的一天,与这个条件矛盾了,所以1987-06-24不成立。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-13 21:15:51 | 显示全部楼层
for x in range(1000, 2018):
    for y in range(0, 13):
        for z in range(0, 32):
            a = x // 1000
            b = x // 100 %10
            c = x //10 %10
            d = x % 10
            e = y // 10
            f = y % 10
            g = z // 10
            h = z % 10
            tu = {a, b, c, d, e, f, g, h}
            #print(tu)
            if len(tu) == 8:
                ls = []
                r = str(a) +str(b) +str(c) +str(d) +str(e) +str(f) +str(g) +str(h)
                ls.append(r)
print(ls[-1])
虽然答案是对的,但是迷之不严谨怎么办
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-27 10:37:48 | 显示全部楼层
birthday=[]
i=2018

years=[0,1,2,3]
months=[0,1]
days=[0,1]
months_days={1:31,2:28,3:31,4:30,5:31,6:30,7:31,8:31,9:30,10:31,11:30,12:31}
Find=None

while Find!=True:
    birthday=[]
    i=i-1
    years[0]=i//1000
    years[1]=i%1000//100
    years[2]=i%1000%100//10
    years[3]=i%1000%100%10

    birthday.extend(years)
   
    for j in list(months_days.keys()):
        months[0]=j//10
        months[1]=j%10
        birthday.extend(months)

        for d in range(1,months_days[j]+1):
            days[0]=d//10
            days[1]=d%10
            birthday.extend(days)
            
            if len(set(birthday))==len(birthday):
                print(birthday)
                Find=True

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

使用道具 举报

发表于 2018-1-4 09:03:06 | 显示全部楼层
好久没见到每日一题了,坚持哦,这种为什么不采用众包形式,大家一起来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-17 22:21:00 | 显示全部楼层
jerryxjr1220 发表于 2017-12-13 17:21
因为“从这个日期以后就再也没有出现这样的日期”这个条件。
1987-06-25如果成立的话,1987-06-24就是19 ...

老哥3456年12月7日不可以吗……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-18 10:59:38 | 显示全部楼层
本帖最后由 panheng 于 2019-8-18 11:09 编辑

如果你有一个问题并使用正则表达式,现在你有两个问题了。
写日期正则表达式用了99%时间,还没考虑闰年的情况,不过2月29日正好也不符合题意
import re
end = 20171207
start = 19000101    #设置起始日期
list1 = []
p = re.compile(r'\b[12]\d\d\d((0[13578](0[1-9]|[12]\d|3[01]]))|(0[469](0[1-9]|[12]\d|30]))|(02(0[1-9]|[12]\d))|(1[02](0[1-9]|[12]\d|3[01]]))|(11(0[1-9]|[12]\d|30])))\b')
for date in range(start, end+1):
    if p.match(str(date)):
        temp = {each for each in str(date)}
        if len(temp) == 8:
            list1.append(date)
if len(list1) != 0:
    print(list1[-1])
else:
    print("没有符合条件的日期")
19870625
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-18 11:53:15 | 显示全部楼层
又试了个简单的,通过datetime模块生成目标格式日期,若符合条件输出,否则向前推一天直至匹配。
import datetime
enddate = datetime.date(2017,12,7)
while True:
    date = str(enddate).replace('-','')
    if len(set(date)) == 8:
        print(date)
        break
    else:
        enddate -= datetime.timedelta(1)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-12 18:15:28 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-27 07:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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