suppressPackageStartupMessages({
library(tidyverse)
library(httr2)
})
adventofcode_input <- \(year, day) {
session <- Sys.getenv("ADVENT_SESSION")
if (session == "") {
stop("Must set ADVENT_SESSION in .Renviron")
}
url <- paste0("https://adventofcode.com/", year, "/day/", day, "/input")
tryCatch({
res <- request(url) |>
req_cookies_set(session = session) |>
req_perform() |>
resp_body_string(encoding = "UTF-8")
},
error = \(e) stop("Error getting the input file")
)
data.frame(x = res |> strsplit("\n") |> unlist())
}Day 2
AdventOfCode > 2024
Part 1
is_safe <- \(x){
diffs <- diff(x, lag = 1, differences = 1)
all(-diffs %in% 1:3) || all(diffs %in% 1:3)
}
tribble(
~x,
"7 6 4 2 1",
"1 2 7 8 9",
"9 7 6 2 1",
"1 3 2 4 5",
"8 6 4 4 1",
"1 3 6 7 9"
) |>
pull(x) |>
str_split(" ") |>
map(as.numeric) |>
map_lgl(is_safe) |>
print()[1] TRUE FALSE FALSE FALSE FALSE TRUE
input <- adventofcode_input(2024, 2)
input |>
pull(x) |>
str_split(" ") |>
map(as.numeric) |>
map_lgl(is_safe) |>
sum() |>
print()[1] 490
Part 2
is_safe <- \(x){
diffs <- diff(x, lag = 1, differences = 1)
all(-diffs %in% 1:3) || all(diffs %in% 1:3)
}
is_safe_safe <- \(x) {
result <- is_safe(x)
if(!result) {
indices <- seq_along(x)
all_results <- map_lgl(indices, \(to_remove) {
is_safe(x[-to_remove])
})
result <- any(all_results)
}
return(result)
}
# report <- c(1,3,2,4,5)
# is_safe_safe(report)tribble(
~x,
"7 6 4 2 1",
"1 2 7 8 9",
"9 7 6 2 1",
"1 3 2 4 5",
"8 6 4 4 1",
"1 3 6 7 9"
) |>
pull(x) |>
str_split(" ") |>
map(as.numeric) |>
map_lgl(is_safe_safe) |>
print()[1] TRUE FALSE FALSE TRUE TRUE TRUE
input <- adventofcode_input(2024, 2)
input |>
pull(x) |>
str_split(" ") |>
map(as.numeric) |>
map_lgl(is_safe_safe) |>
sum() |>
print()[1] 536