Solve 2021:8 "Seven Segment Search"
For part 1, it took way longer than necessary since I read the instructions over and over again. Gotta love AOC WOT. Part 2 was a PITA. I got stuck at the last 2 examples since I at the time did not find any clever way to determine which of the 2 outputs for '1' mapped to c and f. Since I already spent far too much time and effort, a try/except with ValueError (digits.index will fail if c and f are flipped wrong) will do for now. There is probably a more efficient and smart way to do this.
This commit is contained in:
parent
69c4518f29
commit
811d2cb224
2 changed files with 179 additions and 0 deletions
113
2021-python/solutions/day_08.py
Normal file
113
2021-python/solutions/day_08.py
Normal file
|
|
@ -0,0 +1,113 @@
|
|||
from solutions import BaseSolution
|
||||
|
||||
|
||||
class Solution(BaseSolution):
|
||||
input_file = "08.txt"
|
||||
|
||||
def __str__(self):
|
||||
return "Day 8: Seven Segment Search"
|
||||
|
||||
def parse_input(self, data):
|
||||
def parse(l):
|
||||
i, o = l.split(" | ")
|
||||
return i.split(), o.split()
|
||||
|
||||
return [parse(l) for l in data.strip().splitlines()]
|
||||
|
||||
def solve(self, puzzle_input):
|
||||
return sum(sum(len(d) in (2, 3, 4, 7) for d in l[1]) for l in puzzle_input)
|
||||
|
||||
def solve_again(self, puzzle_input):
|
||||
digits = [
|
||||
"abcefg",
|
||||
"cf",
|
||||
"acdeg",
|
||||
"acdfg",
|
||||
"bcdf",
|
||||
"abdfg",
|
||||
"abdefg",
|
||||
"acf",
|
||||
"abcdefg",
|
||||
"abcdfg",
|
||||
]
|
||||
outs = []
|
||||
|
||||
def outsum(n):
|
||||
out = ["".join(sorted(n[s] for s in d)) for d in digits]
|
||||
outs.append(
|
||||
int(
|
||||
"".join(
|
||||
map(
|
||||
str,
|
||||
[out.index(i) for i in ["".join(sorted(oo)) for oo in o]],
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
for i, o in puzzle_input:
|
||||
n = {}
|
||||
v1, v7, v4, v8 = sorted(
|
||||
list(filter(lambda o: len(o) in (2, 3, 4, 7), i)), key=lambda x: len(x)
|
||||
)
|
||||
c, f = v1
|
||||
n["a"] = a = (set(v7) - set(v1)).pop()
|
||||
v235 = list(filter(lambda d: len(d) == 5, i))
|
||||
for v in v235:
|
||||
diff = set(v) - set(v4 + a)
|
||||
if len(diff) == 1:
|
||||
n["g"] = g = diff.pop()
|
||||
break
|
||||
n["c"] = c
|
||||
n["f"] = f
|
||||
n["e"] = e = (set(v8) - set(v4 + a + g)).pop()
|
||||
for v in v235:
|
||||
diff = set(v) - set(n.values())
|
||||
if len(diff) == 1:
|
||||
n["d"] = d = diff.pop()
|
||||
break
|
||||
n["b"] = b = (set(v4) - set([d, c, f])).pop()
|
||||
|
||||
try:
|
||||
outsum(n)
|
||||
except ValueError:
|
||||
n["c"] = f
|
||||
n["f"] = c
|
||||
outsum(n)
|
||||
|
||||
return sum(outs)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
solution = Solution()
|
||||
solution.show_results()
|
||||
|
||||
"""
|
||||
dddd
|
||||
e a
|
||||
e a
|
||||
ffff
|
||||
g b
|
||||
g b
|
||||
cccc
|
||||
|
||||
|
||||
0: 1: 2: 3: 4:
|
||||
aaaa .... aaaa aaaa ....
|
||||
b c . c . c . c b c
|
||||
b c . c . c . c b c
|
||||
.... .... dddd dddd dddd
|
||||
e f . f e . . f . f
|
||||
e f . f e . . f . f
|
||||
gggg .... gggg gggg ....
|
||||
|
||||
5: 6: 7: 8: 9:
|
||||
aaaa aaaa aaaa aaaa aaaa
|
||||
b . b . . c b c b c
|
||||
b . b . . c b c b c
|
||||
dddd dddd .... dddd dddd
|
||||
. f e f . f e f . f
|
||||
. f e f . f e f . f
|
||||
gggg gggg .... gggg gggg
|
||||
|
||||
"""
|
||||
66
2021-python/tests/test_day_08.py
Normal file
66
2021-python/tests/test_day_08.py
Normal file
|
|
@ -0,0 +1,66 @@
|
|||
import unittest
|
||||
|
||||
from solutions.day_08 import Solution
|
||||
|
||||
|
||||
class Day08TestCase(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.solution = Solution()
|
||||
self.puzzle_input = self.solution.parse_input(
|
||||
"""
|
||||
|
||||
be cfbegad cbdgef fgaecd cgeb fdcge agebfd fecdb fabcd edb | fdgacbe cefdb cefbgd gcbe
|
||||
edbfga begcd cbg gc gcadebf fbgde acbgfd abcde gfcbed gfec | fcgedb cgb dgebacf gc
|
||||
fgaebd cg bdaec gdafb agbcfd gdcbef bgcad gfac gcb cdgabef | cg cg fdcagb cbg
|
||||
fbegcd cbd adcefb dageb afcb bc aefdc ecdab fgdeca fcdbega | efabcd cedba gadfec cb
|
||||
aecbfdg fbg gf bafeg dbefa fcge gcbea fcaegb dgceab fcbdga | gecf egdcabf bgf bfgea
|
||||
fgeab ca afcebg bdacfeg cfaedg gcfdb baec bfadeg bafgc acf | gebdcfa ecba ca fadegcb
|
||||
dbcfg fgd bdegcaf fgec aegbdf ecdfab fbedc dacgb gdcebf gf | cefg dcbef fcge gbcadfe
|
||||
bdfegc cbegaf gecbf dfcage bdacg ed bedf ced adcbefg gebcd | ed bcgafe cdgba cbgef
|
||||
egadfb cdbfeg cegd fecab cgb gbdefca cg fgcdab egfdb bfceg | gbdfcae bgc cg cgb
|
||||
gcafb gcf dcaebfg ecagb gf abcdeg gaef cafbge fdbac fegbdc | fgae cfgab fg bagce
|
||||
|
||||
"""
|
||||
)
|
||||
|
||||
def test_parse_puzzle_input(self):
|
||||
data = """
|
||||
be cfbegad | fdgacbe cefdb
|
||||
edbfga begcd cbg | fcgedb cgb dgebacf
|
||||
"""
|
||||
assert self.solution.parse_input(data) == [
|
||||
(["be", "cfbegad"], ["fdgacbe", "cefdb"]),
|
||||
(["edbfga", "begcd", "cbg"], ["fcgedb", "cgb", "dgebacf"]),
|
||||
]
|
||||
|
||||
def test_solve_first_part(self):
|
||||
assert self.solution.solve(self.puzzle_input) == 26
|
||||
|
||||
def test_solve_second_part(self):
|
||||
assert (
|
||||
self.solution.solve_again(
|
||||
[
|
||||
(
|
||||
[
|
||||
"acedgfb",
|
||||
"cdfbe",
|
||||
"gcdfa",
|
||||
"fbcad",
|
||||
"dab",
|
||||
"cefabd",
|
||||
"cdfgeb",
|
||||
"eafb",
|
||||
"cagedb",
|
||||
"ab",
|
||||
],
|
||||
["cdfeb", "fcadb", "cdfeb", "cdbaf"],
|
||||
),
|
||||
]
|
||||
)
|
||||
== 5353
|
||||
)
|
||||
assert self.solution.solve_again(self.puzzle_input) == 61229
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
Loading…
Add table
Reference in a new issue