diff options
Diffstat (limited to '2024/day01.rs')
| -rw-r--r-- | 2024/day01.rs | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/2024/day01.rs b/2024/day01.rs new file mode 100644 index 0000000..6f9251e --- /dev/null +++ b/2024/day01.rs @@ -0,0 +1,48 @@ +#![allow(dead_code)] +#![allow(unused_variables)] +#![allow(unused_mut)] +use std::env; +use std::fs::File; +use std::io::Read; + +fn main() { + let args: Vec<String> = env::args().collect(); + let filename = if args.len() == 1 { + "in/".to_owned() + args[0].split('/').last().unwrap() + ".pzl" + } else { + args[1].clone() + }; + 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"); + + let mut va: Vec<i32> = Vec::new(); + let mut vb: Vec<i32> = Vec::new(); + for line in lines { + let (a, b) = line.split_once(" ").unwrap(); + va.push(a.parse().unwrap()); + vb.push(b.parse().unwrap()); + //println!("{} {}", l, r); + } + + let mut vas = va.clone(); + let mut vbs = vb.clone(); + vas.sort(); + vbs.sort(); + let res1 = vas + .iter() + .zip(vbs.iter()) + .map(|(a, b)| (a - b).abs()) + .fold(0, |a, b| a + b); + + let res2 = va + .iter() + .map(|a| *a * (vb.iter().filter(move |b| *b == a).collect::<Vec<_>>().len() as i32)) + .fold(0, |a, b| a + b); + + println!("res1: {}", res1); + println!("res2: {:?}", res2); + assert_eq!(res1, 2970687); + assert_eq!(res2, 23963899); +} |
