Browse Source

feat: mirror quantity verification

master
Dnomd343 1 month ago
parent
commit
4feae089ea
  1. 10
      src/core/group/internal/group.cc
  2. 1
      src/core/main.cc
  3. 50
      verify/mirror.py

10
src/core/group/internal/group.cc

@ -51,6 +51,8 @@ KLSK_NOINLINE static RangesUnion group_extend(RawCode seed, const size_t reserve
core.next_cases(curr, cases.find(curr)->second);
}
std::cout << std::format("[{}, {}, {}]\n", codes.size(), mirrors.size(), cases.size());
// std::cout << std::format("{:.5f}\n", static_cast<double>(codes.size()) / reserve);
RangesUnion result {};
@ -86,9 +88,10 @@ static RangesUnion extend_type_ver(RawCode seed, size_t reserve) {
static RangesUnion extend_type_diag(RawCode seed, size_t reserve) {
return group_extend(seed, reserve, [](const RawCode code, auto callback) {
if (const auto mirror = code.to_diagonal_mirror(); mirror != code) {
callback(mirror);
}
// if (const auto mirror = code.to_diagonal_mirror(); mirror != code) {
// callback(mirror);
// }
callback(code.to_diagonal_mirror());
});
}
@ -105,6 +108,7 @@ static RangesUnion extend_type_x(RawCode seed, size_t reserve) {
RangesUnion Group::cases() const {
if (const auto gu = GroupUnion::unsafe_create(type_id()); gu.group_num() == 1) {
std::cout << "[]" << std::endl;
return gu.cases();
}

1
src/core/main.cc

@ -68,6 +68,7 @@ int main() {
// if (group.mirror_type() == Group::MirrorType::Full) {
// if (group.mirror_type() == Group::MirrorType::Ordinary) {
// std::cout << std::format("{} ({})\n", group.to_string(), group.size());
std::cout << std::format("{}: ", group.to_string());
volatile auto kk = group.cases();
// std::cout << group.size() << std::endl;
// }

50
verify/mirror.py

@ -0,0 +1,50 @@
#!/usr/bin/env python3
import yaml
from functools import cache
from klotski import Group, GroupUnion
def load_data(path: str) -> dict[str, list[int]]:
raw = yaml.safe_load(open(path).read())
return {x: y for x, y in raw.items() if len(y)}
@cache
def klotski_groups() -> dict[str, Group]:
groups = []
for type_id in range(203):
groups.extend(GroupUnion(type_id).groups())
return {str(x): x for x in groups}
def verify_group(name: str, num_1: int, num_2: int, num_3: int) -> None:
group = klotski_groups()[name]
assert num_1 + num_2 == num_3
assert num_3 == group.size
is_v_mirror = group.is_vertical_mirror
is_h_mirror = group.is_horizontal_mirror
is_d_mirror = str(group) == str(group.to_vertical_mirror().to_horizontal_mirror())
if is_v_mirror and is_h_mirror: # full mirror
h_mirrors = [x for x in list(group.cases()) if x.is_horizontal_mirror]
assert num_1 * 4 - len(h_mirrors) == num_3
elif is_h_mirror: # horizontal mirror
h_mirrors = [x for x in list(group.cases()) if x.is_horizontal_mirror]
assert num_1 - num_2 == len(h_mirrors)
elif is_v_mirror: # vertical mirror
assert num_1 == num_2
elif is_d_mirror: # diagonal mirror
assert num_1 == num_2
else: # non-mirror
assert num_2 == 0
if __name__ == '__main__':
data = load_data('raw.yaml')
[verify_group(x, *y) for x, y in data.items()]
Loading…
Cancel
Save