def pandiagonal(matrix: np.ndarray, order: int) -> bool:
matrix_ = matrix.copy()
for i in range(1,order):
matrix_[i,:] = matrix_[i,np.mod(np.arange(order) + i, order)]
for i in range(order):
if np.unique(matrix_[:,i]).size < order:
#print(np.unique(matrix_[:,i]).size)
return False
matrix_ = matrix.copy()
for i in range(1,order):
matrix_[i,:] = matrix_[i,np.mod(np.arange(order) - i, order)]
for i in range(order):
if np.unique(matrix_[:,i]).size < order:
#print(np.unique(matrix_[:,i]).size)
return False
return True
def cyclicity_list(matrices: list, order: int) -> list:
non_pandiagonal = 0
result = list()
for square in matrices:
if pandiagonal(square, order):
result.append(cyclicity(square, order))
else:
non_pandiagonal += 1
print('There are %d non-pandiagonal squares in the dataset' % non_pandiagonal)
return result
def cyclicity(matrix: np.ndarray, order: int) -> tuple:
not_horizontal = True
for row in range(1, order):
shift_answer = False
for shift in range(1, order):
if (np.roll(matrix[row], shift) == matrix[0]).all():
shift_answer = True
if not shift_answer:
not_horizontal = False
break
not_vertical = True
for column in range(1, order):
shift_answer = False
for shift in range(1, order):
if (np.roll(matrix[:, column], shift) == matrix[:, 0]).all():
shift_answer = True
if not shift_answer:
not_vertical = False
break
not_main_diagonal = True
main_diag = matrix.copy()
for column in range(1,order):
main_diag[:,column] = np.roll(main_diag[:,column], column)
for row in range(1, order):
shift_answer = False
for shift in range(1, order):
if (np.roll(main_diag[row], shift) == main_diag[0]).all():
shift_answer = True
if not shift_answer:
not_main_diagonal = False
break
not_antidiagonal = True
anti_diag = matrix.copy()
for column in range(1,order):
anti_diag[:,column] = np.roll(anti_diag[:,column], -column)
for row in range(1, order):
shift_answer = False
for shift in range(1, order):
if (np.roll(anti_diag[row], shift) == anti_diag[0]).all():
shift_answer = True
if not shift_answer:
not_antidiagonal = False
break
return (not_horizontal, not_vertical, not_main_diagonal, not_antidiagonal)
outcomes = [' horizontal', ' vertical', ' main-diagonal', ' antidiagonal']