Advent of Code 2023
  • Solutions

Day 6 ⋆⋆

Published

December 6, 2023

Puzzle

https://adventofcode.com/2023/day/6

Solution

Preprocessing

records <- readr::read_delim(
  "input.txt", 
  delim = "\t", 
  col_names = FALSE
) %>% 
  transmute(X2 = X1 %>% 
              str_split(" ") %>% 
              map(~.x %>% 
                    setdiff(c("Time:", "Distance:", "")) %>% 
                    as.numeric()
              ))
quad_fmla_round <- function(a, b, c) {
  margin <- sqrt(b^2 - 4 * a * c)
  to_return <- c(
    "lower" = ceiling((-b - margin) / (2 * a)),
    "upper" = floor((-b + margin) / (2 * a))
  )
  return(to_return)
}

Part One

answer1 <- tibble(
  Time = records$X2[[1]],
  Distance = records$X2[[2]]
) %>%
  rowwise() %>% 
  mutate(
    lims = list(quad_fmla_round(
      a = 1,
      b = -1 * Time, 
      c = Distance
    )),
    record_distances = lims[["upper"]] - lims[["lower"]] + 1
  ) %>% 
  ungroup() %>% 
  pull(record_distances) %>%
  prod()
answer1
[1] 449550

Part Two

helper1_day6 <- function (x) {
  x %>% paste(collapse = "") %>% as.numeric()
}
records_pt2 <- records$X2 %>% 
  map_dbl(helper1_day6) %>% 
  setNames(c("Time", "Distance"))
lims = quad_fmla_round(
  a = 1, 
  b = -1 * records_pt2[["Time"]], 
  c = records_pt2[["Distance"]]
)
answer2 = lims[["upper"]] - lims[["lower"]] + 1
answer2
[1] 28360140