From 6c18350a39ddb701fe34676a84b91dec0848160a Mon Sep 17 00:00:00 2001 From: Tom van der Lee Date: Fri, 18 Dec 2020 00:49:00 +0100 Subject: Added day 10 --- day10/__init__.py | 74 +++++++++++++++++++++++++++++++++++++++++++++ day10/example.txt | 31 +++++++++++++++++++ day10/input.txt | 90 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 195 insertions(+) create mode 100644 day10/__init__.py create mode 100644 day10/example.txt create mode 100644 day10/input.txt diff --git a/day10/__init__.py b/day10/__init__.py new file mode 100644 index 0000000..62cc5be --- /dev/null +++ b/day10/__init__.py @@ -0,0 +1,74 @@ +from dataclasses import dataclass +from functools import lru_cache, reduce +from typing import List, Generator, Dict, Optional + +from aoc import BaseAssignment + + +class Assignment(BaseAssignment): + def parse_item(self, item: str) -> int: + return int(item) + + +class AssignmentOne(Assignment): + def run(self, input: Generator) -> int: + adapters = sorted(input) + device_adapter = max(adapters) + 3 + + adapter_list = [ + 0, *adapters, device_adapter + ] + + differences = [ + adapter_list[index + 1] - adapter + for index, adapter in enumerate(adapter_list) + if adapter != device_adapter + ] + + return differences.count(1) * differences.count(3) + + +@dataclass +class Node: + value: int + next: List['Node'] + paths: int = 0 + + def __repr__(self): + return str(f'') + + def __post_init__(self): + self.paths = reduce(lambda count, node: count + 1 if len(node.next) == 0 else count + node.paths, self.next, 0) + + +class AssignmentTwo(Assignment): + def generate_graph( + self, input: List, pointers: Dict[int, Node] = None) -> Optional[Node]: + if pointers is None: + pointers = {} + + if len(input) == 0: + return + + value, next = input[0], input[1:] + + pointers[value] = Node(value=value, next=[ + ( + pointers[next_value] + if next_value in pointers + else self.generate_graph( + input=input[index + 1:], + pointers=pointers + ) + ) + for index, next_value in enumerate(next[:3]) + if next_value - value <= 3 + ]) + + return pointers[value] + + def run(self, input: Generator) -> int: + adapters = sorted(input) + device_adapter = max(adapters) + 3 + + return self.generate_graph([0, *adapters, device_adapter]).paths diff --git a/day10/example.txt b/day10/example.txt new file mode 100644 index 0000000..be5c492 --- /dev/null +++ b/day10/example.txt @@ -0,0 +1,31 @@ +28 +33 +18 +42 +31 +14 +46 +20 +48 +47 +24 +23 +49 +45 +19 +38 +39 +11 +1 +32 +25 +35 +8 +17 +7 +9 +4 +2 +34 +10 +3 \ No newline at end of file diff --git a/day10/input.txt b/day10/input.txt new file mode 100644 index 0000000..94a2db6 --- /dev/null +++ b/day10/input.txt @@ -0,0 +1,90 @@ +114 +51 +122 +26 +121 +90 +20 +113 +8 +138 +57 +44 +135 +76 +134 +15 +21 +119 +52 +118 +107 +99 +73 +72 +106 +41 +129 +83 +19 +66 +132 +56 +32 +79 +27 +115 +112 +58 +102 +64 +50 +2 +39 +3 +77 +85 +103 +140 +28 +133 +78 +34 +13 +61 +25 +35 +89 +40 +7 +24 +33 +96 +108 +71 +11 +128 +92 +111 +55 +80 +91 +31 +70 +101 +14 +18 +12 +4 +84 +125 +120 +100 +65 +86 +93 +67 +139 +1 +47 +38 \ No newline at end of file -- cgit v1.2.3