计算从公元1年到现在的回文日期的数量:
所谓回文日期,就是日期数字正反完全相同,例如2020年2月2日。
library(lubridate)
library(stringr)
library(tidyverse)
首先我们设定“公元0001年1月1日”和“5001年1月1日”:
start_date <- ymd("0001/01/01")
end_date <- ymd("5001/01/01")
创建一个tibble,Date列包含所有日期
data <- tibble(Date = seq(start_date, end_date, by = 1))
head(data)
Date |
---|
0001-01-01 |
0001-01-02 |
0001-01-03 |
0001-01-04 |
0001-01-05 |
0001-01-06 |
data <- data %>%
mutate(number = as.character(Date),
# 删除开头的0
number = gsub("^0*", "", number),
number = gsub("-", "", number),
number = str_split(number, ""))
head(data)
Date | number |
---|---|
0001-01-01 | 1, 0, 1, 0, 1 |
0001-01-02 | 1, 0, 1, 0, 2 |
0001-01-03 | 1, 0, 1, 0, 3 |
0001-01-04 | 1, 0, 1, 0, 4 |
0001-01-05 | 1, 0, 1, 0, 5 |
0001-01-06 | 1, 0, 1, 0, 6 |
正反所有字符应该都一样:
flag <- map(data$number,
function(x) {all(x == rev(x))} )
flag <- unlist(flag)
# 然后切片就成了
result <- data %>%
filter(flag)
result <- result %>%
mutate(r = 1:nrow(result)) %>%
select(r, Date)
head(result)
r | Date |
---|---|
1 | 0001-01-01 |
2 | 0001-02-01 |
3 | 0001-03-01 |
4 | 0001-04-01 |
5 | 0001-05-01 |
6 | 0001-06-01 |
x轴是年份,r是累计有多少回文日期。
2021年12月2日是公元以来第513个。
ggplot(result) +
geom_line(aes(x = Date, y = r), color = "#257eaa", size = 1.5, alpha = .8) +
annotate(geom = "point", x = ymd("20211202"), y = 513, colour = "#ff0d00", size = 3, alpha = .5) +
annotate("segment", x = ymd("20211202"), xend = ymd("20211202"), y = 0, yend = 513,
colour = "#257eaa", alpha=0.6, linetype = 2) +
theme_minimal()