Skip to main content

How Many More Palindrome Dates Will You See?

r
riddler
Author

Benjamin Soltoff

Published

February 8, 2020

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 dates
  date = seq(from = mdy("02/03/2020"), to = mdy("12/31/2100"), by = "1 day"),
  # convert to character string
  date_char = date %>%
    format('%m-%d-%Y') %>%
    as.character() %>%
    # remove hyphens
    str_remove_all(pattern = "-"),
  # reverse the string and compare to original
  date_rev = stringi::stri_reverse(date_char),
  palindrome = date_char == date_rev
) %>%
  # which dates are palindromes
  filter(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 dates
  date = seq(from = mdy("02/03/2020"), to = mdy("12/31/2100"), by = "1 day"),
  # convert to character string
  date_char = date %>%
    format('%d-%m-%Y') %>%
    as.character() %>%
    # remove hyphens
    str_remove_all(pattern = "-"),
  # reverse the string and compare to original
  date_rev = stringi::stri_reverse(date_char),
  palindrome = date_char == date_rev
) %>%
  # which dates are palindromes
  filter(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.

──────────────────────────────────────────────────────────────────────────────