Table of Contents
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