From 1d187ed320e146f52ae584b9382b6923d29baa73 Mon Sep 17 00:00:00 2001 From: Frederik Baerentsen Date: Tue, 19 Dec 2023 20:26:34 -0500 Subject: [PATCH] Working on 2023-12-19 p1 --- 2023/day19/part1.py | 191 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 191 insertions(+) create mode 100644 2023/day19/part1.py diff --git a/2023/day19/part1.py b/2023/day19/part1.py new file mode 100644 index 0000000..5b57e5a --- /dev/null +++ b/2023/day19/part1.py @@ -0,0 +1,191 @@ +import sys +import os +from pprint import pprint +import time +import operator + +from shapely.geometry import Point +from shapely.geometry.polygon import Polygon +import shapely + +import numpy as np + +from matplotlib.path import Path +import sympy +#colors +from termcolor import colored + +start_time = time.time() + +def p(x,inside): + for idx,i in enumerate(x): + for jdx,j in enumerate(i): + + #if j == '#': + # print(colored(j,'red'),end='') + #if (idx,jdx) in steps: + # print(colored(j,'blue'),end='') + if (idx,jdx) in inside: + print(colored(j,'green'),end='') + else: + print(j,end='') + print() + +input_f = '' +if len(sys.argv) == 1: + input_f = 'test' +else: + input_f = sys.argv[1] + +grid = [] + +with open(input_f) as file: + for line in file: + grid.append(line.rstrip().split()) + + +workflow = {} +ratings = [] +tmp_workflow = [] +tmp_ratings = [] + +for i in grid: + if i == []: + tmp_workflow = tmp_ratings + tmp_ratings = [] + else: + tmp_ratings.append(i) + + +for i in tmp_workflow: + r = i[0].split("{")[0] + p = i[0].split("{")[1][:-1].split(',') + workflow[r] = p + +for i in tmp_ratings: + tmp = [] + for j in i[0][1:-1].split(','): + tmp.append(j[2:]) + ratings.append(tmp) + +current = 'in' + +ops = { + '<': operator.lt, + '>': operator.gt +} + +def follow_workflow(current,ratings): + #print(workflow[current]) + print(current) + + if current == 'A': + return 'A' + elif current == 'R': + return 'R' + else: + for inst in workflow[current]: + # print('Instructions ', inst) + # print(workflow[current]) + if len(workflow[current]) == 2: + end_result = workflow[current][1] + + if '<' in inst or '>' in inst: + number = inst[2:].split(':')[0] + result = inst.split(':')[1] + operator = inst[1] + #print(number,operator,end=' ') + match inst[0]: + case 'x': + #print(ratings[0],end=' ') + if ops[operator](ratings[0],number): + current = result + else: + current = end_result + + case 'm': + #print(ratings[1],end=' ') + + print(operator,ratings[1],number) + + if ops[operator](ratings[1],number): + current = result + else: + current = end_result + + case 'a': + #print(ratings[2],end=' ') + if ops[operator](ratings[2],number): + current = result + else: + current = end_result + + case 's': + #print(ratings[3],end=' ') + if ops[operator](ratings[3],number): + current = result + else: + current = end_result + if current in ('R','A'): + return current + else: + follow_workflow(current,ratings) + + +# for i in ratings: +# print('Working on ', i) +# follow_workflow(current,i) + +ratings = ratings[0] + +found = False + +while current not in ('A','R'): + print(current,end='') + print(' -> ',end='') + #print(workflow[current]) + for idx, inst in enumerate(workflow[current]): + if any(not c.isalnum() for c in inst) and found == False: + if '<' in inst or '>' in inst: + number = inst[2:].split(':')[0] + result = inst.split(':')[1] + operator = inst[1] + match inst[0]: + case 'x': + print('Going X') + if ops[operator](ratings[0],number): + current = result + found = True + else: + current = workflow[current][1] + + case 'm': + print('Going M') + + if ops[operator](ratings[1],number): + current = result + found = True + else: + current = workflow[current][1] + + case 'a': + print('Going A') + if ops[operator](ratings[2],number): + current = result + found = True + else: + current = workflow[current][1] + + case 's': + print('Going S') + if ops[operator](ratings[3],number): + current = result + found = True + else: + current = workflow[current][1] +print(current) + + + + +print("--- %s seconds ---" % (time.time() - start_time))