Advent of Code 2021
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
It’s that time of year again. And not just for Secret Santa—it’s time for the Advent of Code, a series of programming puzzles in the lead-up to Christmas.
I’m doing the 2021 challenge in R—in the form of an open-source R package, to demonstrate a test-driven workflow.
Each puzzle description typically comes with a few simple examples of inputs and outputs. We can use these to define expectations for unit tests with the testthat package. Once a function passes the unit tests, it should be ready to try with the main puzzle input.
Check my adventofcode2021 repository on GitHub for the latest.
remotes::install_github('Selbosh/adventofcode2021')
Day 1 – Sonar Sweep
Increases
To count the number of times elements are increasing in a vector it’s as simple as
depths <- c(199, 200, 208, 210, 200, 207, 240, 269, 260, 263) sum(diff(depths) > 0) ## [1] 7
for which I defined a function called increases
.
Rolling sum
For part two, we first want to calculate the three-depth moving sum, then we count the increases as in part one.
There are plenty of solutions in external R packages for getting lagged (and leading) vectors, for instance dplyr::lag()
and dplyr::lead()
:
depths + dplyr::lead(depths) + dplyr::lead(depths, 2) ## [1] 607 618 618 617 647 716 769 792 NA NA
Or you could even calculate the rolling sum using a pre-made solution in zoo (Z’s Ordered Observations, a time-series analysis package).
zoo::rollsum(depths, 3) ## [1] 607 618 618 617 647 716 769 792
To avoid loading any external packages at this stage, I defined my own base R function called rolling_sum()
, which uses tail
and head
with negative lengths to omit the first and last elements of the vector:
head(depths, -2) + head(tail(depths, -1), -1) + tail(depths, -2) ## [1] 607 618 618 617 647 716 769 792
As David Schoch points out, you can just use the lag
argument of diff
to make this entire puzzle into a one-liner:
sapply(c(1, 3), \(lag) sum(diff(depths, lag) > 0)) ## [1] 7 5
R-bloggers.com offers daily e-mail updates about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.