Puzzle-uri nr. 569–573

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 #569




Astăzi avem câteva șiruri aleatorii pe care trebuie să le procesăm într-un anumit fel. Trebuie să numărăm fiecare literă care nu are pereche. Acesta este drumul meu pentru a spune asta. Oficial, mai întâi trebuie să numărăm toate literele neobișnuite, apoi din comun trebuie să calculăm diferența absolută dintre șiruri. Apoi sortați alfabetic și dați în ordine litere-număr-litere-număr și așa mai departe. Verifică.
Se încarcă biblioteci și date
library(tidyverse) library(readxl) path = "Excel/569 Diff of Common Counts.xlsx" input = read_excel(path, range = "A1:B10") %>% replace_na(list(String1 = "", String2 = "")) test = read_excel(path, range = "C1:C10")
Transformare
process_strings = function(str1, str2) {
count_letters = function(str) {
lets = str_split(str_to_lower(str), "")((1))
df = letters %>%
tibble(letter = .) %>%
mutate(count = map_int(letter, ~ sum(.x == lets)))
}
s1 = count_letters(str1)
s2 = count_letters(str2)
s = s1 %>%
left_join(s2, by = "letter") %>%
mutate(diff = abs(count.x - count.y)) %>%
filter(diff != 0) %>%
select(letter, diff) %>%
unite("letter_diff", letter, diff, sep = "") %>%
pull() %>%
paste0(collapse = "")
return(s)
}
result = input %>%
mutate(`Answer Expected` = map2_chr(String1, String2, process_strings))


Validare
all.equal(result$`Answer Expected`, test$`Answer Expected`) #> (1) TRUE
Puzzle #570




Astăzi din nou ne jucăm cu cuvintele. Imaginați-vă că este un dans de grup cu parteneri care se schimbă sau poate un meci de fotbal când arbitrul anunță că jucătorii se schimbă. Dar de data aceasta nu merg pe bancă, ci doar schimbă pozițiile. Și a doua coloană a tabelului nostru de probleme este exact lista acestor modificări. Fiecare pereche consecutivă spune „Jucătorul X îl înlocuiește pe Y și invers”. Așa că află ce șir avem după toate instrucțiunile.
Se încarcă biblioteci și date
library(tidyverse) library(readxl) path = "Excel/570 Position Swapping.xlsx" input = read_excel(path, range = "A1:B10") test = read_excel(path, range = "C1:C10")
Transformare
swap_string = function(string, numbers) {
numbers = as.numeric(str_split(numbers, ",\s*")((1)))
str_vec = str_split(string, "", simplify = TRUE)
for (i in seq(1, length(numbers), by = 2)) {
str_vec(c(numbers(i), numbers(i + 1))) = str_vec(c(numbers(i + 1), numbers(i)))
}
str_c(str_vec, collapse = "")
}
result = input %>%
mutate(Swapped = map2_chr(String, Numbers, swap_string))


Validare
all.equal(result$Swapped, test$`Answer Expected`) # (1) TRUE
Puzzle #571




De data aceasta ne jucăm cu numerele. Trebuie să găsim primele 500 de numere care, atunci când sunt înmulțite cu propriul revers, mai au doar acele cifre ca în original. Este un algoritm destul de lent, dar nu și extrem. Trebuie să verificăm fiecare număr și să găsim o listă de cifre unice în numere înmulțite și originale și să aflăm dacă există vreo diferență între ele.
Se încarcă biblioteci și date
library(tidyverse) library(readxl) path = "Excel/571 Product of Number and its revese.xlsx" test = read_excel(path) %>% unlist() %>% as.integer()
Transformare
check_number = function(num) {
get_digits = function(n) {
digits = integer()
while (n > 0) {
digits = c(digits, n %% 10)
n = n %/% 10
}
return(sort(unique(digits)))
}
dig_num = get_digits(num)
rev_num = as.numeric(paste(rev(as.integer(strsplit(as.character(num), "")((1)))), collapse = ""))
prod_num = num * rev_num
dig_prod = get_digits(prod_num)
return(identical(dig_num, dig_prod))
}
find_numbers = function(limit) {
results = integer(limit)
count = 0
num = 10
while (count < limit) {
if (check_number(num)) {
count = count + 1
results(count) = num
}
num = num + 1
}
return(results)
}
result = find_numbers(500)


Validare
all.equal(result, test) # (1) TRUE
Puzzle #572




Îmi place să pivotez și sunt sigur că îți place. Deci de ce răspuns avem nevoie astăzi? Trebuie să verificăm de câte ori au fost atinse anumite valori pe săptămână. Deci, să spunem: în prima săptămână a existat o zi în care au fost realizate 4 unități. Poate că nu este un pic real, dar trebuie să o transformăm, să nu ne gândim la asta. Cel puțin dacă rezolvăm doar provocări. 😀
Se încarcă biblioteci și date
library(tidyverse) library(readxl) library(lubridate) path = "Excel/572 Pivot Problem.xlsx" input = read_excel(path, range = "A1:B14") test = read_excel(path, range = "D2:I7")
Transformare
result = input %>%
mutate(Date = as.Date(Date),
Week = ceiling((day(Date) - 1) %/% 7 + 1)) %>%
pivot_wider(names_from = Value, values_from = Date, values_fn = length, values_fill = 0) %>%
select(Week, `1`,`2`,`3`,`4`,`5`)


Validare
all.equal(result, test) #> (1) TRUE
Puzzle #573




De obicei, acele puzzle-uri pe care le avem în weekend în PQ Challenges, dar de ce să nu le facem astăzi. Trebuie să verificăm cât timp fiecare persoană a stat în tura. Din păcate, masa nu este cu adevărat „ordonată”, ceea ce ne place cel mai mult, dar le putem face foarte repede ordonate. Apoi trebuie să îmbinăm orele și datele și să procesăm calculele pentru fiecare persoană. Să aflăm cum o putem face.
Se încarcă biblioteci și date
library(tidyverse) library(readxl) library(hms) library(janitor) library(lubridate) path = "Excel/573 Durations.xlsx" input = read_excel(path, range = "A2:B14") test = read_excel(path, range = "D2:E6")
Transformare
result = input %>%
mutate(name = ifelse(str_detect(`Name & Date`, "(a-zA-Z)"), `Name & Date`, NA)) %>%
fill(name) %>%
filter(!is.na(Time)) %>%
mutate(date = excel_numeric_to_date(as.numeric(`Name & Date`)) %>% as.character(),
time = as_hms(Time) %>% as.character()) %>%
unite("datetime", c("date", "time"), sep = " ") %>%
mutate(datetime = ymd_hms(datetime)) %>%
select(name, datetime) %>%
mutate(rn = row_number(), .by = name) %>%
pivot_wider(names_from = rn, values_from = datetime) %>%
mutate(duration = as.numeric(`2` - `1`)) %>%
select(Name = name, Duration = duration)


Validare
all.equal(result, test, 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.
