summaryrefslogtreecommitdiff
path: root/2023/day04.rs
diff options
context:
space:
mode:
Diffstat (limited to '2023/day04.rs')
-rw-r--r--2023/day04.rs65
1 files changed, 65 insertions, 0 deletions
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<i32> = Vec::new();
+
+ for line in &lines {
+ let s1: Vec<&str> = line.split(":").collect();
+ let game_num: u32 = s1[0]
+ .replace(" ", " ")
+ .replace(" ", " ")
+ .split(" ")
+ .collect::<Vec<&str>>()[1]
+ .parse()
+ .unwrap();
+ let s2: Vec<&str> = s1[1].trim().split("|").collect::<Vec<&str>>();
+
+ let winning: Vec<u32> = s2[0]
+ .trim()
+ .replace(" ", " ")
+ .split(" ")
+ .map(|x| x.parse::<u32>().unwrap())
+ .collect();
+ let actual: Vec<u32> = s2[1]
+ .trim()
+ .replace(" ", " ")
+ .replace(" ", " ")
+ .split(" ")
+ .map(|x| x.parse::<u32>().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<i32> = 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::<i32>() + copies.len() as i32;
+
+ println!("res1: {}", res1);
+ println!("res2: {}", res2);
+ assert_eq!(res1, 21919);
+ assert_eq!(res2, 9881048);
+}