Aller au contenu

Samedi 17 octobre 2026 Mis à jour à 22 h 03

Lire sans pub

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

Par Sara 3 min de lecture France

Garder Discussion

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

Cet article vous a-t-il aidé à comprendre ?

Connectez-vous pour donner votre avis : il aide la rédaction à savoir ce qui reste à expliquer.

Abonnement One Media

Lisez One Media sans publicité

Formule

Aucune publicité sur votre compte, votre carte de lecteur numérotée à votre nom, résiliable à tout moment.

Toutes les formules, dont l’annuel avec 2 mois offerts

Discussion

Soyez le premier à réagir. Un compte gratuit suffit ; le premier message est relu avant publication.

Se connecter Créer un compte

À lire ensuite

Toute la rubrique Tech

Explorer

Chargement des rubriques…

Votre compte

Créez un compte gratuit pour garder des articles, suivre des rubriques, retrouver votre historique et participer aux débats.

Se connecter Créer un compte