generated from janezicmatej/aoc-template
solution: day 2
This commit is contained in:
parent
000000305b
commit
0000004082
|
@ -0,0 +1,6 @@
|
||||||
|
7 6 4 2 1
|
||||||
|
1 2 7 8 9
|
||||||
|
9 7 6 2 1
|
||||||
|
1 3 2 4 5
|
||||||
|
8 6 4 4 1
|
||||||
|
1 3 6 7 9
|
|
@ -0,0 +1,81 @@
|
||||||
|
use itertools::Itertools;
|
||||||
|
|
||||||
|
fn parse_input(input: &str) -> impl Iterator<Item = Vec<isize>> + '_ {
|
||||||
|
input.lines().map(|l| {
|
||||||
|
l.split(' ')
|
||||||
|
.filter_map(|x| x.parse::<isize>().ok())
|
||||||
|
.collect_vec()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
fn check_report(mut r: impl Iterator<Item = isize>) -> bool {
|
||||||
|
let mut low = 0;
|
||||||
|
let mut high = 0;
|
||||||
|
|
||||||
|
let mut prev = r.next().expect("Invalid input file?");
|
||||||
|
|
||||||
|
for n in r {
|
||||||
|
let diff = n - prev;
|
||||||
|
prev = n;
|
||||||
|
|
||||||
|
if diff == 0 {
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
|
||||||
|
if !(-3..=3).contains(&diff) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if diff > 0 {
|
||||||
|
high += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if diff < 0 {
|
||||||
|
low += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
!(low > 0 && high > 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn part_one(input: &str) -> Option<usize> {
|
||||||
|
parse_input(input)
|
||||||
|
.map(|r| check_report(r.into_iter()))
|
||||||
|
.filter(|&x| x)
|
||||||
|
.count()
|
||||||
|
.into()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn part_two(input: &str) -> Option<usize> {
|
||||||
|
Some(
|
||||||
|
parse_input(input)
|
||||||
|
.map(|r| {
|
||||||
|
(0..r.len()).any(|i| {
|
||||||
|
check_report(
|
||||||
|
// skip nth idx
|
||||||
|
r.iter()
|
||||||
|
.enumerate()
|
||||||
|
.filter(|&(j, _)| j != i)
|
||||||
|
.map(|(_, &v)| v),
|
||||||
|
)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
.filter(|x| *x)
|
||||||
|
.count(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
aoc::solution!(2);
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
#[test]
|
||||||
|
fn test_part_one() {
|
||||||
|
assert_eq!(part_one(&aoc::template::read_file("examples", 2)), None);
|
||||||
|
}
|
||||||
|
#[test]
|
||||||
|
fn test_part_two() {
|
||||||
|
assert_eq!(part_two(&aoc::template::read_file("examples", 2)), None);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue