Day 4

AdventOfCode > 2024

suppressPackageStartupMessages({
  library(tidyverse)
  library(httr2)
})
adventofcode_input <- \(
  year, day, what = c("data.frame", "character", "matrix"), input = NULL
) {
  if (is.null(input)) {
    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")
    )
  } else {
    res <- input
  }
  if(what[1] == "character") {
    return(res)
  }
  df <- data.frame(x = res |> strsplit("\n") |>  unlist())
  if(what[1] == "data.frame") {
    return(df)
  }    
  if(what[1] == "matrix") {
    ret <- df$x |> 
      stringr::str_split("")
    m <- do.call(rbind, ret)
    return(m)
  }   
}

Part 1

test <- "MMMSXXMASM
MSAMXMSMSA
AMXSXMAAMM
MSAMASMSMX
XMASAMXAMM
XXAMMXXAMA
SMSMSASXSS
SAXAMASAAA
MAMMMXMMMM
MXMXAXMASX"

find_xmax_samx <- \(m) {
  row_xmas <- sum(map_int(seq_len(nrow(m)), \(i) {
    sum(str_count(paste0(m[i,], collapse = ""), c("XMAS", "SAMX")))
  }))
  cols_xmas <- sum(map_int(seq_len(ncol(m)), \(i) {
    sum(str_count(paste0(m[,i], collapse = ""), c("XMAS", "SAMX")))
  }))

  diag1 <- row(m) - col(m) + dim(m)
  diag1_xmax <- sum(map_int(seq_len(sum(dim(m))), \(i) {
    sum(str_count(paste0(m[diag1 == i], collapse = ""), c("XMAS", "SAMX")))
  }))

  diag2 <- row(m) + col(m) - 1
  diag2_xmax <- sum(map_int(seq_len(sum(dim(m))), \(i) {
    sum(str_count(paste0(m[diag2 == i], collapse = ""), c("XMAS", "SAMX")))
  }))
  row_xmas + cols_xmas + diag1_xmax + diag2_xmax
}

adventofcode_input(what = "matrix", input = test) |>
    find_xmax_samx()
[1] 18
adventofcode_input(2024, 4, "matrix") |> 
    find_xmax_samx()
[1] 2507

Part 2

test <- ".M.S......
..A..MSMS.
.M.S.MAA..
..A.ASMSM.
.M.S.M....
..........
S.S.S.S.S.
.A.A.A.A..
M.M.M.M.M.
.........."

find_max_sam <- \(m) {
  a_index <- setdiff(
    which(m == "A"),
    c(which(row(m) %in% c(1, nrow(m))), which(col(m) %in% c(1, ncol(m))))
  )
  diag1 <- map_chr(a_index, \(i) paste0(m[i - ncol(m) - 1], m[i], m[i + ncol(m) + 1]))
  diag2 <- map_chr(a_index, \(i) paste0(m[i - ncol(m) + 1], m[i], m[i + ncol(m) - 1]))
  sum(
    diag1 %in% c("SAM", "MAS") & diag2 %in% c("SAM", "MAS")
  )
}

adventofcode_input(what = "matrix", input = test) |> 
  find_max_sam()
[1] 9
adventofcode_input(2024, 4, "matrix") |> 
    find_max_sam()
[1] 1969