smarter generation of permutations

This commit is contained in:
Noa Aarts 2025-11-27 23:59:23 +01:00
parent 74ab281f75
commit d73dba80cd
Signed by: noa
GPG key ID: 1850932741EFF672

View file

@ -37,26 +37,25 @@ tiles = [
] ]
def get_permutations(which_tiles: list[tuple[int, int]]): def get_permutations(which_tiles: list[int]):
permutations = [] permutations = []
for i, tile in enumerate(tiles): for i, tile in enumerate(tiles):
if i not in which_tiles: if i not in which_tiles:
continue 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 = [] rots = [np.rot90(tile, k) for k in range(4)]
for arr in permutations: flips = [np.flip(r, axis=1) for r in rots] # flip horizontally
if not any(np.array_equal(arr, u) for u in unique_arrays): all_orients = rots + flips # 8 orientations
unique_arrays.append(arr)
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): def can_place(board, tile, player):