Day 10 Part 2 Complete
This commit is contained in:
parent
075f7e39c7
commit
5c46e12269
@ -1,5 +1,10 @@
|
||||
..F7.
|
||||
.FJ|.
|
||||
SJ.L7
|
||||
|F--J
|
||||
LJ...
|
||||
.F----7F7F7F7F-7....
|
||||
.|F--7||||||||FJ....
|
||||
.||.FJ||||||||L7....
|
||||
FJL7L7LJLJ||LJ.L-7..
|
||||
L--J.L7...LJS7F-7L7.
|
||||
....F-J..F7FJ|L7L7L7
|
||||
....L7.F7||L7|.L7L7|
|
||||
.....|FJLJ|FJ|F7|.LJ
|
||||
....FJL-7.||.||||...
|
||||
....L---J.LJ.LJLJ...
|
@ -9,37 +9,31 @@ impl Solution for Day10 {
|
||||
&self,
|
||||
input: &mut Vec<String>,
|
||||
) -> Result<Box<dyn std::fmt::Display + Sync>, Box<dyn std::error::Error>> {
|
||||
let mut start = (0, 0);
|
||||
let mut graph = input
|
||||
.iter()
|
||||
.enumerate()
|
||||
.map(|(r, line)| {
|
||||
line.bytes()
|
||||
.enumerate()
|
||||
.map(|(c, tile)| {
|
||||
if tile == b'S' {
|
||||
start = (r, c);
|
||||
}
|
||||
self.connections(tile)
|
||||
})
|
||||
.collect::<Vec<_>>()
|
||||
})
|
||||
.collect::<Vec<_>>();
|
||||
let pipe_loop = "J|-L7F"
|
||||
.bytes()
|
||||
.find_map(|start_tile| {
|
||||
graph[start.0][start.1] = self.connections(start_tile);
|
||||
self.find_loop(&graph, start)
|
||||
})
|
||||
.unwrap();
|
||||
let (start, mut graph) = self.generate_graph(input);
|
||||
let pipe_loop = self.generate_loop(start, &mut graph)?;
|
||||
Ok(Box::new(pipe_loop.len() / 2))
|
||||
}
|
||||
|
||||
fn part2(
|
||||
&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 mut ans = 0usize;
|
||||
|
||||
let (start, mut graph) = self.generate_graph(input);
|
||||
let pipe_loop = self.generate_loop(start, &mut graph)?;
|
||||
|
||||
for r in 0..graph.len() {
|
||||
let mut inside = false;
|
||||
for c in 0..graph[0].len() {
|
||||
if !pipe_loop.contains(&(r, c)) {
|
||||
ans += inside as usize;
|
||||
} else if graph[r][c][0] {
|
||||
inside = !inside;
|
||||
}
|
||||
}
|
||||
}
|
||||
Ok(Box::new(ans))
|
||||
}
|
||||
|
||||
fn get_day(&self) -> u8 {
|
||||
@ -48,6 +42,8 @@ impl Solution for Day10 {
|
||||
}
|
||||
|
||||
impl Day10 {
|
||||
/// Traces the graph and populates a hashset with
|
||||
/// loops present within the connections
|
||||
fn find_loop(
|
||||
&self,
|
||||
graph: &[Vec<[bool; 4]>],
|
||||
@ -86,6 +82,7 @@ impl Day10 {
|
||||
}
|
||||
}
|
||||
|
||||
/// Retruns all of the connections around a given tile
|
||||
fn connections(&self, tile: u8) -> [bool; 4] {
|
||||
match tile {
|
||||
// [ up, right, down, left]
|
||||
@ -98,6 +95,44 @@ impl Day10 {
|
||||
_ => [false, false, false, false],
|
||||
}
|
||||
}
|
||||
|
||||
/// Fucntion to generate a graph of all of the connections of the the nodes
|
||||
fn generate_graph(&self, input: &mut Vec<String>) -> ((usize, usize), Vec<Vec<[bool; 4]>>) {
|
||||
let mut start = (0, 0);
|
||||
let graph = input
|
||||
.iter()
|
||||
.enumerate()
|
||||
.map(|(r, line)| {
|
||||
line.bytes()
|
||||
.enumerate()
|
||||
.map(|(c, tile)| {
|
||||
if tile == b'S' {
|
||||
start = (r, c);
|
||||
}
|
||||
self.connections(tile)
|
||||
})
|
||||
.collect::<Vec<_>>()
|
||||
})
|
||||
.collect::<Vec<_>>();
|
||||
|
||||
(start, graph)
|
||||
}
|
||||
|
||||
/// Function that generates the a hashset of the loops in the graph
|
||||
fn generate_loop(
|
||||
&self,
|
||||
start: (usize, usize),
|
||||
graph: &mut [Vec<[bool; 4]>],
|
||||
) -> Result<HashSet<(usize, usize)>, Box<dyn std::error::Error>> {
|
||||
let pipe_loop = "J|-L7F"
|
||||
.bytes()
|
||||
.find_map(|start_tile| {
|
||||
graph[start.0][start.1] = self.connections(start_tile);
|
||||
self.find_loop(&graph, start)
|
||||
})
|
||||
.unwrap();
|
||||
Ok(pipe_loop)
|
||||
}
|
||||
}
|
||||
|
||||
/// Test from puzzle input
|
||||
@ -120,7 +155,7 @@ mod test {
|
||||
.unwrap()
|
||||
.to_string();
|
||||
|
||||
assert_eq!(answer, "Ready");
|
||||
assert_eq!(answer, "8");
|
||||
}
|
||||
|
||||
#[test]
|
||||
@ -137,6 +172,6 @@ mod test {
|
||||
.unwrap()
|
||||
.to_string();
|
||||
|
||||
assert_eq!(answer, "Ready");
|
||||
assert_eq!(answer, "8");
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user