Mici funcții R inutile-utile – Găsirea subșirurilor în numărul Pi

URMĂREȘTE-NE
16,065FaniÎmi place
1,142CititoriConectați-vă

(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ă”):

  1. Codificați cuvântul OUĂ în numere. E = 5, G = 7, G = 7 și S = 19. Împreună concatenate obținem șirul de 57719.
  2. Stocăm un șir foarte lung de număr PI.
  3. Î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!

Dominic Botezariu
Dominic Botezariuhttps://www.noobz.ro/
Creator de site și redactor-șef.

Cele mai noi știri

Pe același subiect

LĂSAȚI UN MESAJ

Vă rugăm să introduceți comentariul dvs.!
Introduceți aici numele dvs.