Soluție R pentru puzzle-uri Excel

URMĂREȘTE-NE
16,065FaniÎmi place
1,142CititoriConectați-vă

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.

Dominic Botezariu
Dominic Botezariuhttps://www.noobz.ro/
Creator de site și redactor-șef.

Cele mai noi știri

Pe același subiect

LĂSAȚI UN MESAJ

Vă rugăm să introduceți comentariul dvs.!
Introduceți aici numele dvs.