generated from janezicmatej/aoc-template
	solution: day 9
This commit is contained in:
		
							
								
								
									
										3
									
								
								data/examples/09.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								data/examples/09.txt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,3 @@
 | 
			
		||||
0 3 6 9 12 15
 | 
			
		||||
1 3 6 10 15 21
 | 
			
		||||
10 13 16 21 30 45
 | 
			
		||||
							
								
								
									
										87
									
								
								src/bin/09.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										87
									
								
								src/bin/09.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,87 @@
 | 
			
		||||
use std::collections::VecDeque;
 | 
			
		||||
 | 
			
		||||
fn find_history(v: VecDeque<i32>) -> VecDeque<VecDeque<i32>> {
 | 
			
		||||
    let mut s = VecDeque::new();
 | 
			
		||||
    s.push_back(v);
 | 
			
		||||
 | 
			
		||||
    loop {
 | 
			
		||||
        let mut all_zeros = true;
 | 
			
		||||
 | 
			
		||||
        let last = s.back().unwrap();
 | 
			
		||||
        let mut new = VecDeque::new();
 | 
			
		||||
        for i in 0..(last.len() - 1) {
 | 
			
		||||
            let diff = last[i + 1] - last[i];
 | 
			
		||||
            if diff != 0 {
 | 
			
		||||
                all_zeros = false;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            new.push_back(diff);
 | 
			
		||||
        }
 | 
			
		||||
        s.push_back(new);
 | 
			
		||||
 | 
			
		||||
        if all_zeros {
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    s
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn extrapolate_forward(v: VecDeque<i32>) -> i32 {
 | 
			
		||||
    let mut s = find_history(v);
 | 
			
		||||
 | 
			
		||||
    for i in (1..s.len()).rev() {
 | 
			
		||||
        let adder = *s[i].back().unwrap();
 | 
			
		||||
        let last = *s[i - 1].back().unwrap();
 | 
			
		||||
        s[i - 1].push_back(last + adder);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    *s[0].back().unwrap()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn extrapolate_back(v: VecDeque<i32>) -> i32 {
 | 
			
		||||
    let mut s = find_history(v);
 | 
			
		||||
 | 
			
		||||
    for i in (1..s.len()).rev() {
 | 
			
		||||
        let adder = *s[i].front().unwrap();
 | 
			
		||||
        let first = *s[i - 1].front().unwrap();
 | 
			
		||||
        s[i - 1].push_front(first - adder);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    *s[0].front().unwrap()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub fn part_one(input: &str) -> Option<i32> {
 | 
			
		||||
    Some(
 | 
			
		||||
        input
 | 
			
		||||
            .lines()
 | 
			
		||||
            .map(|x| x.split(' ').filter_map(|y| y.parse().ok()).collect())
 | 
			
		||||
            .map(extrapolate_forward)
 | 
			
		||||
            .sum(),
 | 
			
		||||
    )
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub fn part_two(input: &str) -> Option<i32> {
 | 
			
		||||
    Some(
 | 
			
		||||
        input
 | 
			
		||||
            .lines()
 | 
			
		||||
            .map(|x| x.split(' ').filter_map(|y| y.parse().ok()).collect())
 | 
			
		||||
            .map(extrapolate_back)
 | 
			
		||||
            .sum(),
 | 
			
		||||
    )
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
aoc::solution!(9);
 | 
			
		||||
 | 
			
		||||
#[cfg(test)]
 | 
			
		||||
mod tests {
 | 
			
		||||
    use super::*;
 | 
			
		||||
    #[test]
 | 
			
		||||
    fn test_part_one() {
 | 
			
		||||
        assert_eq!(part_one(&aoc::template::read_file("examples", 9)), None);
 | 
			
		||||
    }
 | 
			
		||||
    #[test]
 | 
			
		||||
    fn test_part_two() {
 | 
			
		||||
        assert_eq!(part_two(&aoc::template::read_file("examples", 9)), None);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user