Skip to content

Commit 111da38

Browse files
committed
4th day
1 parent 8babbd0 commit 111da38

File tree

2 files changed

+105
-0
lines changed

2 files changed

+105
-0
lines changed

data/examples/04.txt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
MMMSXXMASM
2+
MSAMXMSMSA
3+
AMXSXMAAMM
4+
MSAMASMSMX
5+
XMASAMXAMM
6+
XXAMMXXAMA
7+
SMSMSASXSS
8+
SAXAMASAAA
9+
MAMMMXMMMM
10+
MXMXAXMASX

src/bin/04.rs

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
advent_of_code::solution!(4);
2+
3+
use advent_of_code::maneatingape::grid::*;
4+
use advent_of_code::maneatingape::point::*;
5+
6+
fn parse_data(input: &str) -> Grid<u8> {
7+
Grid::parse(input)
8+
}
9+
10+
pub fn part_one(input: &str) -> Option<u32> {
11+
let data = parse_data(input);
12+
13+
const MAS: [u8; 3] = [b'M', b'A', b'S'];
14+
15+
let validate = |x, y, dx, dy| -> bool {
16+
if !data.contains(Point::new(x + 3 * dx, y + 3 * dy)) {
17+
return false;
18+
}
19+
20+
let a = [
21+
data[Point::new(x + dx, y + dy)],
22+
data[Point::new(x + 2 * dx, y + 2 * dy)],
23+
data[Point::new(x + 3 * dx, y + 3 * dy)],
24+
];
25+
26+
a == MAS
27+
};
28+
29+
let mut result = 0;
30+
for x in 0..data.width {
31+
for y in 0..data.height {
32+
if data[Point::new(x, y)] == b'X' {
33+
result += if validate(x, y, 1, 0) { 1 } else { 0 };
34+
result += if validate(x, y, -1, 0) { 1 } else { 0 };
35+
result += if validate(x, y, 0, 1) { 1 } else { 0 };
36+
result += if validate(x, y, 0, -1) { 1 } else { 0 };
37+
38+
result += if validate(x, y, 1, 1) { 1 } else { 0 };
39+
result += if validate(x, y, 1, -1) { 1 } else { 0 };
40+
result += if validate(x, y, -1, 1) { 1 } else { 0 };
41+
result += if validate(x, y, -1, -1) { 1 } else { 0 };
42+
}
43+
}
44+
}
45+
46+
Some(result)
47+
}
48+
49+
pub fn part_two(input: &str) -> Option<u32> {
50+
let data = parse_data(input);
51+
52+
const MAS_LIST: [[u8; 4]; 4] = [
53+
[b'M', b'M', b'S', b'S'],
54+
[b'M', b'S', b'M', b'S'],
55+
[b'S', b'S', b'M', b'M'],
56+
[b'S', b'M', b'S', b'M'],
57+
];
58+
59+
let mut result = 0;
60+
for x in 1..data.width - 1 {
61+
for y in 1..data.height - 1 {
62+
if data[Point::new(x, y)] == b'A' {
63+
let a = [
64+
data[Point::new(x - 1, y + 1)],
65+
data[Point::new(x + 1, y + 1)],
66+
data[Point::new(x - 1, y - 1)],
67+
data[Point::new(x + 1, y - 1)],
68+
];
69+
70+
if MAS_LIST.contains(&a) {
71+
result += 1;
72+
}
73+
}
74+
}
75+
}
76+
77+
Some(result)
78+
}
79+
80+
#[cfg(test)]
81+
mod tests {
82+
use super::*;
83+
84+
#[test]
85+
fn test_part_one() {
86+
let result = part_one(&advent_of_code::template::read_file("examples", DAY));
87+
assert_eq!(result, Some(18));
88+
}
89+
90+
#[test]
91+
fn test_part_two() {
92+
let result = part_two(&advent_of_code::template::read_file("examples", DAY));
93+
assert_eq!(result, Some(9));
94+
}
95+
}

0 commit comments

Comments
 (0)