Working on 2023-12-19 p1

This commit is contained in:
Frederik Baerentsen 2023-12-19 20:26:34 -05:00
parent 48918e0077
commit 1d187ed320

191
2023/day19/part1.py Normal file
View File

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