from itertools import permutations, compress
m = 3
n = 3
def prettyPrint( single_division ):
def clean(it):
items = ", ".join(it)
return "{" + items + "}"
def cleanIntSet(single_set):
str_set = map(str, single_set)
return clean( str_set )
sets = map( cleanIntSet, single_division )
return clean(sets)
def candidates(n,m):
def makeCandidate(perm):
solution = []
integers = range(1,n*m+1)
for setNumber in range(m):
mask = map(lambda x: x == setNumber, perm)
singleSet = compress(integers, mask)
solution.append(frozenset(singleSet))
return frozenset(solution)
permutationBase = [i for j in range(n) for i in range(m)]
allPermutations = set( permutations(permutationBase) )
return { makeCandidate(perm) for perm in allPermutations }
def isCorrectDivision(division):
sums = map(sum, division)
return len(set(sums)) == 1
answers = filter(isCorrectDivision,candidates(n,m))
for answer in answers:
print( prettyPrint(answer) )
CmZyb20gaXRlcnRvb2xzIGltcG9ydCBwZXJtdXRhdGlvbnMsIGNvbXByZXNzCgptID0gMwpuID0gMwoKZGVmIHByZXR0eVByaW50KCBzaW5nbGVfZGl2aXNpb24gKToKICAgIGRlZiBjbGVhbihpdCk6CiAgICAgICAgaXRlbXMgPSAiLCAiLmpvaW4oaXQpCiAgICAgICAgcmV0dXJuICJ7IiArIGl0ZW1zICsgIn0iCgogICAgZGVmIGNsZWFuSW50U2V0KHNpbmdsZV9zZXQpOgogICAgICAgIHN0cl9zZXQgPSBtYXAoc3RyLCBzaW5nbGVfc2V0KQogICAgICAgIHJldHVybiBjbGVhbiggc3RyX3NldCApIAoKICAgIHNldHMgPSBtYXAoIGNsZWFuSW50U2V0LCBzaW5nbGVfZGl2aXNpb24gKQogICAgcmV0dXJuIGNsZWFuKHNldHMpCgpkZWYgY2FuZGlkYXRlcyhuLG0pOgogICAgZGVmIG1ha2VDYW5kaWRhdGUocGVybSk6CiAgICAgICAgc29sdXRpb24gPSBbXQogICAgICAgIGludGVnZXJzID0gcmFuZ2UoMSxuKm0rMSkKICAgICAgICAKICAgICAgICBmb3Igc2V0TnVtYmVyIGluIHJhbmdlKG0pOgogICAgICAgICAgICBtYXNrID0gbWFwKGxhbWJkYSB4OiB4ID09IHNldE51bWJlciwgcGVybSkKICAgICAgICAgICAgc2luZ2xlU2V0ID0gY29tcHJlc3MoaW50ZWdlcnMsIG1hc2spCiAgICAgICAgICAgIHNvbHV0aW9uLmFwcGVuZChmcm96ZW5zZXQoc2luZ2xlU2V0KSkKCiAgICAgICAgcmV0dXJuIGZyb3plbnNldChzb2x1dGlvbikKICAgIAogICAgcGVybXV0YXRpb25CYXNlID0gW2kgZm9yIGogaW4gcmFuZ2UobikgZm9yIGkgaW4gcmFuZ2UobSldCiAgICBhbGxQZXJtdXRhdGlvbnMgPSBzZXQoIHBlcm11dGF0aW9ucyhwZXJtdXRhdGlvbkJhc2UpICkKICAgIAogICAgcmV0dXJuIHsgbWFrZUNhbmRpZGF0ZShwZXJtKSBmb3IgcGVybSBpbiBhbGxQZXJtdXRhdGlvbnMgfQoKZGVmIGlzQ29ycmVjdERpdmlzaW9uKGRpdmlzaW9uKToKICAgIHN1bXMgPSBtYXAoc3VtLCBkaXZpc2lvbikKICAgIHJldHVybiBsZW4oc2V0KHN1bXMpKSA9PSAxCgphbnN3ZXJzID0gZmlsdGVyKGlzQ29ycmVjdERpdmlzaW9uLGNhbmRpZGF0ZXMobixtKSkKZm9yIGFuc3dlciBpbiBhbnN3ZXJzOgogICAgcHJpbnQoIHByZXR0eVByaW50KGFuc3dlcikgKQoK
{{1, 5, 9}, {8, 3, 4}, {2, 6, 7}}
{{9, 2, 4}, {3, 5, 7}, {8, 1, 6}}