54 lines
1.3 KiB
Python
54 lines
1.3 KiB
Python
|
with open("input") as f:
|
||
|
content = [x.strip() for x in f]
|
||
|
|
||
|
def parse_rule(rule):
|
||
|
name, rest = rule.split(": ")
|
||
|
rule1, rule2 = rest.split(" or ")
|
||
|
rules = []
|
||
|
for i in rule1, rule2:
|
||
|
mi, ma = i.split("-")
|
||
|
rules.append((int(mi), int(ma)))
|
||
|
|
||
|
return name, rules
|
||
|
|
||
|
def validate_rule(rule, value):
|
||
|
validates = False
|
||
|
for r in rule:
|
||
|
mi, ma = r
|
||
|
if value >= mi and value <= ma:
|
||
|
validates = True
|
||
|
return validates
|
||
|
|
||
|
part = 0
|
||
|
rules = {}
|
||
|
othertickets = []
|
||
|
myticket = []
|
||
|
for c in content:
|
||
|
if not c:
|
||
|
part += 1
|
||
|
continue
|
||
|
if part == 0: # parsing rules
|
||
|
name, rule = parse_rule(c)
|
||
|
rules[name] = rule
|
||
|
if part == 1: # parsing your ticket
|
||
|
if c.startswith("your ticket"):
|
||
|
continue
|
||
|
myticket = [int(x) for x in c.split(",")]
|
||
|
if part == 2: # parsing other tickets
|
||
|
if c.startswith("nearby tickets"):
|
||
|
continue
|
||
|
othertickets.append([int(x) for x in c.split(",")])
|
||
|
|
||
|
total = 0
|
||
|
for ticket in othertickets:
|
||
|
for value in ticket:
|
||
|
validates = False
|
||
|
for __, rule in rules.items():
|
||
|
if validate_rule(rule, value):
|
||
|
validates = True
|
||
|
break
|
||
|
if not validates:
|
||
|
total += value
|
||
|
|
||
|
print(total)
|