diff options
| author | nekineki <nekineki@nekineki.net> | 2023-12-04 09:52:23 +0100 |
|---|---|---|
| committer | nekineki <nekineki@nekineki.net> | 2023-12-04 10:43:17 +0100 |
| commit | 81cbc23069bdee7af154057c8b7fd2fae3223bf0 (patch) | |
| tree | 0c4f00d475b773ce419f8680d043eb1786a76689 /2023 | |
| parent | eb8565985fc6ac47aa053ce88e5ef2a9f12a907b (diff) | |
improve day04
Diffstat (limited to '2023')
| -rw-r--r-- | 2023/day04.rs | 51 |
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); |
