174 lines
5.9 KiB
Python
174 lines
5.9 KiB
Python
with open("input_day10.txt",encoding='utf-8') as file:
|
|
y_arr = [line.rstrip() for line in file]
|
|
|
|
class mato_Vector2:
|
|
def __init__(self,x,y):
|
|
self.x = x
|
|
self.y = y
|
|
def __str__(self):
|
|
return f"({self.x},{self.y})"
|
|
def as_tuple(self):
|
|
return (self.x,self.y)
|
|
def add_Vector2(self,vec):
|
|
#self.x += vec.x
|
|
#self.y += vec.y
|
|
new_vector = mato_Vector2(self.x + vec.x, self.y+vec.y)
|
|
return new_vector
|
|
def add(self,x,y):
|
|
#self.x += x
|
|
#self.y += y
|
|
new_vector = mato_Vector2(self.x + x, self.y+y)
|
|
return new_vector
|
|
def __eq__(self, other: object) -> bool:
|
|
if self.x == other.x and self.y == other.y:
|
|
return True
|
|
return False
|
|
|
|
maze = [[0 for x in range(len(y_arr)) ] for y in range(len(y_arr))]
|
|
|
|
starting_pos = mato_Vector2(0,0)
|
|
start_x = 0
|
|
for y in range(len(y_arr)):
|
|
for x in range(len(y_arr[y])):
|
|
maze[y][x] = y_arr[y][x]
|
|
if maze[y][x] == "S":
|
|
starting_pos = mato_Vector2(x,y)
|
|
#print(maze[y][x],end="")
|
|
#print()
|
|
|
|
print(starting_pos)
|
|
current_pos = starting_pos
|
|
|
|
#now go through the pipes in the right (literally in step 0) direction!
|
|
step = 0
|
|
|
|
alive = True
|
|
while alive:
|
|
if step==0:
|
|
#first step, go right bc im cool :3
|
|
delta_pos = mato_Vector2(1,0)
|
|
last_pos = current_pos
|
|
current_pos = current_pos.add_Vector2(delta_pos)
|
|
step+=1
|
|
else:
|
|
# step is not 0 so do normal stuff bc thats what normal programs do
|
|
# first check what current block is
|
|
print(f"{starting_pos} {current_pos} {step}")
|
|
current_block = maze[current_pos.y][current_pos.x]
|
|
match current_block:
|
|
case '┃':
|
|
#check bottom
|
|
if last_pos==current_pos.add(0,1):
|
|
delta_pos = mato_Vector2(0,-1)
|
|
#check top
|
|
if last_pos==current_pos.add(0,-1):
|
|
delta_pos = mato_Vector2(0,1)
|
|
case '━':
|
|
# last position is left
|
|
if last_pos==current_pos.add(-1,0):
|
|
delta_pos = mato_Vector2(1,0)
|
|
# check right
|
|
if last_pos==current_pos.add(1,0):
|
|
delta_pos = mato_Vector2(-1,0)
|
|
case '┛':
|
|
# check left
|
|
if last_pos==current_pos.add(-1,0):
|
|
delta_pos = mato_Vector2(0,-1)
|
|
#check top
|
|
if last_pos==current_pos.add(0,-1):
|
|
delta_pos = mato_Vector2(-1,0)
|
|
case '┓':
|
|
# check left
|
|
if last_pos==current_pos.add(-1,0):
|
|
delta_pos = mato_Vector2(0,1)
|
|
#check bottom
|
|
if last_pos==current_pos.add(0,1):
|
|
delta_pos = mato_Vector2(-1,0)
|
|
case '┗':
|
|
# check right
|
|
if last_pos==current_pos.add(1,0):
|
|
delta_pos = mato_Vector2(0,-1)
|
|
#check top
|
|
if last_pos==current_pos.add(0,-1):
|
|
delta_pos = mato_Vector2(1,0)
|
|
case '┏':
|
|
# check right
|
|
if last_pos==current_pos.add(1,0):
|
|
delta_pos = mato_Vector2(0,1)
|
|
#check bottom
|
|
if last_pos==current_pos.add(0,1):
|
|
delta_pos = mato_Vector2(1,0)
|
|
|
|
#now check next position is valid
|
|
next_pos = mato_Vector2(current_pos.x+delta_pos.x,current_pos.y+delta_pos.y)
|
|
|
|
#if next block pos is start position loop is over, so break
|
|
if next_pos == starting_pos:
|
|
alive = False
|
|
total_length = step+1
|
|
break
|
|
elif next_pos.x < 0 or next_pos.x > 139:
|
|
next_block = '.'
|
|
elif next_pos.y < 0 or next_pos.y > 139:
|
|
next_block = '.'
|
|
else:
|
|
next_block = maze[next_pos.y][next_pos.x]
|
|
|
|
valid = False
|
|
|
|
if next_block == '.':
|
|
break
|
|
|
|
match next_block:
|
|
case '┃':
|
|
#check bottom
|
|
if current_pos==next_pos.add(0,1):
|
|
valid = True
|
|
#check top
|
|
if current_pos==next_pos.add(0,-1):
|
|
valid = True
|
|
case '━':
|
|
# last position is left
|
|
if current_pos==next_pos.add(-1,0):
|
|
valid = True
|
|
# check right
|
|
if current_pos==next_pos.add(1,0):
|
|
valid = True
|
|
case '┛':
|
|
# check left
|
|
if current_pos==next_pos.add(-1,0):
|
|
valid = True
|
|
#check top
|
|
if current_pos==next_pos.add(0,-1):
|
|
valid = True
|
|
case '┓':
|
|
# check left
|
|
if current_pos==next_pos.add(-1,0):
|
|
valid = True
|
|
#check bottom
|
|
if current_pos==next_pos.add(0,1):
|
|
valid = True
|
|
case '┗':
|
|
# check right
|
|
if current_pos==next_pos.add(1,0):
|
|
valid = True
|
|
#check top
|
|
if current_pos==next_pos.add(0,-1):
|
|
valid = True
|
|
case '┏':
|
|
# check right
|
|
if current_pos==next_pos.add(1,0):
|
|
valid = True
|
|
#check bottom
|
|
if current_pos==next_pos.add(0,1):
|
|
valid = True
|
|
if valid == False:
|
|
alive = False
|
|
else:
|
|
#is valid, so update current position
|
|
last_pos = current_pos
|
|
current_pos = current_pos.add_Vector2(delta_pos)
|
|
step += 1
|
|
|
|
result = total_length/2
|
|
print(result) |