Enable Javascript in your browser and then refresh this page, for a much enhanced experience.
First solution in Uncategorized category for The Lantern Festival by gyahun_dash
from itertools import product, chain, starmap
def getflow(area, minutes = 400):
log, explore = [], {min(area)}
for i in range(minutes + 1):
r, c = cur = explore.pop()
log.append(cur)
dirs = (r - 1, c), (r + 1, c), (r, c - 1), (r, c + 1)
explore |= {c for c in dirs if c in area and c not in log}
if not explore: break
return log
def lanterns_flow(rivermap, minutes, WATER = '.'):
coords = set(product(*map(range, map(len, (rivermap, rivermap[0])))))
river = {(r, c) for r, c in coords if rivermap[r][c] == WATER}
around = lambda r, c: product(range(r - 1, r + 2), range(c - 1, c + 2))
erode = lambda ar: {c for c in chain(*starmap(around, ar)) if c in coords}
riverside = set(getflow(erode(river) - river)) # one side
bands, living = [], set(river)
while living:
riverside = erode(riverside) & living
bands.append(riverside)
living -= riverside
lanterns = (getflow(band, minutes).pop() for band in bands)
return len(erode(lanterns) & river)
Aug. 14, 2014