From d98dac2c05cea742ad4a9565aad0c7d08e70edff Mon Sep 17 00:00:00 2001 From: daviddoji Date: Mon, 11 Apr 2022 20:49:21 +0200 Subject: [PATCH] Solution to problem 8 in Python --- src/Year_2021/P8.py | 115 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 115 insertions(+) diff --git a/src/Year_2021/P8.py b/src/Year_2021/P8.py index a14e0a9..6df9384 100644 --- a/src/Year_2021/P8.py +++ b/src/Year_2021/P8.py @@ -106,6 +106,8 @@ # In the output values, how many times do digits 1, 4, 7, or 8 appear? +from ast import Num + with open("files/P8.txt") as f: output = [line for line in f.read().strip().split("\n")] @@ -124,5 +126,118 @@ def part_1() -> None: print(f"There are {easy_digits} ocurrences in the output values") +# --- Part Two --- + +# Through a little deduction, you should now be able to determine the remaining +# digits. Consider again the first example above: + +# acedgfb cdfbe gcdfa fbcad dab cefabd cdfgeb eafb cagedb ab | +# cdfeb fcadb cdfeb cdbaf + +# After some careful analysis, the mapping between signal wires and segments +# only make sense in the following configuration: + +# dddd +# e a +# e a +# ffff +# g b +# g b +# cccc + +# So, the unique signal patterns would correspond to the following digits: + +# acedgfb: 8 +# cdfbe: 5 +# gcdfa: 2 +# fbcad: 3 +# dab: 7 +# cefabd: 9 +# cdfgeb: 6 +# eafb: 4 +# cagedb: 0 +# ab: 1 + +# Then, the four digits of the output value can be decoded: + +# cdfeb: 5 +# fcadb: 3 +# cdfeb: 5 +# cdbaf: 3 + +# Therefore, the output value for this entry is 5353. + +# Following this same process for each entry in the second, larger example +# above, the output value of each entry can be determined: + +# fdgacbe cefdb cefbgd gcbe: 8394 +# fcgedb cgb dgebacf gc: 9781 +# cg cg fdcagb cbg: 1197 +# efabcd cedba gadfec cb: 9361 +# gecf egdcabf bgf bfgea: 4873 +# gebdcfa ecba ca fadegcb: 8418 +# cefg dcbef fcge gbcadfe: 4548 +# ed bcgafe cdgba cbgef: 1625 +# gbdfcae bgc cg cgb: 8717 +# fgae cfgab fg bagce: 4315 + +# Adding all of the output values in this larger example produces 61229. + +# For each entry, determine all of the wire/segment connections and decode the +# four-digit output values. What do you get if you add up all of the output +# values? + + +def solve_line(numbers: str) -> dict[str, list[str]]: + numbers_dic = {} + for num in numbers.split(" "): + # first populate with easy numbers + if len(num) == 2: + numbers_dic["1"] = sorted(num) + elif len(num) == 3: + numbers_dic["7"] = sorted(num) + elif len(num) == 4: + numbers_dic["4"] = sorted(num) + elif len(num) == 7: + numbers_dic["8"] = sorted(num) + # populate with subsets of easy numbers + for num in numbers.split(" "): + if len(num) == 6: + if set(numbers_dic["4"]).issubset(set(num)): + numbers_dic["9"] = sorted(num) + elif set(numbers_dic["1"]).issubset(set(num)): + numbers_dic["0"] = sorted(num) + else: + numbers_dic["6"] = sorted(num) + # missing numbers of length 5 + for num in numbers.split(" "): + if len(num) == 5: + if set(num).issubset(set(numbers_dic["6"])): + numbers_dic["5"] = sorted(num) + elif set(numbers_dic["1"]).issubset(set(num)): + numbers_dic["3"] = sorted(num) + else: + numbers_dic["2"] = sorted(num) + + return numbers_dic + + +def part_2() -> None: + decoded_output = 0 + for line in output: + patterns, out_val = line.split(" | ") + _numbers_dic = solve_line(patterns) + entry_value = [] + for out in out_val.split(" "): + for k, v in _numbers_dic.items(): + if sorted(out) == v: + entry_value.append(k) + + decoded_output += int("".join(entry_value)) + + print(f"All the output values sum {decoded_output}") + + if __name__ == "__main__": part_1() + part_2()