From eb8565985fc6ac47aa053ce88e5ef2a9f12a907b Mon Sep 17 00:00:00 2001 From: nekineki Date: Mon, 4 Dec 2023 07:00:58 +0100 Subject: day04 --- 2023/day04.rs | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 2023/day04.rs (limited to '2023/day04.rs') diff --git a/2023/day04.rs b/2023/day04.rs new file mode 100644 index 0000000..0bed2c7 --- /dev/null +++ b/2023/day04.rs @@ -0,0 +1,65 @@ +#![allow(dead_code)] +#![allow(unused_variables)] +#![allow(unused_mut)] +use std::fs::File; +use std::io::Read; + +fn main() { + // let filename = "in/day04.ref"; + let filename = "in/day04.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: Vec<_> = content.trim_end().split('\n').collect(); + // println!("{:?}", lines); + + let mut res1 = 0; + + let mut counts: Vec = Vec::new(); + + for line in &lines { + let s1: Vec<&str> = line.split(":").collect(); + let game_num: u32 = s1[0] + .replace(" ", " ") + .replace(" ", " ") + .split(" ") + .collect::>()[1] + .parse() + .unwrap(); + let s2: Vec<&str> = s1[1].trim().split("|").collect::>(); + + let winning: Vec = s2[0] + .trim() + .replace(" ", " ") + .split(" ") + .map(|x| x.parse::().unwrap()) + .collect(); + let actual: Vec = s2[1] + .trim() + .replace(" ", " ") + .replace(" ", " ") + .split(" ") + .map(|x| x.parse::().unwrap()) + .collect(); + + let count: i32 = actual.iter().filter(|x| winning.contains(x)).count() as i32; + counts.push(count); + // println!("{}", count); + res1 += 1_i32.checked_shl((count - 1) as u32).unwrap_or(0); + } + let mut copies: Vec = vec![0; counts.len()]; + + for i in 0..counts.len() { + for j in i..i + counts[i] as usize { + copies[j + 1] += 1 + copies[i]; + } + } + + let res2 = copies.iter().sum::() + copies.len() as i32; + + println!("res1: {}", res1); + println!("res2: {}", res2); + assert_eq!(res1, 21919); + assert_eq!(res2, 9881048); +} -- cgit v1.2.3