Worked on optimizer
All checks were successful
Rust / build_and_test (push) Successful in 25s

This commit is contained in:
Lukas Wölfer
2025-07-27 18:50:38 +02:00
parent a52acc6daf
commit 56702053cf
4 changed files with 41 additions and 9 deletions

18
Cargo.lock generated
View File

@@ -5,3 +5,21 @@ version = 4
[[package]] [[package]]
name = "canvas" name = "canvas"
version = "0.1.0" version = "0.1.0"
dependencies = [
"itertools",
]
[[package]]
name = "either"
version = "1.15.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719"
[[package]]
name = "itertools"
version = "0.14.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285"
dependencies = [
"either",
]

View File

@@ -4,3 +4,4 @@ version = "0.1.0"
edition = "2024" edition = "2024"
[dependencies] [dependencies]
itertools = "0.14.0"

View File

@@ -69,17 +69,17 @@ impl IntoIterator for IconSet {
} }
impl Objective { impl Objective {
pub fn count_matches(&self, painting: &Painting) -> u8 { pub fn count_matches_bitfield(&self, bitfield: &IconBitfield) -> u8 {
match self { match self {
Objective::AllFields => { Objective::AllFields => {
if IconBitfield::from_painting(painting).all_fields() == 0b11111 { if bitfield.all_fields() == 0b11111 {
1 1
} else { } else {
0 0
} }
} }
Objective::IconsUsed(icons) => { Objective::IconsUsed(icons) => {
let bits = IconBitfield::from_painting(painting); let bits = bitfield;
if icons.into_iter().all(|i| bits.get_icon_bits(i) > 0) { if icons.into_iter().all(|i| bits.get_icon_bits(i) > 0) {
1 1
} else { } else {
@@ -87,7 +87,7 @@ impl Objective {
} }
} }
Objective::ExactlyNIcons((icons, count)) => { Objective::ExactlyNIcons((icons, count)) => {
let bits = IconBitfield::from_painting(painting); let bits = bitfield;
if icons if icons
.into_iter() .into_iter()
@@ -101,7 +101,7 @@ impl Objective {
} }
} }
Objective::NInARow(icon, count) => { Objective::NInARow(icon, count) => {
let mut bits = IconBitfield::from_painting(painting).get_icon_bits(*icon); let mut bits = bitfield.get_icon_bits(*icon);
let bitmask = (1 << count) - 1; let bitmask = (1 << count) - 1;
let mut res_count = 0; let mut res_count = 0;
while bits > 0 { while bits > 0 {
@@ -119,6 +119,10 @@ impl Objective {
_ => todo!(), _ => todo!(),
} }
} }
pub fn count_matches(&self, painting: &Painting) -> u8 {
self.count_matches_bitfield(&IconBitfield::from_painting(painting))
}
} }
#[cfg(test)] #[cfg(test)]

View File

@@ -1,5 +1,14 @@
// use crate::{CriteriaCard, icon_bitfield::IconBitfield}; use itertools::Itertools;
// fn draw_painting(cards: &[IconBitfield], obj: Vec<(&CriteriaCard, u8)>) -> [usize; 3] { use crate::{CriteriaCard, icon_bitfield::IconBitfield};
// todo!()
// } fn draw_painting(cards: &[IconBitfield], _obj: Vec<(&CriteriaCard, u8)>) -> [usize; 3] {
for stack in cards.iter().permutations(3) {
let stack: [&IconBitfield; 3] = stack.try_into().unwrap();
let mut painting = stack[0].clone();
painting.layer_below(stack[1]).layer_below(stack[2]);
// obj.iter()
// .map(|x| x.0.objective.count_matches_bitfield(&painting));
}
todo!()
}