Day 16 Part 1 Complete -> Made it nice and easy for day 2 :)
This commit is contained in:
parent
0bead087c3
commit
cfec497112
@ -1,3 +0,0 @@
|
||||
This one was super fun - I really enjoyed it. I defined two enumerated types: one ordered lowest to highest for the card ranks, and another ranked lowest to highest for the hand ranks. The real meat of the code is in function that evaluates the rank of a hand: I used a hash map to build a histogram of each hand, then used the card counts to determine what kind of hand I had for Part 1. I then fed this into a comparison function that compared the ranking of two hands to determine less, equal, or greater, and then fed that to the standard sort function to rank the entire vector of hands and their associated bids. It was then trivial to iterate over the sorted vector to multiply the ranking of each hand with its bid and add it to the sum.
|
||||
|
||||
Part 2 was slightly harder, just reworked the card ranking to make the wildcard the lowest ranked card, then reworked the logic in the hand ranking function to take into account the presence of any wild cards in the hand.
|
110
src/input/day16
110
src/input/day16
@ -0,0 +1,110 @@
|
||||
\...\............................../...\....-..../...|....../.......-...........................|.............
|
||||
.............|/.../............................-....|......../...........|.|................/\-..|....\...../.
|
||||
....\......-.....||-\........................|/........|............/.......................|\...|............
|
||||
|.....-....\.|......-.\....\-......|.........../|......../\...\.-..........-.........\...-..\........./.......
|
||||
............../.|..........|.......|.......\.\...............|../......................\......................
|
||||
.-.-...|....-.-.......\...\..../....../.......-..................\......./....................-........-......
|
||||
..........\.....|.....\.....\..................................................................|..............
|
||||
...../..................../...........-..-.........................-...................................../-...
|
||||
......\......\.............|..../..........\.........................\..\../....../...........-...........-...
|
||||
.....|./..........-....\....|........./..........-..............-./........../..............-...\...../.......
|
||||
...../...../.......-..............|......\\../......../........../............../......\......\...../........-
|
||||
..\................|......\.............\|............./..../...-...........................|-../|...|......./
|
||||
....|.........-.|....-....-.....|.......................................-...../.\.............\.........-.....
|
||||
.........-........././................\../...........\.......\......./.....\................\...\.............
|
||||
.............|........\....|........\........................././\............-............./............/....
|
||||
................./...-..........|..............--../.|\............./.........................................
|
||||
.|../.....|................|........../.......-.......-.............\.........................................
|
||||
.............\..................\......../.......\/................\....\......../...././....................|
|
||||
.................\................................../..........................................|..............
|
||||
................|..................../..................\...........................|./..........-.........-..
|
||||
...|.............\.....-..||...-......../.........................../......................-..-|.........-....
|
||||
.\...........................-../................|.../............/....-......\............................../
|
||||
.........................|...............|...........|.|.............\....\...../........-.--/................
|
||||
./...|.........-.............|..-../..........\........./../...........................|.....................\
|
||||
.|.....-......\..-..................\..|.../................................/\......-.........../...../..../..
|
||||
...\...............\....\../.........|\................-......................................\...............
|
||||
....../..-|...................................\.........|...-....|..../.......................|/..............
|
||||
.........|.|..............-...................../.................|./-....|../..........\..............|......
|
||||
.......\..|...\...........|....................|.-......................\..-.../.......\|..........\.../.|.\.|
|
||||
-.............................|....................|.....|.........-.........|..-........./.......|\.|.../....
|
||||
.-.......\...................\.....\../......|..............|...................-............./.....-.........
|
||||
...|..................../..|\....\..-............\................\..................................|....-...
|
||||
...............\....................\.|\....-.............|....../.................\..........\....../.....\..
|
||||
......|..\......................-........\.......\.../.|......-...............|......./\../........../........
|
||||
.........-..../........-\.........-.......-.....|.|....\.\........\.-.......|.........-....|...--.-..|........
|
||||
.....|..|.|....-./.....|.....|...........|/\...../.............\/....|-........./..-.................../......
|
||||
.|....../..............-...-............-.......-....................\..-...-.|...............................
|
||||
|.............|............................|.............................-....................................
|
||||
....../....-../..........\...|......-.|...........\..|..................-...../../-..\.........\.....|........
|
||||
......\../..................-..............-.../.......-.............................\..-....\/...............
|
||||
............\......................./..................|....-....................-........../.....-.......-...
|
||||
...............|...........-./.......\...-..../....|....-........./..-.........-...........-.\................
|
||||
/..................../.................\.....-................./\/........../............./..|................
|
||||
....................../.............../\..........|.....\|../...-..\............|........./...................
|
||||
......................-../.|...............................................-......./..\......|................
|
||||
.......\...............|..............|.../............................\........./....|.....|................|
|
||||
....\......../....-...|.................-..........-...|/./...................../.\...........................
|
||||
.........|......./.............|../..-.......................-|...........\.........|...|.....................
|
||||
..\............../.......................-....\.................-.....|.........-.............................
|
||||
.....-/...............|......|..../......-...|..../...........-................................-.....\...\...\
|
||||
......................../.......\................./..\..........\............|...................\............
|
||||
-....................../...........\......./...|...........\|./........-..................\...-......../......
|
||||
.......|./..........|...\................/..............|.\.............\.\..................................\
|
||||
.|............\.......\..........\./..........-...................../..|............................../.......
|
||||
........................../....../...|......-..\..............|-.|....\-...|../.........\......-.\./..........
|
||||
....../.........../.........../..\......./......../-...\...........\............/.....................|...\...
|
||||
...-....../.../.....\....-...........\..................../.........-......................\..................
|
||||
/............|../.......................-.........|....../......|.......|............/-..../..../............|
|
||||
../..|...............|../-................/.........................................|.........................
|
||||
.....-..........-\-...........|....../\....................|......................-.....-..........\..........
|
||||
.-.....\......./.....\............../...|...|............-...|...../.............\...\../|...../...|......../.
|
||||
.../......-..|...................\-...../..-..|.......|..-..../........|....-.../.......|........|......|.....
|
||||
.-....../............/........-/..........\........\...........................\..........................|...
|
||||
.....|...|........................................../...........................-|.......|..-.................
|
||||
|...........|.\..............|......................-|./.......|../....\-.|\.../...-.......|.......|..........
|
||||
.|.........\.|../.....-.........\......\..\...........|...................\.........../......|.......-..../...
|
||||
...............|.....................|......|.................../.............|.....-..|..........-...........
|
||||
|.............|...........|............../......................\..........-.............|.....-..............
|
||||
.\............-../\.................-.......|.-............../........\.......|.............\.....\...........
|
||||
.../.\.....\|..-.............\.....................................|.................-............/..........|
|
||||
.../../.............................-...|.......|..............-............................-.................
|
||||
......................\-\............-......|.-............|.\...............-.../......\.........-...........
|
||||
............................|..\.-.............../.\.../.......-..................\...........................
|
||||
..../..\........-........\......../..\......../......\./..-|....|........\............|...................|\..
|
||||
..................................................|...\..../........................................-.........
|
||||
...\......-............\.......-...\...\............|\..../\....../.||........................................
|
||||
...............-................-......-....../.../............................-.|....|................./..\..
|
||||
......././../....-...................................................\..............................||........
|
||||
|/.....\........./....................\......-.-.....|......|................../............................\.
|
||||
................./..\...................\......\.........\..............-.....-....................\..-..../.\
|
||||
...\......|..-.........-.....|.........-........|.............|..............\............-...................
|
||||
.\..........|.............-............../../......../........................................................
|
||||
....\....................................................-......../..-........|.....\..........\..............
|
||||
.......-..\....................-..|.....-..../.-......../............\.............|..............|../........
|
||||
...|/....-.............-......../\...........|................/..................\.....|....................-.
|
||||
.....-................./.|......../..........-......|...\.....-..............-...-..|.......................|.
|
||||
.........\..../...........-........|--......-.........-.........\...-.......|.\........-.........|.........../
|
||||
........-...|../......../........\.....|.....|.....\................/.......-.....-.........../..|........\...
|
||||
.-....\................||.......|...\..\......./.....-............|../...............|........./......-...-...
|
||||
.......\......\............../.|.......................................|.......................|........./|...
|
||||
............|../........-............................/.........-.........-..\..\..../.../.\...\.\.............
|
||||
....................\...|.....\/...|\.|.................\.|...............................................\-..
|
||||
.................\|...-........./\.......|.......................................-.........\..................
|
||||
.......-.......|.............\....|...\.....-.\./.....-..................\\........-..\......-....../.........
|
||||
............-...../....................|...-....../..............-..../................|...........-..........
|
||||
............../\..........|........|./\\..|.....|../....-......../..............-............\......./...\....
|
||||
............./....../......-...............\|..\............../......\.......................-.......|..-.....
|
||||
.....-........./....\......................\...../...|./..\.../\...../.......\...............\............../.
|
||||
...................................|..../../.-....................-.....-.......-...................-....-....
|
||||
..................................................-......|-............|-...\.\...............\...............
|
||||
.............../...........\................/.....\...........-.....|......................-............-.....
|
||||
.............|.....|......................./.......|.............................\.|..........\../........\...
|
||||
........................|..............\............................/...................-..|.......\.\........
|
||||
.......|....../............/...............-..........|\.........|.......\.....|.............\/../...-...-....
|
||||
......\.\.....-..||...-.\........\....|...../\/....\........../........|......|...............................
|
||||
..\........-../....\/.....................-...........................|.......................................
|
||||
..............|../.|...............\...\.........|..\............../......./.-.....\......-..../..............
|
||||
....|....-............../......-.\........-............|.|..|.........................../.......|.............
|
||||
........\............./...................|......../....|..-.....................|./.......\..................
|
||||
............./.|...........\.............................../.....\....|/.......|.|........./.........|........
|
@ -0,0 +1,10 @@
|
||||
.|...\....
|
||||
|.-.\.....
|
||||
.....|-...
|
||||
........|.
|
||||
..........
|
||||
.........\
|
||||
..../.\\..
|
||||
.-.-/..|..
|
||||
.|....-|.\
|
||||
..//.|....
|
@ -0,0 +1,10 @@
|
||||
.|...\....
|
||||
|.-.\.....
|
||||
.....|-...
|
||||
........|.
|
||||
..........
|
||||
.........\
|
||||
..../.\\..
|
||||
.-.-/..|..
|
||||
.|....-|.\
|
||||
..//.|....
|
@ -23,7 +23,7 @@ async fn main() -> Result<(), Box<dyn Error>> {
|
||||
Box::new(day13::Day13 {}),
|
||||
Box::new(day14::Day14 {}),
|
||||
Box::new(day15::Day15 {}),
|
||||
// Box::new(day16::Day16 {}),
|
||||
Box::new(day16::Day16 {}),
|
||||
// Box::new(day17::Day17 {}),
|
||||
// Box::new(day18::Day18 {}),
|
||||
// Box::new(day19::Day19 {}),
|
||||
|
@ -5,9 +5,11 @@ pub struct Day16 {}
|
||||
impl Solution for Day16 {
|
||||
fn part1(
|
||||
&self,
|
||||
_input: &mut Vec<String>,
|
||||
input: &mut Vec<String>,
|
||||
) -> Result<Box<dyn std::fmt::Display + Sync>, Box<dyn std::error::Error>> {
|
||||
Ok(Box::new("Ready"))
|
||||
let grid = input.iter().map(|l| l.as_bytes()).collect::<Vec<_>>();
|
||||
|
||||
Ok(Box::new(self.traverse_grid(&grid, (0, 0, 1))))
|
||||
}
|
||||
|
||||
fn part2(
|
||||
@ -22,7 +24,46 @@ impl Solution for Day16 {
|
||||
}
|
||||
}
|
||||
|
||||
impl Day16 {}
|
||||
impl Day16 {
|
||||
/// Returns the next coordinate after taking a step in the given direction
|
||||
fn step(&self, r: usize, c: usize, d: usize) -> (usize, usize, usize) {
|
||||
let (dr, dc) = [(-1,0),(0,1),(1,0),(0,-1)][d];
|
||||
((r as isize + dr) as _, (c as isize + dc) as _, d)
|
||||
}
|
||||
|
||||
/// Function which traverses through the grid and returns the number of tiles that are energised
|
||||
/// in the process
|
||||
fn traverse_grid(&self, grid: &[&[u8]], start: (usize,usize,usize)) -> usize {
|
||||
let mut seen = vec![vec![[false; 4]; grid[0].len()]; grid.len()];
|
||||
let mut beams = vec![start];
|
||||
|
||||
// Trace all of the beams present in the list
|
||||
while !beams.is_empty() {
|
||||
let mut new_beams = Vec::with_capacity(beams.capacity());
|
||||
// Row, col and direction
|
||||
for (r,c,d) in beams {
|
||||
if r >= grid.len() || c >= grid[0].len() {
|
||||
continue;
|
||||
}
|
||||
if seen[r][c][d] {
|
||||
continue;
|
||||
}
|
||||
seen[r][c][d] = true;
|
||||
|
||||
// Trace the new path in a given direction and draw all of the new beams that come from it.
|
||||
match (grid[r][c], d) {
|
||||
(b'/', _) => new_beams.push(self.step(r,c,[1,0,3,2][d])),
|
||||
(b'\\', _) => new_beams.push(self.step(r,c,[3,2,1,0][d])),
|
||||
(b'|', 1|3) => new_beams.extend([self.step(r,c,0), self.step(r,c,2)]),
|
||||
(b'-', 0|2) => new_beams.extend([self.step(r,c,1), self.step(r,c,3)]),
|
||||
_ => new_beams.push(self.step(r,c,d)),
|
||||
}
|
||||
}
|
||||
beams = new_beams;
|
||||
}
|
||||
seen.iter().flat_map(|row| row).filter(|x| x.iter().any(|&b| b)).count()
|
||||
}
|
||||
}
|
||||
|
||||
/// Test from puzzle input
|
||||
#[cfg(test)]
|
||||
@ -44,7 +85,7 @@ mod test {
|
||||
.unwrap()
|
||||
.to_string();
|
||||
|
||||
assert_eq!(answer, "Ready");
|
||||
assert_eq!(answer, "46");
|
||||
}
|
||||
|
||||
#[test]
|
||||
@ -61,6 +102,6 @@ mod test {
|
||||
.unwrap()
|
||||
.to_string();
|
||||
|
||||
assert_eq!(answer, "Ready");
|
||||
assert_eq!(answer, "51");
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user