generated from janezicmatej/aoc-template
	
		
			
				
	
	
		
			82 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			82 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| 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)), Some(2));
 | |
|     }
 | |
|     #[test]
 | |
|     fn test_part_two() {
 | |
|         assert_eq!(part_two(&aoc::template::read_file("examples", 2)), Some(4));
 | |
|     }
 | |
| }
 |