#!/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')