advent2020/sixteen.py

81 lines
2.0 KiB
Python
Executable File

#!/usr/bin/env python3
from functools import reduce
import re, sys
import math
import numpy as np
def tpl(l):
#'departure location: 33-679 or 691-971'
#f = re.findall(r'(.*): ((\d*)-(\d*)( or )?)*', l)
#print(dir(f))
#exit()
name, ranges = l.split(': ')
ranges = ranges.split(' or ')
rang = [r.split('-') for r in ranges]
return name, *[range(int(a), int(b) + 1) for a, b in rang]
def gentable(three):
d = {}
for _, a, b in three:
for i in a:
d[i] = True
for i in b:
d[i] = True
return d
def table(three):
d = {}
for j, a, b in three:
d[j] = {}
for i in a:
d[j][i] = True
for i in b:
d[j][i] = True
return d
def good(t, d):
return all(n in d for n in t)
fn = sys.argv[1] if len(sys.argv) > 1 else 'input%s' % 16
with open(fn) as f:
lines = [l.strip() for l in f.readlines()]
pgphs = f.read().split('\n\n')
rang = [tpl(l) for l in lines[:20]]
gend = gentable(rang)
tickets = [[int(i) for i in l.split(',')] for l in lines[25:]]
tot = 0
gockets = [t for t in tickets if good(t, gend)]
print(len(gockets), '/', len(tickets))
d = table(rang)
cols = []
for i, col in enumerate(zip(*gockets)):
cols += [[]]
for cat in d:
#print(d[cat])
#print(col)
if(good(col, d[cat])):
cols[i] += [cat,]
for c in cols:
print(c)
done = [False for c in cols]
while not all(done):
for i, _ in enumerate(cols):
if not done[i] and len(cols[i]) == 1:
done[i] = True
for j, cc in enumerate(cols):
if not done[j]:
cols[j] = set(cols[j]) - set(cols[i])
break
for c in cols:
print(c)
me = [int(x) for x in lines[22].split(',')]
print(len(me), len(cols))
print(reduce(lambda a,b:a*b, [me[i] for i, c in enumerate(cols) if \
c.copy().pop()[:9] == 'departure']))