Vous souhaitez partager votre contenu sur R-bloggers ? cliquez ici si vous avez un blog, ou ici si vous n’en avez pas.
Il est rare qu’une date puisse être un palindrome. Mais ça arrive.
Et l’idée est la suivante, couvrir tous les différents formats de date et pour la période donnée
IsPalindromeDateRange <- function(date = Sys.Date(),
end_date = NULL,
formats = "all",
verbose = TRUE) {
## Helper stuff
is_palindrome <- function(x) {
chars <- strsplit(x, "")[[1]]
identical(chars, rev(chars))
}
reverse_string <- function(x) {
paste(rev(strsplit(x, "")[[1]]), collapse = "")
}
date_to_digits <- function(date, format = "%Y%m%d") {
format(date, format)
}
date_formats <- list(
YYYYMMDD = list(
name = "YYYYMMDD",
format = "%Y%m%d",
example = "20251202",
regions = "International/ISO standard"
),
MMDDYYYY = list(
name = "MMDDYYYY",
format = "%m%d%Y",
example = "12022025",
regions = "United States"
),
DDMMYYYY = list(
name = "DDMMYYYY",
format = "%d%m%Y",
example = "02122025",
regions = "Europe"
),
YYMMDD = list(
name = "YYMMDD",
format = "%y%m%d",
example = "251202",
regions = ""
),
DDMMYY = list(
name = "DDMMYY",
format = "%d%m%y",
example = "021225",
regions = ""
),
MMDDYY = list(
name = "MMDDYY",
format = "%m%d%y",
example = "120225",
regions = "United states - short"
)
)
date <- as.Date(date)
if (identical(formats, "all")) {
check_formats <- names(date_formats)
} else {
check_formats <- formats
invalid <- setdiff(formats, names(date_formats))
if (length(invalid) > 0) {
warning("Unknown formats ignored: ", paste(invalid, collapse = ", "))
check_formats <- intersect(formats, names(date_formats))
}
}
if (!is.null(end_date)) {
end_date <- as.Date(end_date)
# Hearlthy checker start < end
if (date > end_date) {
temp <- date
date <- end_date
end_date <- temp
}
total_days <- as.integer(end_date - date) + 1
if (verbose) {
cat("From:", format(date, "%Y-%m-%d"))
cat("To: ", format(end_date, "%Y-%m-%d"))
cat("(", total_days, " days)", sep = "")
cat("\n")
cat(" Formats: ", paste(check_formats, collapse = ", "), "\n\n", sep = "")
}
# Emopyt data frame
results <- data.frame(
date = as.Date(character()),
day_of_week = character(),
format = character(),
digits = character(),
stringsAsFactors = FALSE
)
check_date <- date
checked <- 0
while (check_date <= end_date) {
for (fmt in check_formats) {
digits <- date_to_digits(check_date, date_formats[[fmt]]$format)
if (is_palindrome(digits)) {
results <- rbind(results, data.frame(
date = check_date,
day_of_week = format(check_date, "%A"),
format = fmt,
digits = digits,
stringsAsFactors = FALSE
))
}
}
check_date <- check_date + 1
checked <- checked + 1
}
# Results
if (verbose) {
if (nrow(results) == 0) {
cat("No date palindrome found in this range.\n\n")
} else {
# Get uniques per date format
unique_dates <- unique(results$date)
cat(sprintf("Found %d palindrome occurrence%s (%d unique date%s):\n\n",
nrow(results),
if (nrow(results) > 1) "s" else "",
length(unique_dates),
if (length(unique_dates) > 1) "s" else ""))
cat(strrep("─", 60), "\n")
cat(sprintf(" %-12s %-10s %-12s %s\n","Date", "Day", "Format", "Digits"))
cat(strrep("─", 60), "\n")
display_results <- results
for (i in seq_len(nrow(display_results))) {
row <- display_results[i, ]
cat(sprintf(" %-12s %-10s %-12s %s ↔ %s\n",
format(row$date, "%Y-%m-%d"),
substr(row$day_of_week, 1, 10),
row$format,
row$digits,
reverse_string(row$digits)))
}
cat(strrep("─", 60), "\n\n")
if (length(check_formats) > 1) {
#funky stuff
cat("Summary by format:\n")
format_counts <- table(results$format)
for (fmt in names(format_counts)) {
cat(sprintf("%s: %d palindrome%s\n", fmt, format_counts[fmt],
if (format_counts[fmt] > 1) "s" else ""))
}
cat("\n")
}
}
}
}
# Sanity Check
results <- sapply(check_formats, function(fmt) {
digits <- date_to_digits(date, date_formats[[fmt]]$format)
is_palindrome(digits)
})
if (verbose) {
any_palindrome <- FALSE
for (fmt in check_formats) {
digits <- date_to_digits(date, date_formats[[fmt]]$format)
is_pal <- results[fmt]
status <- if (is_pal) "PALINDROME!" else "Not a palindrome"
if (is_pal) any_palindrome <- TRUE
cat(sprintf(" %s %-15s : %s %s\n",
date_formats[[fmt]]$name,
digits,
if (is_pal) "<>" else " ",
status))
}
cat("\n")
}
}
Et pour faire une extraction inutile des dates du palindrome, nous avons extrait toutes les dates de l’année 1100 à 2100.

Et vous pouvez dire que la plupart des dates palindromes se sont produites entre 1100 et 1200 et ces dernières années, si vous regardez les formats de date EU ou ISO (JJMMAAA). Mais si vous regardez le AAMMJJ, le JJMMAA ou le MMJJAA, ceux-ci ont une fréquence stable par décennie et sont présents de manière égale dans toutes ces années. 

Comme toujours, le code complet est disponible sur GitHub dans le référentiel Useless_R_function. L’exemple de fichier dans ce référentiel se trouve ici (nom de fichier : Date_palindrome.R.R). Consultez le référentiel pour les futures mises à jour.
Bon R-coding et restez en bonne santé !
En rapport
PakarPBN
A Private Blog Network (PBN) is a collection of websites that are controlled by a single individual or organization and used primarily to build backlinks to a “money site” in order to influence its ranking in search engines such as Google. The core idea behind a PBN is based on the importance of backlinks in Google’s ranking algorithm. Since Google views backlinks as signals of authority and trust, some website owners attempt to artificially create these signals through a controlled network of sites.
In a typical PBN setup, the owner acquires expired or aged domains that already have existing authority, backlinks, and history. These domains are rebuilt with new content and hosted separately, often using different IP addresses, hosting providers, themes, and ownership details to make them appear unrelated. Within the content published on these sites, links are strategically placed that point to the main website the owner wants to rank higher. By doing this, the owner attempts to pass link equity (also known as “link juice”) from the PBN sites to the target website.
The purpose of a PBN is to give the impression that the target website is naturally earning links from multiple independent sources. If done effectively, this can temporarily improve keyword rankings, increase organic visibility, and drive more traffic from search results.