Enable Javascript in your browser and then refresh this page, for a much enhanced experience.
chains recursive generator solution in Clear category for Domino Chain by flpo
import itertools
def domino_chain(tiles):
tiles = tiles.replace(' ', '').replace('-', '').split(',')
nodes = set(itertools.chain.from_iterable(tiles))
non_loop_degrees = {i: sum(i in t for t in tiles if t[0] != t[1]) for i in nodes}
odds = [v for v, d in non_loop_degrees.items() if d % 2]
if len(odds) not in (0, 2):
return 0
def chain_gen(chain):
if len(chain) == len(tiles):
yield 1
else:
chain_tiles = set(map(frozenset, chain))
free_tiles = (t for t in tiles if chain[-1][1] in t and set(t) not in chain_tiles)
yield from chains_gen([chain + [t if t[0] == chain[-1][1] else t[::-1]] for t in free_tiles])
def chains_gen(chains):
yield from itertools.chain.from_iterable(map(chain_gen, chains))
rtiles = [[t] for t in tiles] + [[t[::-1]] for t in tiles if t[0] != t[1]]
if odds:
return sum(chains_gen(t for t in rtiles if t[0][0] == odds[0]))
return sum(chains_gen(rtiles)) / 2
Sept. 6, 2017