generated from janezicmatej/aoc-template
solution: day 4
This commit is contained in:
parent
0000005019
commit
000000601e
|
@ -0,0 +1,10 @@
|
||||||
|
MMMSXXMASM
|
||||||
|
MSAMXMSMSA
|
||||||
|
AMXSXMAAMM
|
||||||
|
MSAMASMSMX
|
||||||
|
XMASAMXAMM
|
||||||
|
XXAMMXXAMA
|
||||||
|
SMSMSASXSS
|
||||||
|
SAXAMASAAA
|
||||||
|
MAMMMXMMMM
|
||||||
|
MXMXAXMASX
|
|
@ -0,0 +1,85 @@
|
||||||
|
use itertools::Itertools;
|
||||||
|
|
||||||
|
pub fn part_one(input: &str) -> Option<u32> {
|
||||||
|
let g = input.lines().map(|x| x.chars().collect_vec()).collect_vec();
|
||||||
|
|
||||||
|
#[rustfmt::skip]
|
||||||
|
let dirs = [
|
||||||
|
(1, 0), (1, 1), (0, 1), (-1, 1),
|
||||||
|
(-1, 0), (-1, -1), (0, -1), (1, -1),
|
||||||
|
];
|
||||||
|
let xmas = ['X', 'M', 'A', 'S'];
|
||||||
|
let mut count = 0;
|
||||||
|
|
||||||
|
for (i, row) in g.iter().enumerate() {
|
||||||
|
for (j, _) in row.iter().enumerate() {
|
||||||
|
for &(di, dj) in &dirs {
|
||||||
|
let found_xmas = (0..4).all(|x| {
|
||||||
|
let ni = i.wrapping_add((di * x) as usize);
|
||||||
|
let nj = j.wrapping_add((dj * x) as usize);
|
||||||
|
|
||||||
|
g.get(ni)
|
||||||
|
.and_then(|y| y.get(nj))
|
||||||
|
.copied()
|
||||||
|
.unwrap_or_default()
|
||||||
|
== xmas[x as usize]
|
||||||
|
});
|
||||||
|
|
||||||
|
if found_xmas {
|
||||||
|
count += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
count.into()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn part_two(input: &str) -> Option<u32> {
|
||||||
|
let g = input.lines().map(|x| x.chars().collect_vec()).collect_vec();
|
||||||
|
|
||||||
|
let dirs = [[(-1, -1), (0, 0), (1, 1)], [(1, -1), (0, 0), (-1, 1)]];
|
||||||
|
let x_mas = [['M', 'A', 'S'], ['S', 'A', 'M']];
|
||||||
|
let mut count = 0;
|
||||||
|
|
||||||
|
for (i, row) in g.iter().enumerate() {
|
||||||
|
for (j, _) in row.iter().enumerate() {
|
||||||
|
let found_x_mas = dirs.iter().all(|d| {
|
||||||
|
let s = d.iter().map(|&(di, dj)| {
|
||||||
|
let ni = i.wrapping_add(di as usize);
|
||||||
|
let nj = j.wrapping_add(dj as usize);
|
||||||
|
|
||||||
|
g.get(ni)
|
||||||
|
.and_then(|y| y.get(nj))
|
||||||
|
.copied()
|
||||||
|
.unwrap_or_default()
|
||||||
|
});
|
||||||
|
|
||||||
|
x_mas
|
||||||
|
.iter()
|
||||||
|
.any(|x| x.iter().copied().zip(s.clone()).all(|(a, b)| a == b))
|
||||||
|
});
|
||||||
|
|
||||||
|
if found_x_mas {
|
||||||
|
count += 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
count.into()
|
||||||
|
}
|
||||||
|
|
||||||
|
aoc::solution!(4);
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
#[test]
|
||||||
|
fn test_part_one() {
|
||||||
|
assert_eq!(part_one(&aoc::template::read_file("examples", 4)), Some(18));
|
||||||
|
}
|
||||||
|
#[test]
|
||||||
|
fn test_part_two() {
|
||||||
|
assert_eq!(part_two(&aoc::template::read_file("examples", 4)), Some(9));
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue