192 lines
3.8 KiB
Python
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))
|