(Acest articol a fost publicat pentru prima dată pe Blogși cu amabilitate a contribuit la R-bloggeri). (Puteți raporta problema legată de conținutul acestei pagini aici)
Doriți să vă distribuiți conținutul pe R-bloggeri? dați clic aici dacă aveți un blog, sau aici dacă nu aveți.
Decembrie fericit, prieteni R!
Una dintre tradițiile mele preferate în comunitatea R este Advent of Code, o serie de puzzle-uri lansate la miezul nopții EST de la 1 până la 25 decembrie, care urmează să fie rezolvate prin programare în limba pe care o alegeți. De obicei, fac câteva dintre ele în fiecare an și am încercat odată să le fac pe fiecare în momentul în care a apărut!
Anul acesta, știu că nu o voi putea face zilnic, dar voi face cât de multe pot folosind doar data.table
solutii.
Îmi voi permite să folosesc alte pachete când nu există data.table
echivalent, dar soluțiile mele trebuie să fie ca data.table
-y posibil.
Voi abuza de structura postării blogului și voi actualiza acest fișier pe parcursul săptămânii.
1 decembrie
Prima parte
d1 <- fread("day1_dat1.txt")
d1(, V1 := sort(V1)) d1(, V2 := sort(V2)) d1(, diff := abs(V1-V2)) sum(d1$diff)
Partea a doua
d1(, similarity := sum(V1 == d1$V2)*V1, by = V1) sum(d1$similarity)
2 decembrie
Prima parte
d1 <- fread("day2_dat1.txt", fill = TRUE)
check_report <- function(vec) { vec <- na.omit(vec) has_neg <- vec < 0 has_pos <- vec > 0 inc_dec <- sum(has_neg) == length(vec) | sum(has_pos) == length(vec) too_big <- max(abs(vec)) > 3 return(inc_dec & !too_big) }
d1t <- transpose(d1) deltas <- d1t(-nrow(d1t)) - d1t(2:nrow(d1t)) res <- apply(deltas, 2, "check_report") sum(res)
Partea a doua
test_reports <- function(dat) { deltas <- dat(-nrow(dat)) - dat(2:nrow(dat)) res <- apply(deltas, 2, "check_report") res }
res <- test_reports(d1t) for (i in 1:nrow(d1t)) { res <- res | test_reports(d1t(-i,)) } sum(res)
Doar pentru distracție
Am găsit folosirea apply
profund nesatisfăcător, deși a fost rapid, așa că doar pentru distracție:
d1t <- transpose(d1) deltas <- d1t(-nrow(d1t)) - d1t(2:nrow(d1t)) is_not_pos <- deltas <= 0 is_not_neg <- deltas >= 0 is_big <- abs(deltas) > 3 res_inc <- colSums(is_not_neg | is_big, na.rm = TRUE) res_dec <- colSums(is_not_pos | is_big, na.rm = TRUE) sum(res_inc == 0) + sum(res_dec == 0)
Yay. 🙂