Day 4 part 2 brute force

This commit is contained in:
Daniel Flanagan 2023-12-09 11:34:19 -06:00
parent 02e78aea8f
commit 99b0fd06be
Signed by: lytedev
GPG key ID: 5B2020A0F9921EF4

View file

@ -9,7 +9,10 @@ use nom::{
sequence::tuple,
IResult,
};
use std::{collections::HashSet, iter::FromIterator};
use std::{
collections::{HashMap, HashSet},
iter::FromIterator,
};
use crate::prelude::*;
@ -25,11 +28,14 @@ struct Card {
}
impl Card {
fn num_winning(&self) -> usize {
self.has.iter().filter(|n| self.winning.contains(n)).count() as usize
}
fn points(&self) -> usize {
let num_winning = self.has.iter().filter(|n| self.winning.contains(n)).count() as u32;
println!("{self:?} num_winning -> {num_winning}");
if num_winning >= 1 {
2_u64.pow(num_winning - 1) as usize
let n = self.num_winning();
if n >= 1 {
2_u64.pow((n - 1) as u32) as usize
} else {
0
}
@ -60,7 +66,27 @@ impl AoCSolution for Day4 {
}
fn part2(input: Self::Input) -> Self::Solution {
0
let mut result = 0;
let mut copies: HashMap<usize, usize> = HashMap::new();
input.lines().for_each(|s| {
let card = card(s).unwrap().1;
println!("{}, cur result: {}", card.id, result);
let mut num_copies = 1;
if let Some(extra_copies) = copies.get(&card.id) {
num_copies += extra_copies;
}
for _ in 1..=num_copies {
for i in card.id..=(card.id + card.num_winning()) {
if let Some(n) = copies.get_mut(&i) {
*n += 1;
} else {
copies.insert(i, 1);
}
}
}
result += num_copies
});
result
}
}
@ -78,6 +104,6 @@ Card 5: 87 83 26 28 32 | 88 30 70 12 93 22 82 36
Card 6: 31 18 13 56 72 | 74 77 10 23 35 67 36 11"#;
println!("input:\n{input}");
assert_eq!(Day4::part1(input.into()), 13);
assert_eq!(Day4::part2(input.into()), 0);
assert_eq!(Day4::part2(input.into()), 30);
}
}