From d73dba80cdc317981dd6f27dd66213d8402ee7bf Mon Sep 17 00:00:00 2001 From: Noa Aarts Date: Thu, 27 Nov 2025 23:59:23 +0100 Subject: [PATCH] smarter generation of permutations --- blokus.py | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/blokus.py b/blokus.py index 1fa40b4..30c20ed 100755 --- a/blokus.py +++ b/blokus.py @@ -37,26 +37,25 @@ tiles = [ ] -def get_permutations(which_tiles: list[tuple[int, int]]): +def get_permutations(which_tiles: list[int]): permutations = [] + for i, tile in enumerate(tiles): if i not in which_tiles: continue - permutations.append((i, tile)) - permutations.append((i, np.rot90(tile))) - permutations.append((i, np.rot90(np.rot90(tile)))) - permutations.append((i, np.rot90(np.rot90(np.rot90(tile))))) - permutations.append((i, np.flip(tile))) - permutations.append((i, np.flip(np.rot90(tile)))) - permutations.append((i, np.flip(np.rot90(np.rot90(tile))))) - permutations.append((i, np.flip(np.rot90(np.rot90(np.rot90(tile)))))) - unique_arrays = [] - for arr in permutations: - if not any(np.array_equal(arr, u) for u in unique_arrays): - unique_arrays.append(arr) + rots = [np.rot90(tile, k) for k in range(4)] + flips = [np.flip(r, axis=1) for r in rots] # flip horizontally + all_orients = rots + flips # 8 orientations - return unique_arrays + seen = set() + for t in all_orients: + key = (t.shape, t.tobytes()) + if key not in seen: + seen.add(key) + permutations.append((i, t)) + + return permutations def can_place(board, tile, player):