diff options
| author | nekineki <nekineki@nekineki.net> | 2024-12-04 07:58:06 +0100 |
|---|---|---|
| committer | nekineki <nekineki@nekineki.net> | 2024-12-04 11:30:19 +0100 |
| commit | fa61f6a8bb17466820321cb59c3dede1e6941377 (patch) | |
| tree | bad3060cc89ca5670bbd4eab754198c60c84520f /2024 | |
| parent | 69d80309cdf5ae70d3f0f72b3d10704352381a45 (diff) | |
improve day04
Diffstat (limited to '2024')
| -rw-r--r-- | 2024/day04.rs | 115 |
1 files changed, 34 insertions, 81 deletions
diff --git a/2024/day04.rs b/2024/day04.rs index f4dc88f..67f18b9 100644 --- a/2024/day04.rs +++ b/2024/day04.rs @@ -1,77 +1,23 @@ #![allow(dead_code)] #![allow(unused_variables)] #![allow(unused_mut)] +use itertools::Itertools; +use std::cmp::max; use std::env; use std::fs::File; use std::io::Read; -fn horizontal(lx: usize, ly: usize, m: &Vec<Vec<char>>) -> usize { +fn xmas(s: &[char], xy: &[(usize, usize)], m: &Vec<Vec<char>>) -> usize { let mut count = 0; - for y in 0..ly { - for x in 0..lx - 3 { - if m[y][x] == 'X' && m[y][x + 1] == 'M' && m[y][x + 2] == 'A' && m[y][x + 3] == 'S' { - count += 1; - } - if m[y][x] == 'S' && m[y][x + 1] == 'A' && m[y][x + 2] == 'M' && m[y][x + 3] == 'X' { - count += 1; - } - } - } - count -} - -fn vertical(lx: usize, ly: usize, m: &Vec<Vec<char>>) -> usize { - let mut count = 0; - for y in 0..ly - 3 { - for x in 0..lx { - if m[y][x] == 'X' && m[y + 1][x] == 'M' && m[y + 2][x] == 'A' && m[y + 3][x] == 'S' { - count += 1; - } - if m[y][x] == 'S' && m[y + 1][x] == 'A' && m[y + 2][x] == 'M' && m[y + 3][x] == 'X' { - count += 1; - } - } - } - count -} - -fn diag1(lx: usize, ly: usize, m: &Vec<Vec<char>>) -> usize { - let mut count = 0; - for y in 0..ly - 3 { - for x in 0..lx - 3 { - if m[y][x] == 'X' - && m[y + 1][x + 1] == 'M' - && m[y + 2][x + 2] == 'A' - && m[y + 3][x + 3] == 'S' - { - count += 1; - } - if m[y][x] == 'S' - && m[y + 1][x + 1] == 'A' - && m[y + 2][x + 2] == 'M' - && m[y + 3][x + 3] == 'X' - { - count += 1; - } - } - } - count -} -fn diag2(lx: usize, ly: usize, m: &Vec<Vec<char>>) -> usize { - let mut count = 0; - for y in 0..ly - 3 { - for x in 0..lx - 3 { - if m[y][x + 3] == 'X' - && m[y + 1][x + 2] == 'M' - && m[y + 2][x + 1] == 'A' - && m[y + 3][x] == 'S' - { - count += 1; - } - if m[y][x + 3] == 'S' - && m[y + 1][x + 2] == 'A' - && m[y + 2][x + 1] == 'M' - && m[y + 3][x] == 'X' + let mx: usize = xy.iter().fold(0, |a, (x, y)| max(a, *x)); + let my: usize = xy.iter().fold(0, |a, (x, y)| max(a, *y)); + for r in 0..m.len() - my { + for c in 0..m[0].len() - mx { + if xy + .iter() + .enumerate() + .map(|(n, (x, y))| m[r + y][c + x] == s[n]) + .all(|a| a) { count += 1; } @@ -80,10 +26,10 @@ fn diag2(lx: usize, ly: usize, m: &Vec<Vec<char>>) -> usize { count } -fn mas(lx: usize, ly: usize, m: &Vec<Vec<char>>) -> usize { +fn cross_mas(m: &Vec<Vec<char>>) -> usize { let mut count = 0; - for y in 1..ly - 1 { - for x in 1..lx - 1 { + for y in 1..m.len() - 1 { + for x in 1..m[0].len() - 1 { if m[y][x] != 'A' { continue; } @@ -93,12 +39,13 @@ fn mas(lx: usize, ly: usize, m: &Vec<Vec<char>>) -> usize { m[y + 1][x + 1], m[y + 1][x - 1], ]; - if a == ['M', 'M', 'S', 'S'] - || a == ['S', 'M', 'M', 'S'] - || a == ['S', 'S', 'M', 'M'] - || a == ['M', 'S', 'S', 'M'] - { - count += 1; + let mut m = ['M', 'M', 'S', 'S']; + for r in 0..4 { + if a == m { + count += 1; + break; + } + m.rotate_right(1); } } } @@ -130,13 +77,19 @@ fn main() { let ly = m.len(); let lx = m[0].len(); - let mut res1 = 0; - res1 += horizontal(lx, ly, &m); - res1 += vertical(lx, ly, &m); - res1 += diag1(lx, ly, &m); - res1 += diag2(lx, ly, &m); + let s: Vec<char> = "XMAS".chars().collect(); + let sr: Vec<char> = s.clone().into_iter().rev().collect(); + let horiz: [(usize, usize); 4] = [(0, 0), (1, 0), (2, 0), (3, 0)]; + let vert: [(usize, usize); 4] = [(0, 0), (0, 1), (0, 2), (0, 3)]; + let diag1: [(usize, usize); 4] = [(0, 0), (1, 1), (2, 2), (3, 3)]; + let diag2: [(usize, usize); 4] = [(3, 0), (2, 1), (1, 2), (0, 3)]; + let res1: usize = [s, sr] + .into_iter() + .cartesian_product([horiz, vert, diag1, diag2].into_iter()) + .map(|(s, d)| xmas(&s, &d, &m)) + .sum(); - let res2 = mas(lx, ly, &m); + let res2 = cross_mas(&m); println!("res1: {}", res1); println!("res2: {}", res2); |
