Day 08 (glamorized)

This commit is contained in:
Sebastian Seedorf
2021-12-08 11:30:40 +01:00
parent b9234d03c0
commit a18bb716ba

View File

@@ -21,80 +21,48 @@
# 7 = len(3) # 7 = len(3)
# 4 = len(4) # 4 = len(4)
# 8 = len(7) # 8 = len(7)
# b ==cnt(6) # 3 = len(5) and len(&1)==2 and len(&4)==3
# e ==cnt(4) # 5 = len(5) and len(&1)==1 and len(&4)==3
# bd==4 - 1 # 2 = len(5) and len(&1)==1 and len(&4)==2
# d ==bd - b # 9 = len(6) and len(&1)==2 and len(&4)==4
# 3 = len(5) and len(&1)==2 # 0 = len(6) and len(&1)==2 and len(&4)==3
# 5 = len(5) & b # 6 = len(6) and len(&1)==1 and len(&4)==3
# 2 = len(5) and !3 and !5
# 9 = len(6) & !e
# 0 = len(6) & !d
# 6 = len(6) and !9 and !0
# a=7-1
# f=cnt(9)
# c=cnt(8) and !a
# g=cnt(7) and !d
# a b c d e f g
# 8 6 8 7 4 9 7
from collections import defaultdict, Counter
lines = (x.strip() for x in open("input.txt")) lines = (x.strip() for x in open("input.txt"))
result = 0 result = 0
for line in lines: for line in lines:
input, output = tuple(map(lambda x: x.split(), line.split(' | '))) input, output = tuple(map(lambda x: x.split(), line.split(' | ')))
input.sort(key=len)
numbers = {} numbers = {}
numbers[1] = set(input[0])
# length of the numbers numbers[4] = set(input[2])
lengths = defaultdict(set) numbers[7] = set(input[1])
for x in input: numbers[8] = set(input[9])
lengths[len(x)].add(x) for seg in input:
vals = set(seg)
# count the segments compare = (len(seg), len(numbers[1].intersection(vals)), len(numbers[4].intersection(vals)))
counts = defaultdict(set) if compare == (5, 2, 3):
for k, v in Counter(''.join(input)).items(): numbers[3] = vals
counts[v].add(k) elif compare == (5, 1, 3):
numbers[5] = vals
# easy matching elif compare == (5, 1, 2):
numbers[1] = lengths[2].pop() numbers[2] = vals
numbers[4] = lengths[4].pop() elif compare == (6, 2, 4):
numbers[7] = lengths[3].pop() numbers[9] = vals
numbers[8] = lengths[7].pop() elif compare == (6, 2, 3):
numbers[0] = vals
# necessary segment matching elif compare == (6, 1, 3):
b = counts[6].pop() numbers[6] = vals
e = counts[4].pop()
d = set(numbers[4]).difference(set(numbers[1])).difference({b}).pop()
for len5 in lengths[5]:
# 3
if len(set(len5).intersection(set(numbers[1]))) == 2:
numbers[3] = len5
# 5
if b in set(len5):
numbers[5] = len5
# 2
numbers[2] = lengths[5].difference({numbers[3], numbers[5]}).pop()
for len6 in lengths[6]:
# 0
if d not in set(len6):
numbers[0] = len6
# 9
if e not in set(len6):
numbers[9] = len6
# 6
numbers[6] = lengths[6].difference({numbers[0], numbers[9]}).pop()
# prepare comparison # prepare comparison
numbers = {''.join(sorted(v)): k for k, v in numbers.items()} numbers = {''.join(sorted(v)): k for k, v in numbers.items()}
output = list(''.join(sorted(v)) for v in output) output = (''.join(sorted(v)) for v in output)
# substitute # substitute
substitute = list(numbers[v] for v in output) result += int(''.join(str(numbers[v]) for v in output))
result += int(''.join(map(str, substitute)))
print(numbers, output)
print(result) print(result)