99 lines
2.7 KiB
Python
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)) |