Enable Javascript in your browser and then refresh this page, for a much enhanced experience.
First solution in Clear category for Magic Square by _Chico_
import itertools
MAGIC_NUMBERS = dict((k, int(k*(k**2+1)/2)) for k in range(3, 15))
def checkio(data):
missing = [i for i in range(1, len(data)**2+1)
if not any(i in row for row in data)]
possible = {}
for i, row in enumerate(data):
possible[i] = [j for j in itertools.permutations(missing, row.count(0))
if sum(j) + sum(row) == MAGIC_NUMBERS[len(data)]]
for replace in itertools.product(*possible.values()):
check_magic = data[:]
for i, tup in enumerate(replace):
tup = iter(tup)
check_magic[i] = [j if j else next(tup) for j in data[i]]
if is_magic(len(data), check_magic):
return check_magic
return [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
def is_magic(size, square):
magic_number = MAGIC_NUMBERS[size]
flat = list(itertools.chain.from_iterable(square))
return (all(i in flat for i in range(1, size**2 + 1)) and
all(sum(i)==magic_number for i in [flat[i::size] for i in range(size)]) and
all(sum(i)==magic_number for i in square) and
sum(flat[::size+1]) == magic_number and
sum([row[size-1-i] for i, row in enumerate(square)]) == magic_number)
May 13, 2021