ok i'm going to remove the hashset

This commit is contained in:
mehbark 2026-07-07 21:10:08 -04:00
parent d3f89edddf
commit 7cbaf40d44

View file

@ -35,7 +35,7 @@ fn solve(dictionary: &mut [(String, LetterSet)], target: LetterSet) -> (u8, Hash
println!("allocated!"); println!("allocated!");
bests[LetterSet::FULL.to_index()] = (0, HashSet::new()); bests[LetterSet::FULL.to_index()] = (0, HashSet::new());
score(dictionary, &mut bests, LetterSet::EMPTY, 0); score(dictionary, &mut bests, target.negation(), 0);
bests[target.negation().to_index()].clone() bests[target.negation().to_index()].clone()
} }
@ -51,33 +51,31 @@ fn score(
done_letters: LetterSet, done_letters: LetterSet,
length: u8, length: u8,
) -> u8 { ) -> u8 {
assert!(length <= MAX_SOLUTION_LENGTH); if length > MAX_SOLUTION_LENGTH {
return u8::MAX;
}
let known = bests[done_letters.to_index()].0; let known = bests[done_letters.to_index()].0;
if known < u8::MAX { if known < u8::MAX {
return known; return known;
} }
for (i, (word, ls)) in dictionary let Some((word, ls, score)) = dictionary
.iter() .iter()
.enumerate() .filter(|(_, ls)| !ls.difference(done_letters).is_empty())
.filter(|(_, (_, ls))| !ls.difference(done_letters).is_empty()) .map(|(word, ls)| {
{ let word_len = u8::try_from(word.len()).unwrap();
let keep_letters = done_letters.union(*ls); let new_length = word_len.saturating_add(length);
let keep_length = length.saturating_add(u8::try_from(word.len()).unwrap()); let rest_score = score(dictionary, bests, done_letters.union(*ls), new_length);
(word, ls, word_len.saturating_add(rest_score))
})
.min_by_key(|(_, _, score)| *score)
else {
return u8::MAX;
};
if keep_length > MAX_SOLUTION_LENGTH { bests[done_letters.to_index()].0 = score;
continue; bests[done_letters.to_index()].1 = bests[done_letters.union(*ls).to_index()].1.clone();
}
let keep = score(dictionary, bests, keep_letters, keep_length);
let existing = bests[done_letters.to_index()].0;
if keep < existing {
bests[done_letters.to_index()].0 = keep;
bests[done_letters.to_index()].1.insert(word.clone()); bests[done_letters.to_index()].1.insert(word.clone());
} score
}
bests[done_letters.to_index()].0
} }