AdventOfCode/2023/day19/part1.py

192 lines
3.8 KiB
Python

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))