Enable Javascript in your browser and then refresh this page, for a much enhanced experience.
41-liner: no magic solution in Clear category for Magic Domino by przemyslaw.daniel
from itertools import combinations, permutations, product, chain
def binary_swaps(data, number):
out = [[]]
for i in data:
out = [x+[i] for x in out]+[x+[i[::-1]] for x in out]
return [x for x in out if sum([y[0] for y in x]) == number]
def find_correct(board, size, number):
board = [board[size//2*x:size//2*(x+1)]
for x in range(size)]
for i in product(*[permutations(x) for x in board]):
col_sums = [sum([x[0]+x[1] for x in j]) == 2*number
for j in zip(*i[::-1])]
if not (col_sums and all(col_sums)):
continue
bs = [binary_swaps(j, number) for j in zip(*i[::-1])]
for j in product(*bs):
b = [list(chain(*x)) for x in zip(*j[::-1])]
if sum([b[x][x] for x in range(size)]) == number and \
sum([b[x][size-x-1] for x in range(size)]) == number:
return b
return []
def magic_domino(size, number):
pieces = [(x, y) for y in range(7) for x in range(y, 7)]
stack = [((), [x for x in combinations(pieces, size//2) if
sum(y[0]+y[1] for y in x) == number])]
while stack:
chains, rows = stack.pop()
if len(chains) == size**2//2:
board = find_correct(chains, size, number)
if board:
return list(zip(*board[::-1]))
continue
for i in rows:
if len(chains+i) == len(set(chains+i)):
stack += [(chains+i, [x for x in rows if x != i])]
Jan. 11, 2017
Comments: