Day 2

AdventOfCode > 2024

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())
}

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