# Libraries
library(tidyverse)
library(unglue)
# Read input from file
input <- read_lines("../input/day15.txt", skip_empty_rows = TRUE) |> 
  str_split_1(",")Day 15
Advent of Code: Worked Solutions
Setup
Part 1
Define a function that converts a character string into a hash value as defined by the specs:
ascii_hash <- function(str) {
  reduce(
    .x = utf8ToInt(str),
    .f = ~ ((.x + .y) * 17) %% 256, 
    .init = 0
  )
}Separate the input at the commas, run the ASCII hash on each item, and sum the result:
input |> 
  map_int(ascii_hash) |> 
  sum()Part 2
Define a function to place lenses in the appropriate boxes as defined by the input sequence:
hashmap <- function(boxes, str) {
  label     <- str_extract(str, "[a-z]+")
  box_num   <- ascii_hash(label) + 1
  operation <- str_extract(str, "-|=")
  if (operation == "=") 
    boxes[[box_num]][[label]] <- parse_number(str)
  if (operation == "-")
    boxes[[box_num]] <- discard_at(boxes[[box_num]], label)
  boxes
}Define a function to compute the focusing power of the lenses in the final box arrangement:
focusing_power <- function(boxes) {
  boxes |> 
    imap(\(box, box_num) {
      imap(unname(box), \(lens, lens_num) {
        (as.integer(box_num) + 1) * lens_num * lens
      })
    }) |> 
    unlist() |> 
    sum()
}Run on puzzle input:
init_boxes <- map(set_names(0:255), ~ list())
input |> 
  reduce(hashmap, .init = init_boxes) |> 
  focusing_power()