Skip to content

Instantly share code, notes, and snippets.

@adrian17
Last active July 16, 2016 10:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save adrian17/9f55e71f9fbcceb54217ee083bdc95e5 to your computer and use it in GitHub Desktop.
Save adrian17/9f55e71f9fbcceb54217ee083bdc95e5 to your computer and use it in GitHub Desktop.
class Node:
def __init__(self, val):
self.up = bool(val & 1)
self.right = bool(val & 2)
self.down = bool(val & 4)
self.left = bool(val & 8)
def rotate(self):
self.up, self.right, self.down, self.left = self.right, self.down, self.left, self.up
def num(self):
return self.up<<0 | self.right<<1 | self.down<<2 | self.left<<3
lines = open("input.txt").read().strip().splitlines()
lines = [[Node(int(x)) for x in line.split()] for line in lines]
flat = [x for row in lines for x in row]
edge = Node(0)
for y, row in enumerate(lines):
for x, node in enumerate(row):
node.node_up = lines[y-1][x] if y != 0 else edge
node.node_left = lines[y][x-1] if x != 0 else edge
node.is_edge_down = y == len(lines)-1
node.is_edge_right = x == len(row)-1
def check(node):
if node.up != node.node_up.down:
return False
if node.left != node.node_left.right:
return False
if node.is_edge_down and node.down:
return False
if node.is_edge_right and node.right:
return False
return True
def recurse(n):
if n == len(flat):
return True
for i in range(4):
if check(flat[n]):
if recurse(n+1):
return True
flat[n].rotate()
recurse(0)
chars = ' ╹╺┗╻┃┏┣╸┛━┻┓┫┳╋'
for y, row in enumerate(lines):
print(''.join(chars[node.num()] for node in row))
for y, row in enumerate(lines):
print(' '.join(str(node.num()) for node in row))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment