diff options
Diffstat (limited to '2023/day09.rs')
| -rw-r--r-- | 2023/day09.rs | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/2023/day09.rs b/2023/day09.rs new file mode 100644 index 0000000..68037d5 --- /dev/null +++ b/2023/day09.rs @@ -0,0 +1,57 @@ +use std::fs::File; +use std::io::Read; + +fn diff(arr: &Vec<i64>) -> Vec<i64> { + arr.iter() + .zip(arr.iter().skip(1)) + .map(|(x, y)| y - x) + .collect() +} + +fn main() { + // let filename = "in/day09.ref"; + let filename = "in/day09.pzl"; + + let mut f = File::open(filename).expect("cannot open file"); + let mut content = String::new(); + f.read_to_string(&mut content).expect("cannot read file"); + let lines = content.trim_end().split('\n'); + // println!("{:?}", lines); + + let mut inp: Vec<Vec<i64>> = Vec::new(); + for line in lines { + let l: Vec<i64> = line.split(' ').map(|x| x.parse().unwrap()).collect(); + inp.push(l); + } + + let mut res1 = 0; + let mut res2 = 0; + + for nums in inp.iter() { + let mut desc: Vec<Vec<i64>> = Vec::new(); + desc.push(nums.clone()); + let mut d = diff(&nums); + desc.push(d.clone()); + while d.iter().filter(|x| **x != 0).collect::<Vec<_>>().len() != 0 { + d = diff(&d); + desc.push(d.clone()); + } + + let mut a: i64 = *desc[desc.len() - 2].last().unwrap(); + for i in 0..desc.len() - 2 { + a = *desc[desc.len() - 3 - i].last().unwrap() + a; + } + res1 += a; + + let mut b: i64 = desc[desc.len() - 2][0]; + for i in 0..desc.len() - 2 { + b = desc[desc.len() - 3 - i][0] - b; + } + res2 += b; + } + + println!("res1: {}", res1); + println!("res2: {}", res2); + assert_eq!(res1, 1938800261); + assert_eq!(res2, 1112); +} |
