summaryrefslogtreecommitdiff
path: root/2023
diff options
context:
space:
mode:
authornekineki <nekineki@nekineki.net>2023-12-04 09:52:23 +0100
committernekineki <nekineki@nekineki.net>2023-12-04 10:43:17 +0100
commit81cbc23069bdee7af154057c8b7fd2fae3223bf0 (patch)
tree0c4f00d475b773ce419f8680d043eb1786a76689 /2023
parenteb8565985fc6ac47aa053ce88e5ef2a9f12a907b (diff)
improve day04
Diffstat (limited to '2023')
-rw-r--r--2023/day04.rs51
1 files changed, 19 insertions, 32 deletions
diff --git a/2023/day04.rs b/2023/day04.rs
index 0bed2c7..2f29934 100644
--- a/2023/day04.rs
+++ b/2023/day04.rs
@@ -16,47 +16,34 @@ fn main() {
let mut res1 = 0;
- let mut counts: Vec<i32> = Vec::new();
+ let mut copies = vec![1; lines.len()];
- 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>>();
+ for (i, line) in lines.into_iter().enumerate() {
+ let nows = line.split_whitespace().collect::<Vec<_>>().join(" ");
+ let (first, rest) = line.split_once(": ").unwrap();
- let winning: Vec<u32> = s2[0]
- .trim()
- .replace(" ", " ")
- .split(" ")
+ let game_num = first.split_once(" ").unwrap().1;
+ let (win, actual) = rest.split_once(" | ").unwrap();
+ let win = win
+ .split_whitespace()
.map(|x| x.parse::<u32>().unwrap())
- .collect();
- let actual: Vec<u32> = s2[1]
- .trim()
- .replace(" ", " ")
- .replace(" ", " ")
- .split(" ")
+ .collect::<Vec<_>>();
+ let actual = actual
+ .split_whitespace()
.map(|x| x.parse::<u32>().unwrap())
- .collect();
+ .collect::<Vec<_>>();
- 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()];
+ let count = actual.iter().filter(|x| win.contains(x)).count();
+ if count > 0 {
+ res1 += 1 << (count - 1);
+ }
- for i in 0..counts.len() {
- for j in i..i + counts[i] as usize {
- copies[j + 1] += 1 + copies[i];
+ for j in i..i + count {
+ copies[j + 1] += copies[i];
}
}
- let res2 = copies.iter().sum::<i32>() + copies.len() as i32;
+ let res2: u32 = copies.iter().sum();
println!("res1: {}", res1);
println!("res2: {}", res2);