Compare commits

..

2 Commits

Author SHA1 Message Date
86202a10e6
Added early abort if there are too many damaged springs in a row 2023-12-12 14:55:31 +01:00
250417760b
2023 - Day 12 2023-12-12 14:54:55 +01:00

View File

@ -1,5 +1,8 @@
#![feature(test)] #![feature(test)]
use std::{collections::{HashMap, hash_map::DefaultHasher}, hash::{Hash, Hasher}}; use std::{
collections::{hash_map::DefaultHasher, HashMap},
hash::{Hash, Hasher},
};
use anyhow::Result; use anyhow::Result;
use aoc::Solver; use aoc::Solver;
@ -76,7 +79,12 @@ impl std::fmt::Display for Spring {
} }
// The cache is optional as is slows down part1 by a lot // The cache is optional as is slows down part1 by a lot
fn count_valid(springs: &mut [Spring], list: &[usize], damaged_chain: usize, cache: &mut Option<&mut Cache>) -> usize { fn count_valid(
springs: &mut [Spring],
list: &[usize],
damaged_chain: usize,
cache: &mut Option<&mut Cache>,
) -> usize {
let hash = if let Some(cache) = cache { let hash = if let Some(cache) = cache {
// Calculate the hash manually, otherwise we end up with weird borrows or we have to clone // Calculate the hash manually, otherwise we end up with weird borrows or we have to clone
// (which is slow) // (which is slow)
@ -97,7 +105,12 @@ fn count_valid(springs: &mut [Spring], list: &[usize], damaged_chain: usize, cac
// We reached the end of the list, no further processing is possible // We reached the end of the list, no further processing is possible
let count = if list.is_empty() { let count = if list.is_empty() {
if springs.iter().filter(|&spring| spring == &Spring::Damaged).count() > 0 { if springs
.iter()
.filter(|&spring| spring == &Spring::Damaged)
.count()
> 0
{
// There are still damaged springs remaining // There are still damaged springs remaining
0 0
} else { } else {
@ -139,10 +152,15 @@ fn count_valid(springs: &mut [Spring], list: &[usize], damaged_chain: usize, cac
// Return the sum of both branches // Return the sum of both branches
a + b a + b
}, }
Spring::Damaged => { Spring::Damaged => {
if damaged_chain + 1 > list[0] {
// The chain is to long
0
} else {
// Add to the damaged chain // Add to the damaged chain
count_valid(&mut springs[1..], list, damaged_chain+1, cache) count_valid(&mut springs[1..], list, damaged_chain + 1, cache)
}
} }
} }
}; };
@ -194,10 +212,23 @@ impl aoc::Solver for Day {
.collect::<Vec<_>>(), .collect::<Vec<_>>(),
) )
}) })
.map(|(springs, list)| ( .map(|(springs, list)| {
[springs.clone(), vec![Spring::Unknown], springs.clone(), vec![Spring::Unknown], springs.clone(), vec![Spring::Unknown], springs.clone(), vec![Spring::Unknown], springs].concat(), (
[list.clone(), list.clone(), list.clone(), list.clone(), list].concat() [
)) springs.clone(),
vec![Spring::Unknown],
springs.clone(),
vec![Spring::Unknown],
springs.clone(),
vec![Spring::Unknown],
springs.clone(),
vec![Spring::Unknown],
springs,
]
.concat(),
[list.clone(), list.clone(), list.clone(), list.clone(), list].concat(),
)
})
.map(|(mut springs, list)| { .map(|(mut springs, list)| {
let mut cache = HashMap::new(); let mut cache = HashMap::new();
count_valid(&mut springs, &list, 0, &mut Some(&mut cache)) count_valid(&mut springs, &list, 0, &mut Some(&mut cache))