Advent of Code 2023
  • Solutions

Day 5 ⋆

Published

December 5, 2023

Puzzle

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

Solution

Preprocessing

seeds <- readr::read_delim(
  "input.txt", 
  delim = " ", 
  skip = 0,
  n_max = 1,
  col_names = FALSE
)
ref_list <- tribble(
  ~name, ~first_row, ~last_row,
  "seed2soil", 3, 43,
  "soil2fert", 45, 70,
  "fert2water", 72, 114,
  "water2light", 116, 163,
  "light2temp", 165, 181,
  "temp2humidity", 183, 199,
  "humidity2loc", 201, 213
)
xwalk_list <- map(
  1:nrow(ref_list),
  \(this_row) ref_list[this_row,] %$% 
    readr::read_delim(
      "input.txt", 
      delim = " ", 
      skip = first_row,
      n_max = last_row - first_row,
      col_names = FALSE
    ) %>% 
    setNames(c("dest", "src", "len")) %>% 
    transmute(
      src,
      src_max = src + len - 1,
      dest,
      dest_max = dest + len - 1
    )
) %>% 
  setNames(ref_list$name)

Part One

helper1_day5 <- function (prev_df, xwalk) {
  tmp1 <- xwalk %>% 
    filter(src <= prev_df$this_dest & prev_df$this_dest <= src_max) 
  if (nrow(tmp1) > 0) {
    to_return <- tmp1 %>% 
      mutate(this_dest = dest + (prev_df$this_dest - src))
  } else if (nrow(tmp1) == 0) {
    to_return <- tibble(this_dest = prev_df$this_dest) 
  }
  return(to_return)
}
helper2_day5 <- function (input, xwalk_list) {
  tibble(this_dest = input) %>% 
    helper1_day5(xwalk_list$seed2soil) %>% 
    helper1_day5(xwalk_list$soil2fert) %>% 
    helper1_day5(xwalk_list$fert2water) %>% 
    helper1_day5(xwalk_list$water2light) %>%
    helper1_day5(xwalk_list$light2temp) %>%
    helper1_day5(xwalk_list$temp2humidity) %>%
    helper1_day5(xwalk_list$humidity2loc) %>% 
    pull(this_dest)
}
answer1 <- seeds %>% 
  select(-X1) %>% 
  unlist() %>% 
  unname() %>% 
  map_dbl(~helper2_day5(.x, xwalk_list = xwalk_list)) %>% 
  min()
answer1
[1] 462648396

Part Two

I haven’t solved this part yet!