Home Industrie et technologieInformatique et internetRésoudre des Énigmes Excel avec R : Guide Complet

Résoudre des Énigmes Excel avec R : Guide Complet

by Sara
France

Dans le monde de l’informatique, résoudre des énigmes Excel avec le langage R peut sembler complexe, mais avec les bonnes techniques, cela devient une tâche réalisable et même amusante. Cet article vous guidera à travers plusieurs énigmes intéressantes, en vous montrant comment utiliser R pour les résoudre efficacement.

Énigme #564

Avez-vous déjà pensé à trier seulement une partie des données sans changer leur position d’origine ? Imaginez un chef d’orchestre montrant une partie de l’orchestre pour changer leur façon de jouer sans affecter les autres. Dans cette énigme, nous devons trier des nombres tout en gardant les lettres à leur place. Voici comment procéder :

Chargement des bibliothèques et des données

library(tidyverse)
library(readxl)
path = "Excel/564 Sort Numbers only.xlsx"
input = read_excel(path, range = "A2:D11")
test = read_excel(path, range = "F2:I11")

Transformation

process_column = function(col) {
  letters = grep("[A-Za-z]", col)
  num_positions = grep("[0-9]", col)
  numbers = as.numeric(col[num_positions])
  numbers = sort(numbers)
  col[num_positions] = numbers
  return(col)
}
input = input %>% map_df(process_column)

Validation

all.equal(input, test) #> [1] TRUE

Énigme #565

La déesse romaine Janus avait deux visages regardant dans des directions opposées, ce qui illustre parfaitement les nombres inversés. L’objectif ici est de trouver 50 nombres dont les racines carrées et inversées sont des nombres pairs et des carrés parfaits. Voici le processus :

Chargement des bibliothèques et des données

library(tidyverse)
library(readxl)
path = "Excel/565 Even Number and Reversal Perfect Square.xlsx"
test = read_excel(path, range = "A1:A51")

Transformation

is_even = function(x) { x %% 2 == 0 }
is_perfect_square = function(x) { sqrt_x = sqrt(x); sqrt_x == floor(sqrt_x) }
reverse_number = function(x) { as.numeric(paste(rev(strsplit(as.character(x), NULL)[[1]]), collapse = "")) }
find_even_reverse_perfect_squares = function(n_required) {
  results = vector("list", n_required)
  count = 1
  n = 10
  while (count <= n_required) {
    square = n^2
    reverse_square = reverse_number(square)
    if (is_even(square) && is_even(reverse_square) && is_perfect_square(reverse_square)) {
      results[[count]] = list(original = square, reverse = reverse_square)
      count = count + 1
    }
    n = n + 1
  }
  return(results)
}
result = find_even_reverse_perfect_squares(50) %>% map_df(~ .x)

Validation

all.equal(result$original, test$`Expected Answer`) # [1] TRUE

Énigme #566

Dans cette énigme, nous avons des fruits dans trois boîtes différentes, et nous devons déterminer dans quelle boîte se trouve quelle quantité de chaque fruit. Voici comment résoudre ce problème :

Chargement des bibliothèques et des données

library(tidyverse)
library(readxl)
path = "Excel/566 Count in Columns.xlsx"
input = read_excel(path, range = "A2:C14")
test = read_excel(path, range = "E2:J6")

Transformation

result = input %>% 
  pivot_longer(everything(), names_to = "basket", values_to = "fruit") %>%
  summarise(Count = n(), .by = c(fruit, basket)) %>%
  na.omit() %>%
  pivot_wider(names_from = Count, values_from = basket, 
              values_fn = list(basket = ~ str_c(sort(.x), collapse = ", "))) %>%
  arrange(fruit) %>%
  select(Count = fruit, `1`, `2`, `3`, `4`, `5`)

Validation

all.equal(result, test, check.attributes = FALSE) # [1] TRUE

Énigme #567

Pour cette énigme, nous allons dessiner en ASCII. Nous allons créer une matrice pour dessiner une maison. Voici comment réaliser cela :

Chargement des bibliothèques et des données

library(tidyverse)
library(readxl)
path = "Excel/567 ASCII House.xlsx"
test = read_excel(path, range = "C2:Q18", col_names = F) %>% 
  replace(is.na(.), "") %>% as.matrix()

Transformation

M = matrix("", nrow = 17, ncol = 15)
for (i in 1:7) {
  M[i, (8 - i + 1):(8 + i - 1)] = "#"
}
M[17, ] = "#"
for (i in 8:16) {
  M[i, c(2, 14)] = "#"
}
M[16, -c(1, 15)] = "#"
M[9:11, c(4,6)] = "#"
M[c(9, 11), 5] = "#"
M[9:16, 9] = "#"
M[9, 10:11] = "#"
M[9:16, 12] = "#"
as.data.frame(M)

Validation

all.equal(M, test, check.attributes = F) # TRUE

Énigme #568

Enfin, réfléchissons à l’alphabet comme une chaîne. L’objectif est de compléter l’espace entre les lettres d’un mot avec toute la séquence qui se trouve entre elles. Voici comment procéder :

Chargement des bibliothèques et des données

library(tidyverse)
library(readxl)
path = "Excel/568 Fill in the Alphabets.xlsx"
input = read_excel(path, range = "A1:A10")
test = read_excel(path, range = "B1:B10")

Transformation

fill_words = function(string) {
  lets = strsplit(string, "")[[1]]
  pairs = map(1:(length(lets) - 1), ~paste(lets[.x:(.x + 1)], collapse = ""))
  df = tibble(
    first = map_chr(pairs, ~str_sub(.x, 1, 1)),
    second = "",
    third = map_chr(pairs, ~str_sub(.x, 2, 2))
  )
  df = df %>% 
    mutate(
      second = map2_chr(first, third, ~{
        first_num = as.numeric(charToRaw(.x))
        third_num = as.numeric(charToRaw(.y))
        letters = map_chr((first_num):(third_num), ~rawToChar(as.raw(.x)))
        paste(letters, collapse = "") %>% str_sub(2, -2)
      }),
      third = if_else(row_number() == n(), "", third)
    ) %>% 
    unite("word", c("first", "second", "third"), sep = "") %>% 
    pull(word) %>% 
    paste(collapse = "")
  return(df)
}
result = input %>% 
  mutate(`Answer Expected` = map_chr(Words, fill_words)) %>% 
  select(-Words)

Validation

all.equal(result$`Answer Expected`, test$`Answer Expected`, check.attributes = FALSE) #> [1] TRUE
Énigmes Excel | Excel | R | Programmation | Données | Énigmes | France

You may also like

Leave a Comment