summaryrefslogtreecommitdiff
path: root/2024
diff options
context:
space:
mode:
authornekineki <nekineki@nekineki.net>2024-12-04 07:58:06 +0100
committernekineki <nekineki@nekineki.net>2024-12-04 11:30:19 +0100
commitfa61f6a8bb17466820321cb59c3dede1e6941377 (patch)
treebad3060cc89ca5670bbd4eab754198c60c84520f /2024
parent69d80309cdf5ae70d3f0f72b3d10704352381a45 (diff)
improve day04
Diffstat (limited to '2024')
-rw-r--r--2024/day04.rs115
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);