You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
131 lines
4.8 KiB
131 lines
4.8 KiB
# --- Day 3: Toboggan Trajectory ---
|
|
#
|
|
# With the toboggan login problems resolved, you set off toward the airport.
|
|
# While travel by toboggan might be easy, it's certainly not safe: there's very
|
|
# minimal steering and the area is covered in trees. You'll need to see which
|
|
# angles will take you near the fewest trees.
|
|
#
|
|
# Due to the local geology, trees in this area only grow on exact integer
|
|
# coordinates in a grid. You make a map (your puzzle input) of the open
|
|
# squares (.) and trees (#) you can see. For example:
|
|
#
|
|
# ..##.......
|
|
# #...#...#..
|
|
# .#....#..#.
|
|
# ..#.#...#.#
|
|
# .#...##..#.
|
|
# ..#.##.....
|
|
# .#.#.#....#
|
|
# .#........#
|
|
# #.##...#...
|
|
# #...##....#
|
|
# .#..#...#.#
|
|
#
|
|
# These aren't the only trees, though; due to something you read about once
|
|
# involving arboreal genetics and biome stability, the same pattern repeats
|
|
# to the right many times:
|
|
#
|
|
# ..##.........##.........##.........##.........##.........##....... --->
|
|
# #...#...#..#...#...#..#...#...#..#...#...#..#...#...#..#...#...#..
|
|
# .#....#..#..#....#..#..#....#..#..#....#..#..#....#..#..#....#..#.
|
|
# ..#.#...#.#..#.#...#.#..#.#...#.#..#.#...#.#..#.#...#.#..#.#...#.#
|
|
# .#...##..#..#...##..#..#...##..#..#...##..#..#...##..#..#...##..#.
|
|
# ..#.##.......#.##.......#.##.......#.##.......#.##.......#.##..... --->
|
|
# .#.#.#....#.#.#.#....#.#.#.#....#.#.#.#....#.#.#.#....#.#.#.#....#
|
|
# .#........#.#........#.#........#.#........#.#........#.#........#
|
|
# #.##...#...#.##...#...#.##...#...#.##...#...#.##...#...#.##...#...
|
|
# #...##....##...##....##...##....##...##....##...##....##...##....#
|
|
# .#..#...#.#.#..#...#.#.#..#...#.#.#..#...#.#.#..#...#.#.#..#...#.# --->
|
|
#
|
|
# You start on the open square (.) in the top-left corner and need to reach
|
|
# the bottom (below the bottom-most row on your map).
|
|
#
|
|
# The toboggan can only follow a few specific slopes (you opted for a
|
|
# cheaper model that prefers rational numbers); start by counting all
|
|
# the trees you would encounter for the slope right 3, down 1:
|
|
#
|
|
# From your starting position at the top-left, check the position that
|
|
# is right 3 and down 1. Then, check the position that is right 3 and down
|
|
# 1 from there, and so on until you go past the bottom of the map.
|
|
#
|
|
# The locations you'd check in the above example are marked here with O
|
|
# where there was an open square and X where there was a tree:
|
|
#
|
|
# ..##.........##.........##.........##.........##.........##....... --->
|
|
# #..O#...#..#...#...#..#...#...#..#...#...#..#...#...#..#...#...#..
|
|
# .#....X..#..#....#..#..#....#..#..#....#..#..#....#..#..#....#..#.
|
|
# ..#.#...#O#..#.#...#.#..#.#...#.#..#.#...#.#..#.#...#.#..#.#...#.#
|
|
# .#...##..#..X...##..#..#...##..#..#...##..#..#...##..#..#...##..#.
|
|
# ..#.##.......#.X#.......#.##.......#.##.......#.##.......#.##..... --->
|
|
# .#.#.#....#.#.#.#.O..#.#.#.#....#.#.#.#....#.#.#.#....#.#.#.#....#
|
|
# .#........#.#........X.#........#.#........#.#........#.#........#
|
|
# #.##...#...#.##...#...#.X#...#...#.##...#...#.##...#...#.##...#...
|
|
# #...##....##...##....##...#X....##...##....##...##....##...##....#
|
|
# .#..#...#.#.#..#...#.#.#..#...X.#.#..#...#.#.#..#...#.#.#..#...#.# --->
|
|
#
|
|
# In this example, traversing the map using this slope would cause you
|
|
# to encounter 7 trees.
|
|
#
|
|
# Starting at the top-left corner of your map and following a slope of
|
|
# right 3 and down 1, how many trees would you encounter?
|
|
|
|
library(stringi)
|
|
library(tidyverse)
|
|
|
|
readLines("../input/03-01.txt") %>%
|
|
stri_split_boundaries(
|
|
opts_brkiter = stri_opts_brkiter("character"),
|
|
simplify = FALSE
|
|
) -> orig_map
|
|
|
|
tree_count <- function(orig_map, slope_x, slope_y) {
|
|
|
|
m_cols <- length(orig_map[[1]])
|
|
m_rows <- length(orig_map)
|
|
|
|
n_tiles <- (slope_x+1) * m_rows %/% (m_cols)
|
|
|
|
orig_map %>%
|
|
map(~rep(., n_tiles)) -> actual_map
|
|
|
|
xpos <- 1
|
|
ypos <- 1
|
|
n_trees <- 0
|
|
|
|
repeat {
|
|
xpos <- xpos + slope_x
|
|
ypos <- ypos + slope_y
|
|
if (ypos > m_rows) break
|
|
if (actual_map[[ypos]][xpos] == "#") n_trees <- n_trees + 1
|
|
}
|
|
|
|
n_trees
|
|
|
|
}
|
|
|
|
# 03-01 -------------------------------------------------------------------
|
|
|
|
tree_count(orig_map, 3, 1)
|
|
|
|
# 03-02 -------------------------------------------------------------------
|
|
|
|
# --- Part Two ---
|
|
#
|
|
# Time to check the rest of the slopes - you need to minimize the probability of a sudden arboreal stop, after all.
|
|
#
|
|
# Determine the number of trees you would encounter if, for each of the following slopes, you start at the top-left corner and traverse # the map all the way to the bottom:
|
|
#
|
|
# Right 1, down 1.
|
|
# Right 3, down 1. (This is the slope you already checked.)
|
|
# Right 5, down 1.
|
|
# Right 7, down 1.
|
|
# Right 1, down 2.
|
|
# In the above example, these slopes would find 2, 7, 3, 4, and 2 tree(s) respectively; multiplied together, these produce the answer 336.
|
|
#
|
|
# What do you get if you multiply together the number of trees encountered on each of the listed slopes?
|
|
|
|
x <- c(1, 3, 5, 7, 1)
|
|
y <- c(1, 1, 1, 1, 2)
|
|
|
|
map2_dbl(x, y, tree_count, orig_map = orig_map) %>%
|
|
reduce(`*`)
|
|
|