Enable Javascript in your browser and then refresh this page, for a much enhanced experience.
First solution in Clear category for Magic Square by Amachua
from copy import deepcopy
import operator
# Check the sum for each row column and diagonal
def checkMatrix(data, number, operand):
sum1, sum2, size, transp = 0, 0, len(data), list(map(list,zip(*data)))
for i in range(size):
if not (operand(sum(data[i]), number) and operand(sum(transp[i]), number)):
return False
sum1 += data[i][i]
sum2 += data[size-i-1][i]
return True if operand(sum1, number) and operand(sum2, number) else False
def findMagicMatrix(data, numbers, number):
# Copy the matrix
matrix = deepcopy(data)
# Search a 0 in the matrix
for i in range(len(data)):
for j in range(len(data)):
if not data[i][j]:
# If a 0 is find. Check each remaining values.
for k in range(len(numbers)):
nb = numbers.pop(0)
# Set the value in the matrix and find recursively if we can get a magic matrix.
matrix[i][j] = nb
if checkMatrix(matrix, number, operator.le):
answer = findMagicMatrix(matrix, numbers, number)
# If a magical matrix is find return the answer
if answer[1]: return answer
numbers.append(nb)
return [matrix, False]
# Return the final matrix and if it is magical
return [matrix, checkMatrix(matrix, number, operator.eq)]
def checkio(data):
# Get the sum value and all possible value in the matrix
numbers, number = [i for i in range(1, len(data)**2+1)], len(data)*(len(data)**2+1)/2
# Remove existing values
for i in range(len(data)**2):
if data[int(i/len(data))][i%len(data)]: numbers.remove(data[int(i/len(data))][i%len(data)])
# Recursively find the magic matrix
return findMagicMatrix(data, numbers, number)[0]
Aug. 21, 2013