poster262

关于回文日的若干事实

6595
2
今天是2021年12月2日,是一个回文日,这样的日子真的千载难逢吗?你知道相邻两个回文日期最少相隔几天吗?
关于回文日的若干事实
5 人挑战成功
返回挑战
challenge-problem-icon

完成本期挑战需要达到:

初中数学水平

5 / 8 读者挑战成功
题目

你能发现回文日的其他事实吗?__________如果能,欢迎评论区提交你的发现.

选项

不能

跳过看答案

今天是2021年12月2日,若将其写成年月日相连的八位数:20121202,则从左往右读和从右往左读是一样的,这样的数称为回文数,因此今天便是一个回文日. 下面我们就来介绍回文日的几个事实.

本文考虑的日期都用八位数表示,年份都写成四位数的形式,不足的用0补足,比如公元212年写成0212,公元30年写成0030,公元12年5月13日就是00120513.

今天是第83个回文日

从公元纪年开始到今年年底, 共有83个回文日,而今天就是第83个.

import datetime
start_date = datetime.date(1, 1, 1)
end_date = datetime.date(2021, 12, 31)
delta = datetime.timedelta(days=1)
r=[]
date = start_date
while date <= end_date:
    x = date.strftime('%Y%m%d')
    if len(x)<8:
        x = '0'*(8-len(x)) + x
    if str(x)[:: 1] == str(x)[::-1]:
        r.append(date)
        print(x)
    date += delta
len(r)

outputs:

83

3000年回文日分布

将公元1年到公元3000年内的回文日按照每100年进行统计,统计后的分布直方图如图所示,从图表中可以看出,回文日都集中在每个千年的头几个世纪. 也就是公元100,200,300;1000,1100,1200,1300;2000,2100,2200年后的100年内. 而其他世纪竟然都没有回文日.

year_arr = [i.year for i in r]
import numpy as np

hist,bins = np.histogram(year_arr,30,[0,3000])

from matplotlib import pyplot as plt 

plt.hist(year_arr, bins, color='#0504aa', alpha=0.6, rwidth=0.85) 
plt.title("100years comparing") 
plt.grid(axis='y', alpha=0.75)
plt.show()

image

距离最近的两个回文日

统计公元1年到公元3000年内的回文日,从结果可以看出,距离最近的两个回文日并不唯一,竟然有17对,今天20211202与上一个回文日20200202,也在其内,它们相距仅669天,即1年10个月.

start_date = datetime.date(1, 1, 1)
end_date = datetime.date(2999, 12, 31)
delta = datetime.timedelta(days=1)
date_arr=[]
date = start_date
while date <= end_date:
    x = date.strftime('%Y%m%d')
    if len(x)<8:
        x = '0'*(8-len(x)) + x
        
    if str(x)[:: 1] == str(x)[::-1]:
        date_arr.append(date)
    date += delta

delta_arr = []
for i in range(1,len(date_arr)):
    delta= date_arr[i]-date_arr[i-1]
    delta_arr.append(delta.days)
delta_min = min(delta_arr)
delta_min_indexes = [i for i, j in enumerate(delta_arr) if j == delta_min]
for i in range(0,len(delta_min_indexes)):
    print(date_arr[delta_min_indexes[i]].strftime('%Y-%m-%d')+'~~'+date_arr[delta_min_indexes[i]+1].strftime('%Y-%m-%d'))

outputs:

    
    110-01-10~~111-11-10
    
    120-02-10~~121-12-10
    
    210-01-20~~211-11-20
    
    220-02-20~~221-12-20
    
    310-01-30~~311-11-30
    
    1010-01-01~~1011-11-01
    
    1020-02-01~~1021-12-01
    
    1110-01-11~~1111-11-11
    
    1120-02-11~~1121-12-11
    
    1210-01-21~~1211-11-21
    
    1220-02-21~~1221-12-21
    
    2010-01-02~~2011-11-02
    
    2020-02-02~~2021-12-02
    
    2110-01-12~~2111-11-12
    
    2120-02-12~~2121-12-12
    
    2210-01-22~~2211-11-22
    
    2220-02-22~~2221-12-22

距离最远的两个回文日

统计公元1年到公元3000年内的回文日,竟然只有一对,1380年08月31日~~2001年10月02日. 从14世纪到21世纪,相差了620年之多.

start_date = datetime.date(1, 1, 1)
end_date = datetime.date(2999, 12, 31)
delta = datetime.timedelta(days=1)
date_arr=[]
date = start_date
while date <= end_date:
    x = date.strftime('%Y%m%d')
    if len(x)<8:
        x = '0'*(8-len(x)) + x
        
    if str(x)[:: 1] == str(x)[::-1]:
        date_arr.append(date)
    date += delta

delta_arr = []
for i in range(1,len(date_arr)):
    delta= date_arr[i]-date_arr[i-1]
    delta_arr.append(delta.days)
print(delta_arr)
delta_max = max(delta_arr)
delta_max_indexes = [i for i, j in enumerate(delta_arr) if j == delta_max]
print(delta_max_indexes)
for i in range(0,len(delta_max_indexes)):
    print(date_arr[delta_max_indexes[i]].strftime('%Y-%m-%d')+'~~'+date_arr[delta_max_indexes[i]+1].strftime('%Y-%m-%d'))

outputs:

1380-08-31~~2001-10-02 
1

发布于3 年前
橘子老君
level4
展开所有评论
发表评论
1

发布于3 年前
慕容玖
level4
展开所有评论
发表评论