/ day04 / src / main.rs
main.rs
  1  use std::str;
  2  
  3  #[derive(PartialEq, Eq)]
  4  enum Xmas {
  5      X,
  6      M,
  7      A,
  8      S,
  9  }
 10  
 11  fn main() {
 12      let mut matrix: Vec<Vec<Xmas>> = vec![];
 13      str::from_utf8(include_bytes!("input")).unwrap().lines().for_each(|l| {
 14          let mut line: Vec<Xmas> = vec![];
 15          l.chars().for_each(|c| {
 16              line.push(match c {
 17                  'X' => Xmas::X,
 18                  'M' => Xmas::M,
 19                  'A' => Xmas::A,
 20                  'S' => Xmas::S,
 21                  _ => todo!(),
 22              })
 23          });
 24          matrix.push(line);
 25      });
 26      let mut sum = 0;
 27      for (i, line) in matrix.iter().enumerate() {
 28          for (j, char) in line.iter().enumerate() {
 29              match char {
 30                  Xmas::S => {
 31                      if (0..matrix.len()).contains(&(i - 3))
 32                          && matrix[(i - 1).clamp(0, matrix.len() - 1)][j] == Xmas::A
 33                          && matrix[(i - 2).clamp(0, matrix.len() - 1)][j] == Xmas::M
 34                          && matrix[(i - 3).clamp(0, matrix.len() - 1)][j] == Xmas::X
 35                      {
 36                          sum += 1;
 37                      }
 38                      if (0..matrix.len()).contains(&(i + 3))
 39                          && matrix[(i + 1).clamp(0, matrix.len() - 1)][j] == Xmas::A
 40                          && matrix[(i + 2).clamp(0, matrix.len() - 1)][j] == Xmas::M
 41                          && matrix[(i + 3).clamp(0, matrix.len() - 1)][j] == Xmas::X
 42                      {
 43                          sum += 1;
 44                      }
 45                      if (0..matrix.len()).contains(&(i + 3))
 46                          && (0..matrix[0].len()).contains(&(j + 3))
 47                          && matrix[(i + 1).clamp(0, matrix.len() - 1)]
 48                              [(j + 1).clamp(0, matrix[0].len() - 1)]
 49                              == Xmas::A
 50                          && matrix[(i + 2).clamp(0, matrix.len() - 1)]
 51                              [(j + 2).clamp(0, matrix[0].len() - 1)]
 52                              == Xmas::M
 53                          && matrix[(i + 3).clamp(0, matrix.len() - 1)]
 54                              [(j + 3).clamp(0, matrix[0].len() - 1)]
 55                              == Xmas::X
 56                      {
 57                          sum += 1;
 58                      }
 59                      if (0..matrix.len()).contains(&(i - 3))
 60                          && (0..matrix[0].len()).contains(&(j + 3))
 61                          && matrix[(i - 1).clamp(0, matrix.len() - 1)]
 62                              [(j + 1).clamp(0, matrix[0].len() - 1)]
 63                              == Xmas::A
 64                          && matrix[(i - 2).clamp(0, matrix.len() - 1)]
 65                              [(j + 2).clamp(0, matrix[0].len() - 1)]
 66                              == Xmas::M
 67                          && matrix[(i - 3).clamp(0, matrix.len() - 1)]
 68                              [(j + 3).clamp(0, matrix[0].len() - 1)]
 69                              == Xmas::X
 70                      {
 71                          sum += 1;
 72                      }
 73                      if (0..matrix.len()).contains(&(i + 3))
 74                          && (0..matrix[0].len()).contains(&(j - 3))
 75                          && matrix[(i + 1).clamp(0, matrix.len() - 1)]
 76                              [(j - 1).clamp(0, matrix[0].len() - 1)]
 77                              == Xmas::A
 78                          && matrix[(i + 2).clamp(0, matrix.len() - 1)]
 79                              [(j - 2).clamp(0, matrix[0].len() - 1)]
 80                              == Xmas::M
 81                          && matrix[(i + 3).clamp(0, matrix.len() - 1)]
 82                              [(j - 3).clamp(0, matrix[0].len() - 1)]
 83                              == Xmas::X
 84                      {
 85                          sum += 1;
 86                      }
 87                      if (0..matrix.len()).contains(&(i - 3))
 88                          && (0..matrix[0].len()).contains(&(j - 3))
 89                          && matrix[(i - 1).clamp(0, matrix.len() - 1)]
 90                              [(j - 1).clamp(0, matrix[0].len() - 1)]
 91                              == Xmas::A
 92                          && matrix[(i - 2).clamp(0, matrix.len() - 1)]
 93                              [(j - 2).clamp(0, matrix[0].len() - 1)]
 94                              == Xmas::M
 95                          && matrix[(i - 3).clamp(0, matrix.len() - 1)]
 96                              [(j - 3).clamp(0, matrix[0].len() - 1)]
 97                              == Xmas::X
 98                      {
 99                          sum += 1;
100                      }
101                      if (0..matrix[0].len()).contains(&(j - 3))
102                          && matrix[i][(j - 1).clamp(0, matrix[0].len() - 1)] == Xmas::A
103                          && matrix[i][(j - 2).clamp(0, matrix[0].len() - 1)] == Xmas::M
104                          && matrix[i][(j - 3).clamp(0, matrix[0].len() - 1)] == Xmas::X
105                      {
106                          sum += 1;
107                      }
108                      if (0..matrix[0].len()).contains(&(j + 3))
109                          && matrix[i][(j + 1).clamp(0, matrix[0].len() - 1)] == Xmas::A
110                          && matrix[i][(j + 2).clamp(0, matrix[0].len() - 1)] == Xmas::M
111                          && matrix[i][(j + 3).clamp(0, matrix[0].len() - 1)] == Xmas::X
112                      {
113                          sum += 1;
114                      }
115                  }
116                  _ => (),
117              }
118          }
119      }
120      println!("Part 1 : {sum}");
121      let mut sum = 0;
122      for (i, line) in matrix.iter().enumerate() {
123          for (j, char) in line.iter().enumerate() {
124              match char {
125                  Xmas::S => {
126                      if (0..matrix.len()).contains(&(i - 2))
127                          && (0..matrix[0].len()).contains(&(j - 2))
128                          && matrix[(i - 1).clamp(0, matrix.len() - 1)]
129                              [(j - 1).clamp(0, matrix[0].len() - 1)]
130                              == Xmas::A
131                          && matrix[(i - 2).clamp(0, matrix.len() - 1)]
132                              [(j).clamp(0, matrix[0].len() - 1)]
133                              == Xmas::S
134                          && matrix[(i).clamp(0, matrix.len() - 1)]
135                              [(j - 2).clamp(0, matrix[0].len() - 1)]
136                              == Xmas::M
137                          && matrix[(i - 2).clamp(0, matrix.len() - 1)]
138                              [(j - 2).clamp(0, matrix[0].len() - 1)]
139                              == Xmas::M
140                      {
141                          sum += 1;
142                      }
143                      if (0..matrix.len()).contains(&(i - 2))
144                          && (0..matrix[0].len()).contains(&(j - 2))
145                          && matrix[(i - 1).clamp(0, matrix.len() - 1)]
146                              [(j - 1).clamp(0, matrix[0].len() - 1)]
147                              == Xmas::A
148                          && matrix[(i - 2).clamp(0, matrix.len() - 1)]
149                              [(j).clamp(0, matrix[0].len() - 1)]
150                              == Xmas::M
151                          && matrix[(i).clamp(0, matrix.len() - 1)]
152                              [(j - 2).clamp(0, matrix[0].len() - 1)]
153                              == Xmas::S
154                          && matrix[(i - 2).clamp(0, matrix.len() - 1)]
155                              [(j - 2).clamp(0, matrix[0].len() - 1)]
156                              == Xmas::M
157                      {
158                          sum += 1;
159                      }
160                      if (0..matrix.len()).contains(&(i + 2))
161                          && (0..matrix[0].len()).contains(&(j - 2))
162                          && matrix[(i + 1).clamp(0, matrix.len() - 1)]
163                              [(j - 1).clamp(0, matrix[0].len() - 1)]
164                              == Xmas::A
165                          && matrix[(i + 2).clamp(0, matrix.len() - 1)]
166                              [(j).clamp(0, matrix[0].len() - 1)]
167                              == Xmas::S
168                          && matrix[(i).clamp(0, matrix.len() - 1)]
169                              [(j - 2).clamp(0, matrix[0].len() - 1)]
170                              == Xmas::M
171                          && matrix[(i + 2).clamp(0, matrix.len() - 1)]
172                              [(j - 2).clamp(0, matrix[0].len() - 1)]
173                              == Xmas::M
174                      {
175                          sum += 1;
176                      }
177                      if (0..matrix.len()).contains(&(i + 2))
178                          && (0..matrix[0].len()).contains(&(j - 2))
179                          && matrix[(i + 1).clamp(0, matrix.len() - 1)]
180                              [(j - 1).clamp(0, matrix[0].len() - 1)]
181                              == Xmas::A
182                          && matrix[(i + 2).clamp(0, matrix.len() - 1)]
183                              [(j).clamp(0, matrix[0].len() - 1)]
184                              == Xmas::M
185                          && matrix[(i).clamp(0, matrix.len() - 1)]
186                              [(j - 2).clamp(0, matrix[0].len() - 1)]
187                              == Xmas::S
188                          && matrix[(i + 2).clamp(0, matrix.len() - 1)]
189                              [(j - 2).clamp(0, matrix[0].len() - 1)]
190                              == Xmas::M
191                      {
192                          sum += 1;
193                      }
194                      if (0..matrix.len()).contains(&(i - 2))
195                          && (0..matrix[0].len()).contains(&(j + 2))
196                          && matrix[(i - 1).clamp(0, matrix.len() - 1)]
197                              [(j + 1).clamp(0, matrix[0].len() - 1)]
198                              == Xmas::A
199                          && matrix[(i - 2).clamp(0, matrix.len() - 1)]
200                              [(j).clamp(0, matrix[0].len() - 1)]
201                              == Xmas::S
202                          && matrix[(i).clamp(0, matrix.len() - 1)]
203                              [(j + 2).clamp(0, matrix[0].len() - 1)]
204                              == Xmas::M
205                          && matrix[(i - 2).clamp(0, matrix.len() - 1)]
206                              [(j + 2).clamp(0, matrix[0].len() - 1)]
207                              == Xmas::M
208                      {
209                          sum += 1;
210                      }
211                      if (0..matrix.len()).contains(&(i - 2))
212                          && (0..matrix[0].len()).contains(&(j + 2))
213                          && matrix[(i - 1).clamp(0, matrix.len() - 1)]
214                              [(j + 1).clamp(0, matrix[0].len() - 1)]
215                              == Xmas::A
216                          && matrix[(i - 2).clamp(0, matrix.len() - 1)]
217                              [(j).clamp(0, matrix[0].len() - 1)]
218                              == Xmas::M
219                          && matrix[(i).clamp(0, matrix.len() - 1)]
220                              [(j + 2).clamp(0, matrix[0].len() - 1)]
221                              == Xmas::S
222                          && matrix[(i - 2).clamp(0, matrix.len() - 1)]
223                              [(j + 2).clamp(0, matrix[0].len() - 1)]
224                              == Xmas::M
225                      {
226                          sum += 1;
227                      }
228                      if (0..matrix.len()).contains(&(i + 2))
229                          && (0..matrix[0].len()).contains(&(j + 2))
230                          && matrix[(i + 1).clamp(0, matrix.len() - 1)]
231                              [(j + 1).clamp(0, matrix[0].len() - 1)]
232                              == Xmas::A
233                          && matrix[(i + 2).clamp(0, matrix.len() - 1)]
234                              [(j).clamp(0, matrix[0].len() - 1)]
235                              == Xmas::S
236                          && matrix[(i).clamp(0, matrix.len() - 1)]
237                              [(j + 2).clamp(0, matrix[0].len() - 1)]
238                              == Xmas::M
239                          && matrix[(i + 2).clamp(0, matrix.len() - 1)]
240                              [(j + 2).clamp(0, matrix[0].len() - 1)]
241                              == Xmas::M
242                      {
243                          sum += 1;
244                      }
245                      if (0..matrix.len()).contains(&(i + 2))
246                          && (0..matrix[0].len()).contains(&(j + 2))
247                          && matrix[(i + 1).clamp(0, matrix.len() - 1)]
248                              [(j + 1).clamp(0, matrix[0].len() - 1)]
249                              == Xmas::A
250                          && matrix[(i + 2).clamp(0, matrix.len() - 1)]
251                              [(j).clamp(0, matrix[0].len() - 1)]
252                              == Xmas::M
253                          && matrix[(i).clamp(0, matrix.len() - 1)]
254                              [(j + 2).clamp(0, matrix[0].len() - 1)]
255                              == Xmas::S
256                          && matrix[(i + 2).clamp(0, matrix.len() - 1)]
257                              [(j + 2).clamp(0, matrix[0].len() - 1)]
258                              == Xmas::M
259                      {
260                          sum += 1;
261                      }
262                  }
263                  _ => (),
264              }
265          }
266      }
267      println!("Part 2 : {}", sum / 2);
268  }