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 }