Puzzle-uri nr. 564–568
Puzzle-uri
Autor: ExcelBI
Toate fișierele (xlsx cu puzzle și R cu soluție) pentru fiecare puzzle sunt disponibile pe Github-ul meu. Bucurați-vă.
Puzzle #564
Te-ai gândit vreodată să sortezi doar o parte din datele date, nici măcar să schimbi poziția în care se află acele date… Ca și dirijorul arătând o parte a orchestrei pentru a schimba felul în care cântă fără a le schimba pe celelalte. Deci avem așa ceva astăzi. Avem nevoie de o secvență de caractere și numere și singurul lucru pe care trebuie să-l facem este să sortăm numerele descendent, lăsând litere pe poziția lor și apoi să plasăm numerele înapoi în poziția inițială, dar sortate.
Se încarcă biblioteci și date
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")
Transformare
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)
Validare
all.equal(input, test) #> (1) TRUE
Puzzle #565
Zeul roman Janus avea două fețe care priveau în două direcții opuse, așa că cred că poate fi o ilustrare frumoasă a numerelor inversate. Pentru că o facem din nou, inversând, manipulând numere etc. Astăzi trebuie să găsim 50 de numere pentru care ambele rădăcini pătrate ale numărului și inversul sunt numere pare și sunt pătrate perfecte. Așa că trebuie să facem niște condiții pentru a verifica. Hai să o facem.
Se încarcă biblioteci și date
library(tidyverse) library(readxl) path = "Excel/565 Even Number and Reversal Perfect Square.xlsx" test = read_excel(path, range = "A1:A51")
Transformare
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)
Validare
all.equal(result$original, test$`Expected Answer`) # (1) TRUE
Puzzle #566
De data aceasta se pare că primim niște fructe în 3 cutii diferite. Și trebuie să aflăm în ce cutie erau ce cantitate din ce fruct. Multe cuvinte „Wh” într-o singură propoziție, corect. Acum faceți câteva pivotări pentru a afla soluția.
Se încarcă biblioteci și date
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")
Transformare
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`)
Validare
all.equal(result, test, check.attributes = FALSE) # (1) TRUE
Puzzle #567
Știți că îmi place desenul ASCII. Așa că am fost bucuros să reutilizam o parte din codul anterior. Îți amintești triunghiul pe care l-am făcut acum câteva săptămâni? L-am modificat putin si l-am folosit aici. Lăsați matricea să populeze acum…
Se încarcă biblioteci și date
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()
Transformare
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)
Validare
all.equal(M, test, check.attributes = F) # TRUE
Puzzle #568
Să ne gândim la alfabet puțin altfel astăzi. Probabil că îl tratați ca pe un set de personaje, ele sunt doar reunite. Dar dacă ar trebui să tratăm alfabetul ca o secvență, ca pe un lanț? Ce se întâmplă dacă locul în această structură ordonată este una dintre cele mai importante proprietăți ale literei? Astăzi avem un puzzle care ne obligă să completăm spațiul dintre literele din cuvânt cu toate secvența care intervine. Secvența poate fi citită de la stânga la dreapta sau de la dreapta la stânga, în funcție de locul literei în ordine. Am nevoie de puține manevre, dar este destul de ușor în același timp.
Se încarcă biblioteci și date
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")
Transformare
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)
Validare
all.equal(result$`Answer Expected`, test$`Answer Expected`, check.attributes = FALSE) #> (1) TRUE
Simțiți-vă liber să comentați, să distribuiți și să mă contactați cu sfaturi, întrebări și ideile dvs. despre cum să îmbunătățiți orice. Contactați-mă și pe Linkedin dacă doriți.
Pe depozitul meu Github există și soluții pentru aceleași puzzle-uri în Python. Verifică!
Soluția R pentru puzzle-uri Excel a fost publicată inițial în Numbers around us on Medium, unde oamenii continuă conversația subliniind și răspunzând la această poveste.