2024-12-24 23:04:34 +02:00

99 lines
2.7 KiB
Python

import numpy as np
three_in_a_row = np.array([
[1, 1, 1]
])
l_shape = np.array([
[1, 0],
[1, 0],
[1, 1]
])
t_shape = np.array([
[1, 1, 1],
[0, 1, 0],
])
square = np.array([
[1, 1],
[1, 1]
])
smaller_l_shape = np.array([
[1, 0],
[1, 1]
])
tetris_z = np.array([
[1, 1, 0],
[0, 1, 1]
])
all_pieces = {
"Consecutive 3s": three_in_a_row,
"L": l_shape,
"T": t_shape,
"Square": square,
"Smaller L": smaller_l_shape,
"Z": tetris_z
}
def sanity_check():
"""Check all possible ways to position the pieces(including 3d rotation)"""
for piece_name, piece in all_pieces.items():
all_placements = []
# Check original rotations
for _ in range(4):
piece = np.rot90(piece)
if piece.tolist() not in all_placements:
all_placements.append(piece.tolist())
# Check flipped rotations
flipped_piece = np.flip(piece, axis=0)
for _ in range(4):
flipped_piece = np.rot90(flipped_piece)
if flipped_piece.tolist() not in all_placements:
all_placements.append(flipped_piece.tolist())
print(f"Piece: {piece_name}")
print(f"Distinct Placements (including flips and rotations): {len(all_placements)}")
print("--------------------")
def count_combinations_on_matrix(matrix_size):
"""Count all possible combinations of pieces on a matrix of given size."""
matrix = np.zeros(matrix_size, dtype=int)
total_combinations = 0
for piece_name, piece in all_pieces.items():
piece_rows, piece_cols = piece.shape
placements = []
# Generate all distinct placements of the piece
for _ in range(4):
piece = np.rot90(piece)
if piece.tolist() not in placements:
placements.append(piece.tolist())
flipped_piece = np.flip(piece, axis=0)
for _ in range(4):
flipped_piece = np.rot90(flipped_piece)
if flipped_piece.tolist() not in placements:
placements.append(flipped_piece.tolist())
# Count valid placements on the matrix
for placement in placements:
rows, cols = len(placement), len(placement[0])
for i in range(matrix_size[0] - rows + 1):
for j in range(matrix_size[1] - cols + 1):
sub_matrix = matrix[i:i + rows, j:j + cols]
if not sub_matrix.any(): # Check if the space is empty
total_combinations += 1
print(f"Total combinations on {matrix_size[0]}x{matrix_size[1]} matrix: {total_combinations}")
if __name__ == "__main__":
sanity_check()
count_combinations_on_matrix((5, 5))