100 lines
2.7 KiB
Python
100 lines
2.7 KiB
Python
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*-
|
|
from time import time
|
|
|
|
file = "./input.txt"
|
|
#file = "./ex.txt"
|
|
#file = "./ex_s.txt"
|
|
|
|
start_time = time()
|
|
|
|
def read_input(input_file:str) -> tuple[list[list[str]], list[str]]:
|
|
out_field=[]
|
|
out_moves=[]
|
|
f = open(input_file, "r")
|
|
for line in f:
|
|
line = line.strip()
|
|
if line == "":
|
|
continue
|
|
if "#" in line:
|
|
temp = []
|
|
for b in line:
|
|
temp.append(b)
|
|
out_field.append(temp)
|
|
elif "<" in line or ">" in line or "^" in line or "v" in line:
|
|
out_moves.append(line)
|
|
f.close()
|
|
return out_field, out_moves
|
|
|
|
def get_position(game_field) -> (int, int):
|
|
for li in range(len(game_field)):
|
|
for ro in range(len(game_field[li])):
|
|
if game_field[li][ro] == '@':
|
|
return li, ro
|
|
|
|
def print_field(f:list[list[str]]):
|
|
for r in f:
|
|
for s in r:
|
|
print(s, end="")
|
|
print()
|
|
|
|
def do_move(f:list[list[str]], m:str)-> list[list[str]]:
|
|
li, ro = get_position(f)
|
|
#print(li, ro, m)
|
|
if m == ">":
|
|
for i in range(ro+1, len(f[li])):
|
|
if f[li][i] == '.':
|
|
for ml in range(i,ro,-1):
|
|
f[li][ml] = f[li][ml-1]
|
|
f[li][ro] = '.'
|
|
return f
|
|
elif f[li][i] == '#':
|
|
return f
|
|
elif m == "<":
|
|
for i in range(ro-1, 0, -1):
|
|
if f[li][i] == '.':
|
|
for ml in range(i,ro):
|
|
f[li][ml] = f[li][ml+1]
|
|
f[li][ro] = '.'
|
|
return f
|
|
elif f[li][i] == '#':
|
|
return f
|
|
elif m == "v":
|
|
for i in range(li+1, len(f)):
|
|
if f[i][ro] == '.':
|
|
for mr in range(i,li,-1):
|
|
f[mr][ro] = f[mr-1][ro]
|
|
f[li][ro] = '.'
|
|
return f
|
|
elif f[i][ro] == '#':
|
|
return f
|
|
elif m == "^":
|
|
for i in range(li-1, 0, -1):
|
|
if f[i][ro] == '.':
|
|
for mr in range(i,li):
|
|
f[mr][ro] = f[mr+1][ro]
|
|
f[li][ro] = '.'
|
|
return f
|
|
elif f[i][ro] == '#':
|
|
return f
|
|
return f
|
|
|
|
def sum_gps_coord(f:list[list[str]]):
|
|
result = 0
|
|
for l in range(len(f)):
|
|
for r in range(len(f[l])):
|
|
if f[l][r] == "O":
|
|
result += (100 * l) + r
|
|
return result
|
|
|
|
if __name__ == "__main__":
|
|
field, moves_list = read_input(file)
|
|
print_field(field)
|
|
|
|
for moves in moves_list:
|
|
for move in moves:
|
|
field = do_move(field,move)
|
|
|
|
print_field(field)
|
|
print(f'Solution Part1: {sum_gps_coord(field)}')
|
|
print(f'Runtime: {time()-start_time:.2f} s') |