diff --git a/.gitignore b/.gitignore index 00d9c72..3fad632 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ *.in *.ex* +day?? diff --git a/day04.rs b/day04.rs new file mode 100644 index 0000000..0510664 --- /dev/null +++ b/day04.rs @@ -0,0 +1,42 @@ +use std::collections::HashSet; +use std::io::{self, BufRead}; + +fn main() { + // Part 1 + let mut part1 = 0; + let cards: Vec = io::stdin() + .lock() + .lines() + .map(|line| { + let line = line.unwrap(); + let (_, card) = line.split_once(": ").unwrap(); + let (winning, owned) = card.split_once(" | ").unwrap(); + + let winning: HashSet = winning + .split_whitespace() + .flat_map(str::parse) + .collect(); + + let owned: HashSet = owned + .split_whitespace() + .flat_map(str::parse) + .collect(); + + let count = winning.intersection(&owned).count(); + + part1 += 1 << (count - 1); + count + }) + .collect(); + + // Part 2 + let mut dp = vec![1; cards.len()]; + let part2: i32 = (0..cards.len()) + .map(|i| { + dp[i] += dp[i - cards[cards.len() - i - 1]..i].iter().sum::(); + dp[i] + }) + .sum(); + + println!("{} {}", part1, part2); +}