文章目录

Question

小明正在整理一批历史文献。这些历史文献中出现了很多日期。

小明知道这些日期都在1960年1月1日至2059年12月31日。

令小明头疼的是,这些日期采用的格式非常不统一,有采用年/月/日的,有采用月/日/年的,还有采用日/月/年的。

更加麻烦的是,年份也都省略了前两位,使得文献上的一个日期,存在很多可能的日期与其对应。

比如02/03/04,可能是2002年03月04日、2004年02月03日或2004年03月02日。

给出一个文献上的日期,你能帮助小明判断有哪些可能的日期对其对应吗?

输入格式
一个日期,格式是”AA/BB/CC”。

即每个’/’隔开的部分由两个 0-9 之间的数字(不一定相同)组成。

输出格式
输出若干个不相同的日期,每个日期一行,格式是”yyyy-MM-dd”。

多个日期按从早到晚排列。

数据范围
0≤A,B,C≤9
输入样例:
02/03/04
输出样例:
2002-03-04
2004-02-03
2004-03-02

Ideas

Code

分别取出abc 依次充当年月日 其中充当年的需要加上1900/2000 判断其是否在给定的范围内且是一个合法日期,日期需要从早到晚输出,所以需要先用小的当年

# 分别取出abc 依次充当年月日 其中充当年的需要加上1900/2000 判断其是否在给定的范围内且是一个合法日期,日期需要从早到晚输出,所以需要先用小的当年
lis = sorted(list(map(int,input().strip().split('/'))))
# 1960年1月1日至2059年12月31日。
def f(n,lis):
mn = 19600101
mx = 20591231
# from itertools import permutations
# lis = list(permutations(lis,3)) # 从小到大
# 年/月/日的,有采用月/日/年的,还有采用日/月/年
lis = [
[lis[0],lis[1],lis[2]],
[lis[2],lis[0],lis[1]],
[lis[2],lis[1],lis[0]],
]
def check(year,month,day):
days = [31,28,31,30,31,30,31,31,30,31,30,31]
# 在范围内 年份必定满足要求
# 判断月份是否满足要求
if month > 12 or month < 1 or not month or not day:return False
# 判断非2月的天数是否满足要求
if month!=2 and day > days[month-1]:return False
if month==2:
if (year%4==0 and year%100) or (year%400==0):
if day > days[1] + 1:
return False
return True
for i in lis:
year,month,day = i
year = year + n
date = year*10000+month*100+day
# 判断日期是否在范围内
if mn<=date<=mx and check(year,month,day):
# >>> '{:02}'.format(1) 字符串位宽和填充 ==》 '01'
print('{}-{:02}-{:02}'.format(year,month,day))
f(1900,lis)
f(2000,lis)