diff --git a/src/core/group/internal/group.cc b/src/core/group/internal/group.cc index 9604736..95a7aba 100644 --- a/src/core/group/internal/group.cc +++ b/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(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(); } diff --git a/src/core/main.cc b/src/core/main.cc index 2726f82..51e2597 100644 --- a/src/core/main.cc +++ b/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; // } diff --git a/verify/mirror.py b/verify/mirror.py new file mode 100755 index 0000000..d62b299 --- /dev/null +++ b/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()]