diff options
author | Yigit Sever | 2021-12-20 15:56:27 +0300 |
---|---|---|
committer | Yigit Sever | 2021-12-20 15:56:27 +0300 |
commit | 3621b8231a603854e6c088df2879bae02e62681d (patch) | |
tree | 6c124dbd361322496a246b2d773b42cbc5cd25ac /2021/day9 | |
parent | 4f913109c74daa869d91798848c26b382a14e17c (diff) | |
download | aoc-3621b8231a603854e6c088df2879bae02e62681d.tar.gz aoc-3621b8231a603854e6c088df2879bae02e62681d.tar.bz2 aoc-3621b8231a603854e6c088df2879bae02e62681d.zip |
2021, day9: part2
Diffstat (limited to '2021/day9')
-rw-r--r-- | 2021/day9/src/main.rs | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/2021/day9/src/main.rs b/2021/day9/src/main.rs index 75bf1e9..3c8d4c6 100644 --- a/2021/day9/src/main.rs +++ b/2021/day9/src/main.rs | |||
@@ -1,11 +1,25 @@ | |||
1 | use std::collections::HashSet; | ||
1 | use std::env; | 2 | use std::env; |
2 | use std::fs::File; | 3 | use std::fs::File; |
3 | use std::io::{BufRead, BufReader}; | 4 | use std::io::{BufRead, BufReader}; |
4 | 5 | ||
6 | #[derive(Debug, Clone, Copy, Eq, PartialEq, Hash)] | ||
7 | struct Point { | ||
8 | x: usize, | ||
9 | y: usize, | ||
10 | height: u32, | ||
11 | } | ||
12 | |||
13 | #[derive(Debug, Clone, PartialEq, Eq)] | ||
14 | struct Basin { | ||
15 | points: HashSet<Point>, | ||
16 | } | ||
17 | |||
5 | fn main() { | 18 | fn main() { |
6 | let reader = open_file(); | 19 | let reader = open_file(); |
7 | 20 | ||
8 | let mut points: Vec<Vec<u32>> = Vec::new(); | 21 | let mut points: Vec<Vec<u32>> = Vec::new(); |
22 | let mut basins: Vec<Basin> = Vec::new(); | ||
9 | 23 | ||
10 | for line in reader.lines() { | 24 | for line in reader.lines() { |
11 | points.push( | 25 | points.push( |
@@ -46,9 +60,115 @@ fn main() { | |||
46 | }; | 60 | }; |
47 | if num < up && num < down && num < right && num < left { | 61 | if num < up && num < down && num < right && num < left { |
48 | risk_level += 1 + *num; | 62 | risk_level += 1 + *num; |
63 | basins.push(Basin { | ||
64 | points: HashSet::from_iter(vec![Point { | ||
65 | x: idx, | ||
66 | y: ndx, | ||
67 | height: *num, | ||
68 | }]), | ||
69 | }); | ||
70 | } | ||
71 | } | ||
72 | } | ||
73 | |||
74 | // TODO: fix this maybe because i hate it <20-12-21, yigit> // | ||
75 | for basin in basins.iter_mut() { | ||
76 | let mut stack: Vec<Point> = Vec::new(); | ||
77 | stack.extend(basin.points.clone().into_iter()); | ||
78 | |||
79 | while !stack.is_empty() { | ||
80 | let minibasin = stack.pop().unwrap(); | ||
81 | |||
82 | let up = points | ||
83 | .get(((minibasin.x as isize) - 1) as usize) | ||
84 | .unwrap_or_else(|| &nine) | ||
85 | .get(minibasin.y) | ||
86 | .unwrap_or_else(|| &9); | ||
87 | |||
88 | let down = match points.get(minibasin.x + 1) { | ||
89 | Some(line) => match line.get(minibasin.y) { | ||
90 | Some(number) => number, | ||
91 | None => &9, | ||
92 | }, | ||
93 | None => &9, | ||
94 | }; | ||
95 | let left = match points.get(minibasin.x) { | ||
96 | Some(line) => match line.get(((minibasin.y as isize) - 1) as usize) { | ||
97 | Some(number) => number, | ||
98 | None => &9, | ||
99 | }, | ||
100 | None => &9, | ||
101 | }; | ||
102 | let right = match points.get(minibasin.x) { | ||
103 | Some(line) => match line.get(minibasin.y + 1) { | ||
104 | Some(number) => number, | ||
105 | None => &9, | ||
106 | }, | ||
107 | None => &9, | ||
108 | }; | ||
109 | |||
110 | if up != &9 { | ||
111 | let p = Point { | ||
112 | x: minibasin.x - 1, | ||
113 | y: minibasin.y, | ||
114 | height: *up, | ||
115 | }; | ||
116 | |||
117 | if !basin.points.contains(&p) { | ||
118 | stack.push(p); | ||
119 | basin.points.insert(p); | ||
120 | } | ||
121 | } | ||
122 | |||
123 | if down != &9 { | ||
124 | let p = Point { | ||
125 | x: minibasin.x + 1, | ||
126 | y: minibasin.y, | ||
127 | height: *down, | ||
128 | }; | ||
129 | |||
130 | if !basin.points.contains(&p) { | ||
131 | stack.push(p); | ||
132 | basin.points.insert(p); | ||
133 | } | ||
134 | } | ||
135 | |||
136 | if left != &9 { | ||
137 | let p = Point { | ||
138 | x: minibasin.x, | ||
139 | y: minibasin.y - 1, | ||
140 | height: *left, | ||
141 | }; | ||
142 | |||
143 | if !basin.points.contains(&p) { | ||
144 | stack.push(p); | ||
145 | basin.points.insert(p); | ||
146 | } | ||
147 | } | ||
148 | |||
149 | if right != &9 { | ||
150 | let p = Point { | ||
151 | x: minibasin.x, | ||
152 | y: minibasin.y + 1, | ||
153 | height: *right, | ||
154 | }; | ||
155 | |||
156 | if !basin.points.contains(&p) { | ||
157 | stack.push(p); | ||
158 | basin.points.insert(p); | ||
159 | } | ||
49 | } | 160 | } |
50 | } | 161 | } |
51 | } | 162 | } |
163 | |||
164 | let mut lens: Vec<usize> = basins.iter().map(|x| x.points.len()).collect(); | ||
165 | |||
166 | lens.sort(); | ||
167 | lens.reverse(); | ||
168 | |||
169 | let foo: usize = lens.iter().take(3).product(); | ||
170 | |||
171 | println!("{}", foo); | ||
52 | println!("{}", risk_level); | 172 | println!("{}", risk_level); |
53 | } | 173 | } |
54 | 174 | ||