Solved data added

This commit is contained in:
Boyan 2024-12-25 01:00:25 +02:00
parent b3023beacd
commit 3a41bff462
6 changed files with 6356 additions and 11 deletions

View File

3149
iq_mini_4489/src/data.json Normal file

File diff suppressed because it is too large Load Diff

3149
iq_mini_4489/src/raw.json Normal file

File diff suppressed because it is too large Load Diff

View File

@ -3,8 +3,10 @@
from board import Board, generate_orientations from board import Board, generate_orientations
from typing import Tuple, List from typing import Tuple, List
import pieces import pieces
import sys
import numpy as np import numpy as np
import colorama import colorama
import hashlib
def backtrack(board: Board, pieces_list: List[str], piece_index: int, def backtrack(board: Board, pieces_list: List[str], piece_index: int,
orientations: dict, solutions: List[np.ndarray]) -> None: orientations: dict, solutions: List[np.ndarray]) -> None:
@ -31,7 +33,6 @@ def backtrack(board: Board, pieces_list: List[str], piece_index: int,
board.remove(orientation, (row, col)) board.remove(orientation, (row, col))
def solve(xPin: Tuple[int, int], yPin: Tuple[int, int], zPin: Tuple[int, int]): def solve(xPin: Tuple[int, int], yPin: Tuple[int, int], zPin: Tuple[int, int]):
""" """
solve the puzzle, avoiding the pins at the specified positions. solve the puzzle, avoiding the pins at the specified positions.
@ -94,28 +95,74 @@ def colorful_solution(xPin, yPin, zPin) -> str:
print("--------------------") print("--------------------")
print(f"Total solutions: {len(solutions)}") print(f"Total solutions: {len(solutions)}")
def try_all_pegs(): def check_rotations(Ax, Ay, Bx, By, Cx, Cy, checked):
"""
Check if any rotation of these three pins was already in `checked`.
If yes, return True; if not, add them and return False.
We assume a 5x5 board with valid row/col in [0..4].
"""
def rotate_90(r, c):
# Rotate (r, c) by 90 degrees on a 5x5 board => (c, 4 - r)
return (c, 4 - r)
# Start with the 3 pin positions
base_pins = [(Ax, Ay), (Bx, By), (Cx, Cy)]
# Sort them so (pin1, pin2, pin3) is in a canonical order
# Generate all 4 rotations
rotations = []
current = base_pins
for _ in range(4):
# Rotate each pin in `current` by 90 degrees
current = [rotate_90(r, c) for (r, c) in current]
# Sort again so we have a canonical ordering
rotations.append(tuple(current))
# Check if any rotation is already in `checked`
for pins_tuple in rotations:
if pins_tuple in checked:
return True
# If none were found, add *all* rotations to `checked`
# so we never re-check or re-add them in the future.
for pins_tuple in rotations:
checked.add(pins_tuple)
return False
def try_all_pegs_naive():
from tqdm import tqdm from tqdm import tqdm
all_solutions = [] all_solutions = []
# Solution entry {x: (row, col), y: (row, col), z: (row, col), solution_count: int} # Solution entry {x: (row, col), y: (row, col), z: (row, col), solution_count: int}
# 5^4 = 625 iterations
for xPinA in (range(5)): # 3^6 = 729 iterations
for yPinA in range(5): # 5^6 = 15625 iterations
checked = set()
for xPinA in tqdm(range(5)):
for yPinA in (range(5)):
for xPinB in range(5): for xPinB in range(5):
for yPinB in range(5): for yPinB in range(5):
for xPinC in tqdm(range(5)): for xPinC in (range(5)):
for yPinC in range(5): for yPinC in range(5):
if (xPinA, yPinA) == (xPinB, yPinB) or (xPinA, yPinA) == (xPinC, yPinC) or (xPinB, yPinB) == (xPinC, yPinC): if (xPinA, yPinA) == (xPinB, yPinB) or (xPinA, yPinA) == (xPinC, yPinC) or (xPinB, yPinB) == (xPinC, yPinC):
continue continue
if check_rotations(xPinA, yPinA, xPinB, yPinB, xPinC, yPinC, checked):
continue
solutions = solve((xPinA, yPinA), (xPinB, yPinB), (xPinC, yPinC)) solutions = solve((xPinA, yPinA), (xPinB, yPinB), (xPinC, yPinC))
import sys
if solutions: if solutions:
all_solutions.append({ print({
'x': (xPinA, yPinA), 'x': (xPinA, yPinA),
'y': (xPinB, yPinB), 'y': (xPinB, yPinB),
'z': (xPinC, yPinC), 'z': (xPinC, yPinC),
'solution_count': len(solutions) 'solution_count': len(solutions)
}) }, file=sys.stdout, flush=True)
return all_solutions
if __name__ == "__main__": if __name__ == "__main__":
# colorful_solution((0, 2), (2, 0), (3, 3)) colorful_solution((0, 0), (4, 4), (4, 0))
print(try_all_pegs()) # try_all_pegs_naive()