2020 Advent of Code solutions in various languages
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

# --- 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(`*`)