summaryrefslogtreecommitdiffstats
path: root/day7/__init__.py
diff options
context:
space:
mode:
authorGravatar Tom van der Lee <tom@vanderlee.io>2021-12-02 17:39:03 +0100
committerGravatar Tom van der Lee <tom@vanderlee.io>2021-12-02 17:39:03 +0100
commit4dec21f362c03136e9811a4f4c162fcd8c50544e (patch)
treecd90c52c7c936fdbe5fc7f22f3f5bf3240faf9a8 /day7/__init__.py
parent37aa8eec0498d7e8491084711132f16db9129a39 (diff)
download2021-4dec21f362c03136e9811a4f4c162fcd8c50544e.tar.gz
2021-4dec21f362c03136e9811a4f4c162fcd8c50544e.tar.bz2
2021-4dec21f362c03136e9811a4f4c162fcd8c50544e.zip
Added day 10
Diffstat (limited to 'day7/__init__.py')
-rw-r--r--day7/__init__.py58
1 files changed, 0 insertions, 58 deletions
diff --git a/day7/__init__.py b/day7/__init__.py
deleted file mode 100644
index 375c67a..0000000
--- a/day7/__init__.py
+++ /dev/null
@@ -1,58 +0,0 @@
1import re
2from functools import lru_cache
3from typing import Iterator, Any, Generator, Dict
4
5from aoc import BaseAssignment
6
7rule_matcher = re.compile(
8 r'(?P<bag>\w+\ \w+) bags contain (?P<contains>no other bags|(((, )?\d \w+\ \w+ bags?)+))\.')
9contains_matcher = re.compile(r'(?P<count>\d+) (?P<bag>\w+\ \w+) bags?')
10
11
12class Assignment(BaseAssignment):
13 def get_bag_contents(self, contents: str) -> dict:
14 content_dict = {}
15 if contents != 'no other bags':
16 for content in contents.split(', '):
17 count = contains_matcher.match(content).groupdict()
18 content_dict[count['bag']] = int(count['count'])
19
20 return content_dict
21
22 def read_input(self, example=False) -> Dict:
23 self.mapping = {}
24
25 for line in super().read_input(example):
26 match = rule_matcher.match(line)
27 rule = match.groupdict()
28 self.mapping[rule['bag']] = self.get_bag_contents(rule['contains'])
29
30
31class AssignmentOne(Assignment):
32 @lru_cache
33 def contains_shiny_gold_bag(self, bag):
34 if 'shiny gold' in self.mapping[bag]:
35 return True
36
37 return any([
38 self.contains_shiny_gold_bag(containing_bag)
39 for containing_bag in self.mapping[bag].keys()
40 ])
41
42 def run(self, input) -> Any:
43 nr_of_possibilities = 0
44 for bag, contains in self.mapping.items():
45 if self.contains_shiny_gold_bag(bag):
46 nr_of_possibilities += 1
47 return nr_of_possibilities
48
49
50class AssignmentTwo(Assignment):
51 def nr_of_bags_inside(self, bag):
52 return sum([
53 count + (count * self.nr_of_bags_inside(containing_bag))
54 for containing_bag, count in self.mapping[bag].items()
55 ])
56
57 def run(self, input) -> Any:
58 return self.nr_of_bags_inside('shiny gold')