I’m currently on paternity leave and in search of quick but interesting programming challenges to stay fresh. The latest Riddler Express provided a quick refresher on string manipulation.
If we write out dates in the American format of MM/DD/YYYY (i.e., the two digits of the month, followed by the two digits of the day, followed by the four digits of the year), how many more palindromic dates will there be this century?
The trick is to create a sequence of all remaining dates in the century, store them as character strings in MM/DD/YYYY format, then reverse each string. If the string is equal to its reverse, it’s a palindrome.
library(tidyverse)library(lubridate)library(knitr)palindrome_usa <-tibble(# generate sequence of datesdate =seq(from =mdy("02/03/2020"), to =mdy("12/31/2100"), by ="1 day"),# convert to character stringdate_char = date %>%format('%m-%d-%Y') %>%as.character() %>%# remove hyphensstr_remove_all(pattern ="-"),# reverse the string and compare to originaldate_rev = stringi::stri_reverse(date_char),palindrome = date_char == date_rev) %>%# which dates are palindromesfilter(palindrome)kable(palindrome_usa)
date
date_char
date_rev
palindrome
2021-12-02
12022021
12022021
TRUE
2030-03-02
03022030
03022030
TRUE
2040-04-02
04022040
04022040
TRUE
2050-05-02
05022050
05022050
TRUE
2060-06-02
06022060
06022060
TRUE
2070-07-02
07022070
07022070
TRUE
2080-08-02
08022080
08022080
TRUE
2090-09-02
09022090
09022090
TRUE
Only 8 palindrome dates remaining. Out of curiosity, do any exist using the European DD/MM/YYYY format?
palindrome_eur <-tibble(# generate sequence of datesdate =seq(from =mdy("02/03/2020"), to =mdy("12/31/2100"), by ="1 day"),# convert to character stringdate_char = date %>%format('%d-%m-%Y') %>%as.character() %>%# remove hyphensstr_remove_all(pattern ="-"),# reverse the string and compare to originaldate_rev = stringi::stri_reverse(date_char),palindrome = date_char == date_rev) %>%# which dates are palindromesfilter(palindrome)kable(palindrome_eur)
date
date_char
date_rev
palindrome
2021-02-12
12022021
12022021
TRUE
2022-02-22
22022022
22022022
TRUE
2030-02-03
03022030
03022030
TRUE
2031-02-13
13022031
13022031
TRUE
2032-02-23
23022032
23022032
TRUE
2040-02-04
04022040
04022040
TRUE
2041-02-14
14022041
14022041
TRUE
2042-02-24
24022042
24022042
TRUE
2050-02-05
05022050
05022050
TRUE
2051-02-15
15022051
15022051
TRUE
2052-02-25
25022052
25022052
TRUE
2060-02-06
06022060
06022060
TRUE
2061-02-16
16022061
16022061
TRUE
2062-02-26
26022062
26022062
TRUE
2070-02-07
07022070
07022070
TRUE
2071-02-17
17022071
17022071
TRUE
2072-02-27
27022072
27022072
TRUE
2080-02-08
08022080
08022080
TRUE
2081-02-18
18022081
18022081
TRUE
2082-02-28
28022082
28022082
TRUE
2090-02-09
09022090
09022090
TRUE
2091-02-19
19022091
19022091
TRUE
2092-02-29
29022092
29022092
TRUE
A lot more thanks to the reversed positioning of the month and date.
Is there any overlap between the two? That is, like 02/02/2020 and 02/02/2020, are there any palindromic dates under both formats?
semi_join(palindrome_usa, palindrome_eur, by ="date")
# A tibble: 0 × 4
# ℹ 4 variables: date <date>, date_char <chr>, date_rev <chr>, palindrome <lgl>
Nope.
Session Info
─ Session info ───────────────────────────────────────────────────────────────
setting value
version R version 4.6.1 (2026-06-24)
os macOS Tahoe 26.6.1
system aarch64, darwin23
ui X11
language (EN)
collate en_US.UTF-8
ctype en_US.UTF-8
tz America/New_York
date 2026-08-12
pandoc 3.4 @ /usr/local/bin/ (via rmarkdown)
quarto 1.10.18 @ /usr/local/bin/quarto
─ Packages ───────────────────────────────────────────────────────────────────
! package * version date (UTC) lib source
P cli 3.6.6 2026-04-09 [?] RSPM
P codetools 0.2-20 2024-03-31 [?] CRAN (R 4.6.1)
P digest 0.6.39 2025-11-19 [?] RSPM
P dplyr * 1.2.1 2026-04-03 [?] RSPM
P evaluate 1.0.5 2025-08-27 [?] RSPM
P farver 2.1.2 2024-05-13 [?] RSPM
P fastmap 1.2.0 2024-05-15 [?] RSPM
P forcats * 1.0.1 2025-09-25 [?] RSPM
P generics 0.1.4 2025-05-09 [?] RSPM
P ggplot2 * 4.0.3 2026-04-22 [?] RSPM
P glue 1.8.1 2026-04-17 [?] RSPM
P gtable 0.3.6 2024-10-25 [?] RSPM
P hms 1.1.4 2025-10-17 [?] RSPM
P htmltools 0.5.9 2025-12-04 [?] RSPM
P jsonlite 2.0.0 2025-03-27 [?] RSPM
P knitr * 1.51 2025-12-20 [?] RSPM
P lifecycle 1.0.5 2026-01-08 [?] RSPM
P lubridate * 1.9.5 2026-02-04 [?] RSPM
P magrittr 2.0.5 2026-04-04 [?] RSPM
P otel 0.2.0 2025-08-29 [?] RSPM
P pillar 1.11.1 2025-09-17 [?] RSPM
P pkgconfig 2.0.3 2019-09-22 [?] RSPM
P purrr * 1.2.2 2026-04-10 [?] RSPM
P R6 2.6.1 2025-02-15 [?] RSPM
P ragg 1.5.2 2026-03-23 [?] RSPM
P RColorBrewer 1.1-3 2022-04-03 [?] RSPM
P readr * 2.2.0 2026-02-19 [?] RSPM
renv 1.2.4 2026-08-03 [1] RSPM (R 4.6.0)
P rlang 1.3.0 2026-07-05 [?] RSPM
P rmarkdown 2.31 2026-03-26 [?] RSPM
P S7 0.2.2 2026-04-22 [?] RSPM
P scales 1.4.0 2025-04-24 [?] RSPM
P sessioninfo 1.2.4 2026-06-04 [?] RSPM
P stringi 1.8.9 2026-08-04 [?] RSPM
P stringr * 1.6.0 2025-11-04 [?] RSPM
P systemfonts 1.3.2 2026-03-05 [?] RSPM
P textshaping 1.0.5 2026-03-06 [?] RSPM
P tibble * 3.3.1 2026-01-11 [?] RSPM
P tidyr * 1.3.2 2025-12-19 [?] RSPM
P tidyselect 1.2.1 2024-03-11 [?] RSPM
P tidyverse * 2.0.0 2023-02-22 [?] RSPM
P timechange 0.4.0 2026-01-29 [?] RSPM
P tzdb 0.5.0 2025-03-15 [?] RSPM
P vctrs 0.7.3 2026-04-11 [?] RSPM
P withr 3.0.3 2026-06-19 [?] RSPM
P xfun 0.60 2026-07-09 [?] RSPM
P yaml 2.3.12 2025-12-10 [?] RSPM
[1] /Users/bcs88/Projects/personal-site/renv/library/macos/R-4.6/aarch64-apple-darwin23
[2] /Users/bcs88/Library/Caches/org.R-project.R/R/renv/sandbox/macos/R-4.6/aarch64-apple-darwin23/46003b10
* ── Packages attached to the search path.
P ── Loaded and on-disk path mismatch.
──────────────────────────────────────────────────────────────────────────────