Soluție R pentru puzzle-uri Excel

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

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.

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.