diff --git a/10/src/main.rs b/10/src/main.rs index 80c4c6b..5484140 100644 --- a/10/src/main.rs +++ b/10/src/main.rs @@ -18,20 +18,25 @@ fn main() { // PARSE #[derive(Debug)] -struct PipeSection { +struct MapCell { dist: u64, kind: char, + inside: bool, } -impl From for PipeSection { +impl From for MapCell { fn from(c: char) -> Self { - PipeSection { dist: 0, kind: c } + MapCell { + dist: 0, + kind: c, + inside: false, + } } } #[derive(Debug)] struct PipeMap { - map: Vec>, + map: Vec>, start: (usize, usize), } @@ -100,15 +105,87 @@ impl PipeMap { } } } + [adj_positions[0], adj_positions[1]] } + + fn mark_inside(&mut self) { + let start_adj = self.start_adjacencies(); + + let start_kind = if start_adj.contains( + &self + .apply_adj(self.start, (0, -1)) + .unwrap_or((99999, 99999)), + ) && start_adj + .contains(&self.apply_adj(self.start, (0, 1)).unwrap_or((99999, 99999))) + { + '|' + } else if start_adj.contains( + &self + .apply_adj(self.start, (-1, 0)) + .unwrap_or((99999, 99999)), + ) && start_adj + .contains(&self.apply_adj(self.start, (1, 0)).unwrap_or((99999, 99999))) + { + '-' + } else if start_adj.contains( + &self + .apply_adj(self.start, (0, -1)) + .unwrap_or((99999, 99999)), + ) && start_adj + .contains(&self.apply_adj(self.start, (1, 0)).unwrap_or((99999, 99999))) + { + 'L' + } else if start_adj.contains( + &self + .apply_adj(self.start, (0, -1)) + .unwrap_or((99999, 99999)), + ) && start_adj.contains( + &self + .apply_adj(self.start, (-1, 0)) + .unwrap_or((99999, 99999)), + ) { + 'J' + } else if start_adj.contains(&self.apply_adj(self.start, (0, 1)).unwrap_or((99999, 99999))) + && start_adj.contains( + &self + .apply_adj(self.start, (-1, 0)) + .unwrap_or((99999, 99999)), + ) + { + '7' + } else if start_adj.contains(&self.apply_adj(self.start, (0, 1)).unwrap_or((99999, 99999))) + && start_adj.contains(&self.apply_adj(self.start, (1, 0)).unwrap_or((99999, 99999))) + { + 'F' + } else { + panic!("invalid start"); + }; + + for row in &mut self.map { + let mut inside = false; + for cell in row { + let mut kind = cell.kind; + if cell.dist == 0 && kind != 'S' { + cell.inside = inside; + } else { + if kind == 'S' { + kind = start_kind; + } + if kind == '|' || kind == 'L' || kind == 'J' { + inside = !inside; + } + } + } + } + } } impl From> for PipeMap { fn from(lines: Lines) -> Self { - let mut map: Vec> = Vec::new(); + let mut map: Vec> = Vec::new(); for line in lines { - map.push(line.unwrap().chars().map(PipeSection::from).collect()); + map.push(line.unwrap().chars().map(MapCell::from).collect()); } let start = map @@ -123,7 +200,7 @@ impl From> for PipeMap { let mut cur_positions = pipemap.start_adjacencies(); let mut cur_distance = 1; - loop { + loop { for pos in cur_positions { pipemap.map[pos.1][pos.0].dist = cur_distance; } @@ -163,12 +240,39 @@ impl From> for PipeMap { fn problem1(input: Lines) -> u64 { let map = PipeMap::from(input); - map.map.iter().map(|row| row.iter().map(|cell| cell.dist).max().unwrap()).max().unwrap() + map.map + .iter() + .map(|row| row.iter().map(|cell| cell.dist).max().unwrap()) + .max() + .unwrap() } // PROBLEM 2 solution fn problem2(input: Lines) -> u64 { - 0 + let mut map = PipeMap::from(input); + map.mark_inside(); + + for row in &map.map { + for cell in row { + print!("{}", cell.kind); + } + print!(" "); + for cell in row { + print!( + "{}", + match cell.inside { + true => 'I', + false => 'O', + } + ); + } + println!(); + } + + map.map + .iter() + .map(|row| row.iter().filter(|cell| cell.inside).count()) + .sum::() as u64 } #[cfg(test)] @@ -182,6 +286,17 @@ SJ.L7 |F--J LJ..."; + const EXAMPLE2: &str = &"FF7FSF7F7F7F7F7F---7 +L|LJ||||||||||||F--J +FL-7LJLJ||||||LJL-77 +F--JF--7||LJLJ7F7FJ- +L---JF-JLJ.||-FJLJJ7 +|F|F-JF---7F7-L7L|7| +|FFJF7L7F-JF7|JL---7 +7-L-JL7||F7|L7F-7F7| +L.L7LFJ|||||FJL7||LJ +L7JLJL-JLJLJL--JLJ.L"; + #[test] fn problem1_example() { let c = Cursor::new(EXAMPLE); @@ -190,7 +305,7 @@ LJ..."; #[test] fn problem2_example() { - let c = Cursor::new(EXAMPLE); - assert_eq!(problem2(c.lines()), 0); + let c = Cursor::new(EXAMPLE2); + assert_eq!(problem2(c.lines()), 10); } }