(Acest articol a fost publicat pentru prima dată pe R – TomazTsqlși cu amabilitate a contribuit la R-bloggeri). (Puteți raporta problema legată de conținutul acestei pagini aici)
Doriți să vă distribuiți conținutul pe R-bloggeri? dați clic aici dacă aveți un blog, sau aici dacă nu aveți.
Ei spun că numărul Pi conține toate posibilitățile infinite, toate cuvintele, toate combinațiile. Ei bine, mai ușor de spus. Deci, să punem asta la încercare.
Acesta este tabelul meu de translație.

Vom face acest lucru în următorii pași (pentru cuvântul „ouă”):
- Codificați cuvântul OUĂ în numere. E = 5, G = 7, G = 7 și S = 19. Împreună concatenate obținem șirul de 57719.
- Stocăm un șir foarte lung de număr PI.
- Începeți să căutați în numărul PI subșirul „57719”.
Ei bine, hai să creăm o funcție care să facă exact asta
library(Rmpfr)
encode_a1z26 <- function(s) {
s_clean <- gsub("(^A-Za-z)", "", toupper(s))
if (nchar(s_clean) == 0) stop("No letters found in input.")
letters_vec <- strsplit(s_clean, "", fixed = TRUE)((1))
nums <- match(letters_vec, LETTERS)
paste0(nums, collapse = "")
}
pi_fraction_digits <- function(n_digits) {
# bits of precison ~ n_digits * log2(10)
precBits <- ceiling(n_digits * log2(10)) + 32L
pi_mpfr <- Const("pi", precBits)
s <- formatMpfr(pi_mpfr, digits = n_digits + 2L, scientific = FALSE, base = 10L)
s <- gsub("\.", "", s, fixed = FALSE)
frac <- substr(s, 2L, n_digits + 1L)
if (nchar(frac) < n_digits) {
stop("To low precision; did not get requested number of digits")
}
frac
}
find_in_pi <- function(pattern, n_digits) {
if (!grepl("^(0-9)+$", pattern)) stop("Pattern must be digits!")
t0 <- proc.time()(("elapsed"))
frac <- pi_fraction_digits(n_digits)
loc <- regexpr(pattern, frac, fixed = TRUE)
elapsed <- proc.time()(("elapsed")) - t0
#getting the positions
if (loc(1) != -1) {
start_pos <- as.integer(loc(1))
end_pos <- start_pos + nchar(pattern) - 1L
list(found = TRUE,
start = start_pos,
end = end_pos,
digits_scanned = n_digits,
seconds = elapsed)
} else {
list(found = FALSE,
start = NA_integer_,
end = NA_integer_,
digits_scanned = n_digits,
seconds = elapsed)
}
}
find_phrase_in_pi <- function(phrase, n_digits) {
pat <- encode_a1z26(phrase)
res <- find_in_pi(pat, n_digits)
res$pattern <- pat
res$phrase <- phrase
res
}
și, în sfârșit, pentru a rula funcția (funcțiile):
## Run functions
word <- "eggs"
encoded_word <- encode_a1z26(word)
cat("Encoded ",word," ->", encoded_word, "n")
result_today <- find_in_pi(encoded_word, 1e5)
print(result_today)
Și vezi că cuvântul „OUĂ” ca număr 57719, apare pe numărul Pi pe poziția 6026 până la 6030. Destul de inutil 

Verificați depozitul pentru actualizări viitoare!
Rămâi sănătos și fericit cu codificarea R!
