-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathday04.rs
61 lines (55 loc) · 1.43 KB
/
day04.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
use std::collections::HashMap;
use rust_aoc_util::print_day;
#[rustfmt::skip]
fn dirs() -> impl Iterator<Item = (isize, isize)> {
[ (1, 0), (0, 1), (-1, 0), (0, -1), (-1, -1), (1, 1), (-1, 1), (1, -1) ].into_iter()
}
#[rustfmt::skip]
fn star() -> impl Iterator<Item = (isize, isize)> {
[ (1, -1), (1, 1), (0, 0), (-1, -1), (-1, 1) ].into_iter()
}
fn one(grid: &HashMap<(isize, isize), char>) -> usize {
grid.keys().fold(0, |acc, (x, y)| {
acc
+ dirs()
.filter(|(dx, dy)| {
"XMAS"
== (0..=3)
.flat_map(|i| grid.get(&(x + i * dx, y + i * dy)))
.collect::<String>()
})
.count()
})
}
fn two(grid: &HashMap<(isize, isize), char>) -> usize {
grid
.keys()
.filter(|(x, y)| {
["MSAMS", "SSAMM", "MMASS", "SMASM"]
.map(String::from)
.contains(
&star()
.flat_map(|(dx, dy)| grid.get(&(x + dx, y + dy)))
.collect::<String>(),
)
})
.count()
}
fn main() {
let inp: HashMap<(isize, isize), char> = std::fs::read_to_string("../inputs/day04.txt")
.unwrap()
.lines()
.enumerate()
.flat_map(|(i, l)| {
l.chars()
.enumerate()
.map(|(j, c)| ((i as isize, j as isize), c))
.collect::<Vec<((isize, isize), char)>>()
})
.collect();
let one = one(&inp);
let two = two(&inp);
assert!(one == 2493);
assert!(two == 1890);
print_day(4, (one, two));
}