def readfile(path):
with open(path) as input_file:
return input_file.read().strip()
def params(program, i, count):
modes = str(program[i] // 100)[::-1]
result = []
for x in range(count - 1):
arg = program[i + 1 + x]
if x >= len(modes) or modes[x] == "0":
result.append(program[arg])
elif modes[x] == "2":
result.append(program[program.offset + arg])
else:
result.append(arg)
output = program[i + count]
if len(modes) >= count and modes[count - 1] == "2":
output += program.offset
result.append(output) # output
return result
def add(program, i, **kwargs):
assert program[i] % 100 == 1
a, b, out = params(program, i, 3)
program[out] = a + b
return i + 4, None
def mul(program, i, **kwargs):
assert program[i] % 100 == 2
a, b, out = params(program, i, 3)
program[out] = a * b
return i + 4, None
def inp(program, i, input_values, **kwargs):
assert program[i] % 100 == 3
out, = params(program, i, 1)
program[out] = input_values.pop(0)
# print(f"> program[{out}] = {program[out]}")
return i + 2, None
def out(program, i, **kwargs):
assert program[i] % 100 == 4
val, _ = params(program, i, 2)
# print(f"> {val}")
return i + 2, val
def jit(program, i, **kwargs):
assert program[i] % 100 == 5
test, ip, _ = params(program, i, 3)
if test != 0:
return ip, None
return i + 3, None
def jif(program, i, **kwargs):
assert program[i] % 100 == 6
test, ip, _ = params(program, i, 3)
if test == 0:
return ip, None
return i + 3, None
def lt(program, i, **kwargs):
assert program[i] % 100 == 7
a, b, out = params(program, i, 3)
program[out] = int(a < b)
return i + 4, None
def eq(program, i, **kwargs):
assert program[i] % 100 == 8
a, b, out = params(program, i, 3)
program[out] = int(a == b)
return i + 4, None
def rbo(program, i, **kwargs):
assert program[i] % 100 == 9
delta, _ = params(program, i, 2)
program.offset += delta
# print (f"> rbo = {program.offset}" )
return i + 2, None
operations = { 1: add, 2: mul, 3: inp, 4: out, 5: jit, 6: jif, 7: lt, 8: eq, 9: rbo }
class Program(list):
def __init__(self, *args, **kwargs):
super(Program, self).__init__(args[0])
self.offset = 0
def compute(program, input_values, debug=False):
program = Program(program)
l = len(program)
i = 0
output_value = None
last_output = None
while i < l:
op = program[i]
if op == 99:
if debug:
print(f">> exit {output_value}")
return
if debug:
print(f">> {i}, {list(enumerate(program))[i:i+5]}")
i, output_value = operations[op % 100](program, i, input_values=input_values)
if output_value is not None:
yield output_value
raise Exception("Didn't terminate properly")
def process(listing):
lst = list(map(int, listing.split(",")))
lst.extend([0] * 100000)
return lst
it = compute(process(readfile("AoC/input11.txt")), input_values=[1, 0, 1, 0])
from collections import defaultdict
left = {
(0, -1): (-1, 0),
(-1, 0): (0, 1),
(0, 1): (1, 0),
(1, 0): (0, -1),
}
right = {v: k for k, v in left.items()}
def painter(start=0, debug=False, limit=100):
input_values = []
it = compute(process(readfile("AoC/input11.txt")), input_values=input_values)
grid = {}
x = 0
y = 0
dx = 0
dy = -1
index = 0
while True and (not debug or (not limit or index <= limit)):
index += 1
try:
input_values.append(grid.get((x, y), start if index == 1 else 0))
grid[(x, y)] = (dx, dy)
if debug:
print_grid(grid)
col = next(it)
grid[(x, y)] = col
turn = next(it)
dx, dy = left[(dx, dy)] if turn == 0 else right[(dx, dy)]
x += dx
y += dy
if debug:
print(col, turn)
print()
except StopIteration:
break
return grid
def print_grid(grid):
minx, maxx = min(grid.keys(), key=lambda x: x[0])[0], max(grid.keys(), key=lambda x: x[0])[0]
miny, maxy = min(grid.keys(), key=lambda x: x[1])[1], max(grid.keys(), key=lambda x: x[1])[1]
for j in range(miny, maxy + 1):
for i in range(minx, maxx + 1):
val = grid.get((i, j), 0)
ch = ' '
if val == 1:
ch = '#'
elif val == (0, 1):
ch = 'v'
elif val == (0, -1):
ch = '^'
elif val == (1, 0):
ch = '>'
elif val == (-1, 0):
ch = '<'
print(ch, end='')
print()
len(painter())
1964
print_grid(painter(start=1))
#### # # #### # # ## #### ### # # # # # # # # # # # # # # # ### ## ### ## # ### # # ## # # # # # # # # ### # # # # # # # # # # # # # # # > # # # #### # # ## # # # # #
print_grid(painter(start=0))
## # #
# # ####
## ## ##
# ## # ## # #
## ## # # ##
### # ### # ##
## # ## ## # ####
## ## ####
# ###
## ##### #
## ## ##### # ## # #
#### # # ### ### ### #
# # # # ## # ### # #
## ## # ### ## # ## ### # #
# ## # # # ## ## # # # # ##
## # ## # # ### # ## ### # # ##
## # # # ## ## # # ## ## # # ## # # # ### ###
# # ##### ###### # ## # ## # # ## # #### # # ##
## #### # ####### # ### ### # # ### # # ##
### # # # # # # ## ## # ## ####### ## ## #
## ## ## ###### # ## ##### ######## ####
## ## ## ## # # # ### # #### # # # ########
## >### #### ### ## # # ##### ## ### ###
# # # # # # # # # ### # # # #
# # # # # # # ### ###### # # #### # #
## # # ### ### #### # # ##### ### ## # ## #
# # # # # # ## # ## # ## # # ##
# # ## # # # # # # # # # ## # ## # #
## # # # ###### # # ### # ### ##
### # # # ## ## # ## ## # # # ##
#### ### # # # # # ## # # # # # # ##
## # ## # # ## # # # ## # # # ### ### #
# ### #### # # ## # # # ## ## #
### # # # ## # ## # # # # # #### # #
# # ### ## # # # # ## # ### # # ## ## #
# # # # # # # ### #### # ###### ### # #
## ## #### #### #### ## ## ## # ## #
# ## ###### ### ## ## # #### #####
# # ## # ## ## ### ## ## ## ######
## ## # #### # # ## # # # ## ##
# # #### #### # # ####### #
# ### ### ## # ### # # #
## # # # ###### #### ## #
# # # # ## # ## ## #
# ## ####### #### # #
##### ## ### # # ## ##
### # # ## ## ## # ##
# # ## ### # ## # #
# # ## # #### # # # ##
# ### # # # # # #
## ## ## ###### ####
## ## ### # # # # # ## ##
#### # ##### ##### ## #
# ## ##### # ### # #
# # # ##### # ### ####
# # ## # # ##### #
# # ### # # ###
# ### ## ## ##
## # # #### ### #
#### # # # # # #
# ### ###### # #
## ## ##
#### ####
# # # #
# #
##
_ = painter(start=0, debug=True, limit=20)
^ 1 0 <# 1 1 ^ ## 1 0 <# ## 1 1 ^ ## ## 1 1 #> ## ## 1 0 ^ ## ## ## 1 1 #> ## ## ## 1 0 ^ ## ## ## ## 1 1 #> ## ## ## ## 1 0 ^ ## ## ## ## ## 1 0 <# ## ## ## ## ## 1 1 ^ ## ## ## ## ## ## 1 1 #> ## ## ## ## ## ## 1 1 ## #v ## ## ## ## ## 0 0 ## # > ## ## ## ## ## 1 1 ## # # ##v ## ## ## ## 1 1 ## # # #<# ## ## ## ## 0 0 ## # # # # ##v ## ## ## 1 1 ## # # # # #<# ## ## ## 0 0 ## # # # # # # ##v ## ## 1 1
_ = painter(start=1, debug=True, limit=None)
^
0 1
>
1 1
#
v
1 0
#
#>
0 0
#^
#
1 1
##>
#
1 1
###
# v
0 0
###
# >
0 0
###^
#
1 1
####>
#
0 1
####
# v
0 0
####
# >
1 0
#### ^
# #
1 1
#### #>
# #
0 1
#### #
# #v
0 0
#### #
# # >
1 0
#### # ^
# # #
0 1
#### # >
# # #
1 1
#### # #
# # #v
0 0
#### # #
# # # >
0 0
#### # #^
# # #
0 1
#### # # >
# # #
1 1
#### # # #
# # # v
1 0
#### # # #
# # # #>
0 0
#### # # #^
# # # #
1 1
#### # # ##>
# # # #
1 1
#### # # ###
# # # # v
0 0
#### # # ###
# # # # >
0 0
#### # # ###^
# # # #
1 1
#### # # ####>
# # # #
0 1
#### # # ####
# # # # v
0 0
#### # # ####
# # # # >
1 0
#### # # #### ^
# # # # #
1 1
#### # # #### #>
# # # # #
0 1
#### # # #### #
# # # # #v
0 0
#### # # #### #
# # # # # >
1 0
#### # # #### # ^
# # # # # #
0 1
#### # # #### # >
# # # # # #
1 1
#### # # #### # #
# # # # # #v
0 0
#### # # #### # #
# # # # # # >
0 0
#### # # #### # #^
# # # # # #
0 1
#### # # #### # # >
# # # # # #
0 1
#### # # #### # #
# # # # # # v
1 0
#### # # #### # #
# # # # # # #>
0 0
#### # # #### # # ^
# # # # # # #
1 1
#### # # #### # # #>
# # # # # # #
1 1
#### # # #### # # ##
# # # # # # # v
0 0
#### # # #### # # ##
# # # # # # # >
1 0
#### # # #### # # ##^
# # # # # # # #
0 1
#### # # #### # # ## >
# # # # # # # #
0 1
#### # # #### # # ##
# # # # # # # #v
0 0
#### # # #### # # ##
# # # # # # # # >
1 0
#### # # #### # # ## ^
# # # # # # # # #
1 1
#### # # #### # # ## #>
# # # # # # # # #
1 1
#### # # #### # # ## ##
# # # # # # # # #v
0 0
#### # # #### # # ## ##
# # # # # # # # # >
0 0
#### # # #### # # ## ##^
# # # # # # # # #
1 1
#### # # #### # # ## ###>
# # # # # # # # #
1 1
#### # # #### # # ## ####
# # # # # # # # # v
0 0
#### # # #### # # ## ####
# # # # # # # # # >
0 0
#### # # #### # # ## ####^
# # # # # # # # #
0 1
#### # # #### # # ## #### >
# # # # # # # # #
1 1
#### # # #### # # ## #### #
# # # # # # # # # v
1 0
#### # # #### # # ## #### #
# # # # # # # # # #>
0 0
#### # # #### # # ## #### #^
# # # # # # # # # #
1 1
#### # # #### # # ## #### ##>
# # # # # # # # # #
1 1
#### # # #### # # ## #### ###
# # # # # # # # # # v
0 0
#### # # #### # # ## #### ###
# # # # # # # # # # >
1 0
#### # # #### # # ## #### ###^
# # # # # # # # # # #
0 1
#### # # #### # # ## #### ### >
# # # # # # # # # # #
0 1
#### # # #### # # ## #### ###
# # # # # # # # # # #v
0 0
#### # # #### # # ## #### ###
# # # # # # # # # # # >
1 0
#### # # #### # # ## #### ### ^
# # # # # # # # # # # #
1 1
#### # # #### # # ## #### ### #>
# # # # # # # # # # # #
0 1
#### # # #### # # ## #### ### #
# # # # # # # # # # # #v
0 0
#### # # #### # # ## #### ### #
# # # # # # # # # # # # >
1 0
#### # # #### # # ## #### ### # ^
# # # # # # # # # # # # #
0 1
#### # # #### # # ## #### ### # >
# # # # # # # # # # # # #
1 1
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #v
0 0
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # # >
0 0
#### # # #### # # ## #### ### # #^
# # # # # # # # # # # # #
0 1
#### # # #### # # ## #### ### # # >
# # # # # # # # # # # # #
0 1
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # # v
0 0
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # # >
0 1
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
v
0 1
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
<
0 0
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
v
0 1
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
<
0 1
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
^
0 0
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
<
0 0
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
v
0 1
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
<
1 1
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
^
#
0 0
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
<
#
1 0
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
#
v#
0 1
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
#
< #
1 1
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
^#
# #
1 0
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
<##
# #
0 0
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
##
v# #
0 1
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
##
< # #
0 1
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
^ ##
# #
1 0
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
<# ##
# #
0 0
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
# ##
v # #
1 1
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
# ##
<# # #
1 1
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
^ # ##
## # #
0 0
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
< # ##
## # #
1 0
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
# # ##
v## # #
1 1
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
# # ##
<### # #
0 1
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
^# # ##
### # #
0 0
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
< # # ##
### # #
0 0
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
# # ##
v ### # #
0 1
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
# # ##
< ### # #
0 1
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
^ # # ##
### # #
1 0
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
<# # # ##
### # #
1 0
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
## # # ##
v ### # #
0 1
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
## # # ##
< ### # #
1 1
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
^## # # ##
# ### # #
1 0
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
<### # # ##
# ### # #
0 0
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### # # ##
v# ### # #
0 1
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### # # ##
< # ### # #
0 1
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
^ ### # # ##
# ### # #
0 0
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
< ### # # ##
# ### # #
0 0
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### # # ##
v # ### # #
0 1
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### # # ##
< # ### # #
0 1
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
^ ### # # ##
# ### # #
0 0
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
< ### # # ##
# ### # #
1 0
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
# ### # # ##
v # ### # #
1 1
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
# ### # # ##
<# # ### # #
0 1
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
^# ### # # ##
# # ### # #
0 0
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
< # ### # # ##
# # ### # #
0 0
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
# ### # # ##
v # # ### # #
0 1
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
# ### # # ##
< # # ### # #
1 1
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
^ # ### # # ##
# # # ### # #
0 0
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
< # ### # # ##
# # # ### # #
1 0
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
# # ### # # ##
v# # # ### # #
0 1
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
# # ### # # ##
< # # # ### # #
1 1
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
^# # ### # # ##
# # # # ### # #
1 0
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
<## # ### # # ##
# # # # ### # #
0 0
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
## # ### # # ##
v# # # # ### # #
0 1
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
## # ### # # ##
< # # # # ### # #
0 1
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
^ ## # ### # # ##
# # # # ### # #
0 0
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
< ## # ### # # ##
# # # # ### # #
1 0
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
# ## # ### # # ##
v # # # # ### # #
0 1
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
# ## # ### # # ##
< # # # # ### # #
0 1
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
^# ## # ### # # ##
# # # # ### # #
1 0
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
<## ## # ### # # ##
# # # # ### # #
1 0
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## # ### # # ##
v # # # # ### # #
1 1
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## # ### # # ##
<# # # # # ### # #
0 1
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
^### ## # ### # # ##
# # # # # ### # #
0 0
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
< ### ## # ### # # ##
# # # # # ### # #
0 0
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## # ### # # ##
v # # # # # ### # #
0 1
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## # ### # # ##
< # # # # # ### # #
1 1
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
^ ### ## # ### # # ##
# # # # # # ### # #
0 0
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
< ### ## # ### # # ##
# # # # # # ### # #
1 0
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
# ### ## # ### # # ##
v# # # # # # ### # #
0 1
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
# ### ## # ### # # ##
< # # # # # # ### # #
1 1
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
^# ### ## # ### # # ##
# # # # # # # ### # #
1 0
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
<## ### ## # ### # # ##
# # # # # # # ### # #
0 0
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
## ### ## # ### # # ##
v# # # # # # # ### # #
0 1
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
## ### ## # ### # # ##
< # # # # # # # ### # #
0 1
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
^ ## ### ## # ### # # ##
# # # # # # # ### # #
0 0
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
< ## ### ## # ### # # ##
# # # # # # # ### # #
1 0
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
# ## ### ## # ### # # ##
v # # # # # # # ### # #
0 1
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
# ## ### ## # ### # # ##
< # # # # # # # ### # #
0 1
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
^# ## ### ## # ### # # ##
# # # # # # # ### # #
1 0
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
<## ## ### ## # ### # # ##
# # # # # # # ### # #
1 0
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## ### ## # ### # # ##
v # # # # # # # ### # #
1 1
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## ### ## # ### # # ##
<# # # # # # # # ### # #
0 0
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## ### ## # ### # # ##
# # # # # # # # ### # #
v
0 0
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## ### ## # ### # # ##
# # # # # # # # ### # #
>
1 1
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## ### ## # ### # # ##
# # # # # # # # ### # #
#
v
1 0
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## ### ## # ### # # ##
# # # # # # # # ### # #
#
#>
0 0
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## ### ## # ### # # ##
# # # # # # # # ### # #
#^
#
0 1
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## ### ## # ### # # ##
# # # # # # # # ### # #
# >
#
0 1
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## ### ## # ### # # ##
# # # # # # # # ### # #
#
# v
0 0
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## ### ## # ### # # ##
# # # # # # # # ### # #
#
# >
0 0
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## ### ## # ### # # ##
# # # # # # # # ### # #
# ^
#
0 1
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## ### ## # ### # # ##
# # # # # # # # ### # #
# >
#
0 1
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## ### ## # ### # # ##
# # # # # # # # ### # #
#
# v
0 0
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## ### ## # ### # # ##
# # # # # # # # ### # #
#
# >
1 0
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## ### ## # ### # # ##
# # # # # # # # ### # #
# ^
# #
1 1
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## ### ## # ### # # ##
# # # # # # # # ### # #
# #>
# #
0 1
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## ### ## # ### # # ##
# # # # # # # # ### # #
# #
# #v
0 0
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## ### ## # ### # # ##
# # # # # # # # ### # #
# #
# # >
0 0
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## ### ## # ### # # ##
# # # # # # # # ### # #
# # ^
# #
1 1
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## ### ## # ### # # ##
# # # # # # # # ### # #
# # #>
# #
0 1
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## ### ## # ### # # ##
# # # # # # # # ### # #
# # #
# # v
1 0
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## ### ## # ### # # ##
# # # # # # # # ### # #
# # #
# # #>
0 0
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## ### ## # ### # # ##
# # # # # # # # ### # #
# # # ^
# # #
0 1
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## ### ## # ### # # ##
# # # # # # # # ### # #
# # # >
# # #
1 1
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## ### ## # ### # # ##
# # # # # # # # ### # #
# # # #
# # # v
1 0
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## ### ## # ### # # ##
# # # # # # # # ### # #
# # # #
# # # #>
1 0
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## ### ## # ### # # ##
# # # # # # # # ### # #
# # # #^
# # # ##
0 1
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## ### ## # ### # # ##
# # # # # # # # ### # #
# # # # >
# # # ##
0 1
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## ### ## # ### # # ##
# # # # # # # # ### # #
# # # #
# # # ##v
1 0
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## ### ## # ### # # ##
# # # # # # # # ### # #
# # # #
# # # ###>
1 0
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## ### ## # ### # # ##
# # # # # # # # ### # #
# # # # ^
# # # ####
0 1
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## ### ## # ### # # ##
# # # # # # # # ### # #
# # # # >
# # # ####
0 1
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## ### ## # ### # # ##
# # # # # # # # ### # #
# # # #
# # # ####v
0 0
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## ### ## # ### # # ##
# # # # # # # # ### # #
# # # #
# # # #### >
1 0
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## ### ## # ### # # ##
# # # # # # # # ### # #
# # # # ^
# # # #### #
1 1
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## ### ## # ### # # ##
# # # # # # # # ### # #
# # # # #>
# # # #### #
0 1
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## ### ## # ### # # ##
# # # # # # # # ### # #
# # # # #
# # # #### #v
0 0
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## ### ## # ### # # ##
# # # # # # # # ### # #
# # # # #
# # # #### # >
0 0
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## ### ## # ### # # ##
# # # # # # # # ### # #
# # # # # ^
# # # #### #
1 1
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## ### ## # ### # # ##
# # # # # # # # ### # #
# # # # # #>
# # # #### #
0 1
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## ### ## # ### # # ##
# # # # # # # # ### # #
# # # # # #
# # # #### # v
1 0
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## ### ## # ### # # ##
# # # # # # # # ### # #
# # # # # #
# # # #### # #>
0 0
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## ### ## # ### # # ##
# # # # # # # # ### # #
# # # # # # ^
# # # #### # #
0 1
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## ### ## # ### # # ##
# # # # # # # # ### # #
# # # # # # >
# # # #### # #
1 1
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## ### ## # ### # # ##
# # # # # # # # ### # #
# # # # # # #
# # # #### # # v
0 0
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## ### ## # ### # # ##
# # # # # # # # ### # #
# # # # # # #
# # # #### # # >
1 0
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## ### ## # ### # # ##
# # # # # # # # ### # #
# # # # # # #^
# # # #### # # #
0 1
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## ### ## # ### # # ##
# # # # # # # # ### # #
# # # # # # # >
# # # #### # # #
0 1
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## ### ## # ### # # ##
# # # # # # # # ### # #
# # # # # # #
# # # #### # # #v
1 0
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## ### ## # ### # # ##
# # # # # # # # ### # #
# # # # # # #
# # # #### # # ##>
0 0
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## ### ## # ### # # ##
# # # # # # # # ### # #
# # # # # # # ^
# # # #### # # ##
1 1
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## ### ## # ### # # ##
# # # # # # # # ### # #
# # # # # # # #>
# # # #### # # ##
0 1
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## ### ## # ### # # ##
# # # # # # # # ### # #
# # # # # # # #
# # # #### # # ## v
0 0
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## ### ## # ### # # ##
# # # # # # # # ### # #
# # # # # # # #
# # # #### # # ## >
1 0
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## ### ## # ### # # ##
# # # # # # # # ### # #
# # # # # # # # ^
# # # #### # # ## #
1 1
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## ### ## # ### # # ##
# # # # # # # # ### # #
# # # # # # # # #>
# # # #### # # ## #
0 1
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## ### ## # ### # # ##
# # # # # # # # ### # #
# # # # # # # # #
# # # #### # # ## #v
0 0
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## ### ## # ### # # ##
# # # # # # # # ### # #
# # # # # # # # #
# # # #### # # ## # >
0 0
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## ### ## # ### # # ##
# # # # # # # # ### # #
# # # # # # # # # ^
# # # #### # # ## #
0 1
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## ### ## # ### # # ##
# # # # # # # # ### # #
# # # # # # # # # >
# # # #### # # ## #
0 1
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## ### ## # ### # # ##
# # # # # # # # ### # #
# # # # # # # # #
# # # #### # # ## # v
0 0
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## ### ## # ### # # ##
# # # # # # # # ### # #
# # # # # # # # #
# # # #### # # ## # >
0 0
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## ### ## # ### # # ##
# # # # # # # # ### # #
# # # # # # # # # ^
# # # #### # # ## #
0 1
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## ### ## # ### # # ##
# # # # # # # # ### # #
# # # # # # # # # >
# # # #### # # ## #
1 1
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## ### ## # ### # # ##
# # # # # # # # ### # #
# # # # # # # # # #
# # # #### # # ## # v
1 0
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## ### ## # ### # # ##
# # # # # # # # ### # #
# # # # # # # # # #
# # # #### # # ## # #>
0 0
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## ### ## # ### # # ##
# # # # # # # # ### # #
# # # # # # # # # #^
# # # #### # # ## # #
0 1
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## ### ## # ### # # ##
# # # # # # # # ### # #
# # # # # # # # # # >
# # # #### # # ## # #
1 1
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## ### ## # ### # # ##
# # # # # # # # ### # #
# # # # # # # # # # #
# # # #### # # ## # # v
0 0
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## ### ## # ### # # ##
# # # # # # # # ### # #
# # # # # # # # # # #
# # # #### # # ## # # >
1 0
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## ### ## # ### # # ##
# # # # # # # # ### # #
# # # # # # # # # # #^
# # # #### # # ## # # #
0 1
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## ### ## # ### # # ##
# # # # # # # # ### # #
# # # # # # # # # # # >
# # # #### # # ## # # #
0 1
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## ### ## # ### # # ##
# # # # # # # # ### # #
# # # # # # # # # # #
# # # #### # # ## # # #v
0 0
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## ### ## # ### # # ##
# # # # # # # # ### # #
# # # # # # # # # # #
# # # #### # # ## # # # >
1 0
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## ### ## # ### # # ##
# # # # # # # # ### # #
# # # # # # # # # # # ^
# # # #### # # ## # # # #
1 1
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## ### ## # ### # # ##
# # # # # # # # ### # #
# # # # # # # # # # # #>
# # # #### # # ## # # # #
0 1
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## ### ## # ### # # ##
# # # # # # # # ### # #
# # # # # # # # # # # #
# # # #### # # ## # # # #v
0 0
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## ### ## # ### # # ##
# # # # # # # # ### # #
# # # # # # # # # # # #
# # # #### # # ## # # # # >
0 0
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## ### ## # ### # # ##
# # # # # # # # ### # #
# # # # # # # # # # # # ^
# # # #### # # ## # # # #
1 1
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## ### ## # ### # # ##
# # # # # # # # ### # #
# # # # # # # # # # # # #>
# # # #### # # ## # # # #
0 1
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## ### ## # ### # # ##
# # # # # # # # ### # #
# # # # # # # # # # # # #
# # # #### # # ## # # # # v
1 0
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## ### ## # ### # # ##
# # # # # # # # ### # #
# # # # # # # # # # # # #
# # # #### # # ## # # # # #>
0 0
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## ### ## # ### # # ##
# # # # # # # # ### # #
# # # # # # # # # # # # # ^
# # # #### # # ## # # # # #
0 1
#### # # #### # # ## #### ### # #
# # # # # # # # # # # # #
### ## ### ## # ### # # ##
# # # # # # # # ### # #
# # # # # # # # # # # # # >
# # # #### # # ## # # # # #