| def render(grid): | def render(grid): | ||||
| return '\n'.join( | return '\n'.join( | ||||
| '\n'.join(''.join([n[1:-1] | |||||
| for n in ln]) | |||||
| '\n'.join(''.join([n[1:-1] for n in ln]) | |||||
| for ln in zip(*[grid[y, x].splitlines()[1:-1] for x in range(size)])) | for ln in zip(*[grid[y, x].splitlines()[1:-1] for x in range(size)])) | ||||
| for y in range(size) | for y in range(size) | ||||
| ) | ) | ||||
| def get_borders(content): | def get_borders(content): | ||||
| a, *_, b = content.splitlines() | a, *_, b = content.splitlines() | ||||
| c, *_, d = [''.join(ln) for ln in zip(*content.splitlines())] | c, *_, d = [''.join(ln) for ln in zip(*content.splitlines())] | ||||
| return '\n'.join(ln[::-1] for ln in string.splitlines()) | return '\n'.join(ln[::-1] for ln in string.splitlines()) | ||||
| def rot90(n): | |||||
| def inner(string): | |||||
| return flipH(transpose(string)) | |||||
| return inner | |||||
| def rot90(string): | |||||
| return flipH(transpose(string)) | |||||
| def noop(string): | def noop(string): | ||||
| def variants(string): | def variants(string): | ||||
| alts = [noop, flipH], [noop, flipV], [noop, rot90(1), rot90(2), rot90(3)] | |||||
| alts = [noop, flipH], [noop, flipV], [noop, transpose] | |||||
| for ops in itertools.product(*alts): | for ops in itertools.product(*alts): | ||||
| yield reduce(lambda s, f: f(s), ops, string) | yield reduce(lambda s, f: f(s), ops, string) | ||||
| def UD(A, B): | |||||
| return A.splitlines()[-1] == B.splitlines()[0] | |||||
| def LR(A, B): | |||||
| return UD(rot90(A), rot90(B)) | |||||
| def search_in(source, target): | def search_in(source, target): | ||||
| source_lns = source.splitlines() | source_lns = source.splitlines() | ||||
| target_lns = target.splitlines() | target_lns = target.splitlines() | ||||
| if set(A) & set(B): | if set(A) & set(B): | ||||
| adj[aid].add(bid) | adj[aid].add(bid) | ||||
| adj[bid].add(aid) | adj[bid].add(aid) | ||||
| corn = [v for v, ks in adj.items() if len(ks) == 2] | |||||
| print(math.prod(corn)) | |||||
| corners = [v for v, ks in adj.items() if len(ks) == 2] | |||||
| print(math.prod(corners)) | |||||
| gids = [[None for _ in range(size)] for _ in range(size)] | |||||
| gids = {} | |||||
| for y in range(size): | |||||
| for x in range(size): | |||||
| if (y, x) == (0, 0): | |||||
| gids[y, x] = corners[0] | |||||
| gids[0][0] = corn[0] | |||||
| gids[1][0], gids[0][1] = adj[gids[0][0]] | |||||
| gids[1][1], = adj[gids[1][0]] & adj[gids[0][1]] - {gids[0][0]} | |||||
| gids[1, 0], gids[0, 1] = adj[gids[0, 0]] | |||||
| gids[1, 1], = adj[gids[1, 0]] & adj[gids[0, 1]] - {gids[0, 0]} | |||||
| for x in range(2, size): | for x in range(2, size): | ||||
| gids[0][x], = adj[gids[0][x - 1]] - {gids[0][x - 2], gids[1][x - 1]} | |||||
| gids[1][x], = adj[gids[0][x]] & adj[gids[1][x - 1]] - {gids[0][x - 1]} | |||||
| gids[0, x], = adj[gids[0, x - 1]] - {gids[0, x - 2], gids[1, x - 1]} | |||||
| gids[1, x], = adj[gids[0, x]] & adj[gids[1, x - 1]] - {gids[0, x - 1]} | |||||
| for y in range(2, size): | for y in range(2, size): | ||||
| gids[y][0], = adj[gids[y - 1][0]] - {gids[y - 2][0], gids[y - 1][1]} | |||||
| gids[y, 0], = adj[gids[y - 1, 0]] - {gids[y - 2, 0], gids[y - 1, 1]} | |||||
| for x in range(1, size): | for x in range(1, size): | ||||
| gids[y][x], = adj[gids[y][x - 1]] & adj[gids[y - 1][x]] - {gids[y - 1][x - 1]} | |||||
| grid = {(y, x): tiles[gids[y][x]] for x in range(size) for y in range(size)} | |||||
| def UD(A, B): | |||||
| return A.splitlines()[-1] == B.splitlines()[0] | |||||
| def LR(A, B): | |||||
| return UD(rot90(1)(A), rot90(1)(B)) | |||||
| gids[y, x], = adj[gids[y, x - 1]] & adj[gids[y - 1, x]] - {gids[y - 1, x - 1]} | |||||
| grid = {(y, x): tiles[gids[y, x]] for x in range(size) for y in range(size)} | |||||
| grid[0, 0] = flipV(grid[0, 0]) | |||||
| for y in range(size): | for y in range(size): | ||||
| for x in range(size): | for x in range(size): | ||||
| if (y, x) == (0, 0): | |||||
| grid[y, x] = flipV(grid[y, x]) | |||||
| elif y == 0: | |||||
| grid[y, x] = next(pic for pic in variants(grid[0, x]) if LR(grid[y, x - 1], pic)) | |||||
| else: | |||||
| grid[y, x] = next(pic for pic in variants(grid[y, x]) if UD(grid[y - 1, x], pic)) | |||||
| if (x, y) != (0, 0): | |||||
| grid[y, x], = ( | |||||
| pic for pic in variants(grid[y, x]) | |||||
| if ((y - 1, x) not in grid or UD(grid[y - 1, x], pic)) | |||||
| and ((y, x - 1) not in grid or LR(grid[y, x - 1], pic)) | |||||
| ) | |||||
| monster = ''' | monster = ''' |