You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
87 lines
2.2 KiB
87 lines
2.2 KiB
import re
|
|
|
|
|
|
def decode_lines(l):
|
|
rules = re.compile(r"(?P<rule>\w+ ?\w+): (?P<lb1>\d+)-(?P<ub1>\d+) or (?P<lb2>\d+)-(?P<ub2>\d+)").findall(l)
|
|
my_ticket = re.compile(r"your ticket:\n(?P<ticket>\d+[,\d+]+)").search(l)
|
|
nearby_tickets = re.compile(r"\n(?P<ticket>\d+[,\d+]+)").findall(l)
|
|
|
|
return rules, my_ticket.group('ticket'), nearby_tickets[1:]
|
|
|
|
|
|
def is_valid(ticket):
|
|
|
|
count = 0
|
|
|
|
for value in ticket:
|
|
valid = False
|
|
for rule in rules:
|
|
if int(rule[1]) <= int(value) <= int(rule[2]) or int(rule[3]) <= int(value) <= int(rule[4]):
|
|
valid = True
|
|
if not valid:
|
|
count += int(value)
|
|
return count
|
|
|
|
|
|
def find_rule(rule):
|
|
for i in range(0, len(nt[0])):
|
|
valid = True
|
|
for ticket in nt:
|
|
value = ticket[i]
|
|
if not (int(rule[1]) <= int(value) <= int(rule[2]) or int(rule[3]) <= int(value) <= int(rule[4])):
|
|
valid = False
|
|
if valid: yield i
|
|
|
|
|
|
with open(r"C:\Users\Maya\Desktop\Uni\WS_2021\AoC\input16") as f:
|
|
lines = f.readlines()
|
|
lines = "".join(lines)
|
|
|
|
rules, mine, nearby = decode_lines(lines)
|
|
|
|
nt = [tick.split(',') for tick in nearby]
|
|
|
|
mine = mine.split(',')
|
|
print(mine)
|
|
|
|
scanning_error = 0
|
|
for ticket in nt:
|
|
scanning_error += is_valid(ticket)
|
|
|
|
print(scanning_error)
|
|
|
|
for ticket in nt:
|
|
if is_valid(ticket) > 0:
|
|
nt.remove(ticket)
|
|
|
|
for ticket in nt:
|
|
if is_valid(ticket) > 0:
|
|
nt.remove(ticket)
|
|
|
|
mem = {}
|
|
for rule in rules:
|
|
mem[rule[0]] = [False] * 20
|
|
for r in find_rule(rule):
|
|
mem[rule[0]][r] = True
|
|
|
|
rulebook = {}
|
|
|
|
while True:
|
|
if len(rulebook) == 15: break
|
|
for i in range(0, 20):
|
|
count = 0
|
|
for rule, value in mem.items():
|
|
if value[i]:
|
|
count += 1
|
|
if count == 1:
|
|
for rule, value in mem.items():
|
|
if value[i]:
|
|
rulebook[i] = rule
|
|
mem.pop(rule)
|
|
print(rule)
|
|
break
|
|
|
|
print(rulebook)
|
|
|
|
print(int(mine[19])*int(mine[17])*int(mine[11])*int(mine[8])*int(mine[10])*int(mine[0]))
|
|
|
|
|