summaryrefslogtreecommitdiffstats
path: root/day4
diff options
context:
space:
mode:
Diffstat (limited to 'day4')
-rw-r--r--day4/__init__.py107
-rw-r--r--day4/example.txt13
-rw-r--r--day4/input.txt1023
3 files changed, 0 insertions, 1143 deletions
diff --git a/day4/__init__.py b/day4/__init__.py
deleted file mode 100644
index 89f697c..0000000
--- a/day4/__init__.py
+++ /dev/null
@@ -1,107 +0,0 @@
1import re
2from dataclasses import dataclass
3from typing import Generator, List
4
5from aoc import BaseAssignment
6
7hgt_matcher = re.compile('(?P<value>\d+)(?P<unit>(in|cm))')
8valid_units = {
9 'cm': {'min': 150, 'max': 193},
10 'in': {'min': 59, 'max': 76}
11}
12
13hcl_matcher = re.compile('#[0-9a-f]{6}')
14
15
16@dataclass
17class Passport:
18 byr: int = None
19 iyr: int = None
20 eyr: int = None
21 hgt: str = None
22 hcl: str = None
23 ecl: str = None
24 pid: str = None
25 cid: str = None
26
27 def __post_init__(self):
28 self.byr = self.byr and int(self.byr)
29 self.iyr = self.iyr and int(self.iyr)
30 self.eyr = self.eyr and int(self.eyr)
31
32
33class Assignment(BaseAssignment):
34 def create_passport(self, items: List[List]) -> Passport:
35 return Passport(**dict(items))
36
37 def read_input(self, example=False) -> Generator:
38 passport = []
39
40 for item in super().read_input(example):
41 if item == '':
42 yield self.create_passport(passport)
43 passport = []
44 continue
45
46 for field in item.split(' '):
47 passport.append(field.split(':'))
48
49 yield self.create_passport(passport)
50
51 def valid_passport(self, passport: Passport):
52 raise NotImplementedError('Please implement valid_passport')
53
54 def run(self, input: Generator):
55 valid_passports = 0
56 for passport in input:
57 if self.valid_passport(passport):
58 valid_passports += 1
59 return valid_passports
60
61
62class AssignmentOne(Assignment):
63 def valid_passport(self, passport: Passport) -> bool:
64 return all([
65 val
66 for key, val in vars(passport).items()
67 if key != 'cid'
68 ])
69
70
71class AssignmentTwo(Assignment):
72 def valid_byr(self, byr: int):
73 return byr and 1920 <= byr <= 2002
74
75 def valid_iyr(self, iyr: int):
76 return iyr and 2010 <= iyr <= 2020
77
78 def valid_eyr(self, eyr: int):
79 return eyr and 2020 <= eyr <= 2030
80
81 def valid_hgt(self, hgt: str):
82 try:
83 match = hgt_matcher.match(hgt).groupdict()
84 unit = valid_units[match['unit']]
85 return unit['min'] <= int(match['value']) <= unit['max']
86 except (TypeError, AttributeError):
87 return False
88
89 def valid_hcl(self, hcl: str):
90 return hcl and hcl_matcher.match(hcl)
91
92 def valid_ecl(self, ecl: str):
93 return ecl and ecl in (
94 'amb', 'blu', 'brn', 'gry', 'grn', 'hzl', 'oth'
95 )
96
97 def valid_pid(self, pid: str):
98 return pid and len(pid) == 9
99
100 def valid_passport(self, passport: Passport):
101 return self.valid_byr(passport.byr) \
102 and self.valid_iyr(passport.iyr) \
103 and self.valid_eyr(passport.eyr) \
104 and self.valid_hgt(passport.hgt) \
105 and self.valid_hcl(passport.hcl) \
106 and self.valid_ecl(passport.ecl) \
107 and self.valid_pid(passport.pid)
diff --git a/day4/example.txt b/day4/example.txt
deleted file mode 100644
index 3b38741..0000000
--- a/day4/example.txt
+++ /dev/null
@@ -1,13 +0,0 @@
1ecl:gry pid:860033327 eyr:2020 hcl:#fffffd
2byr:1937 iyr:2017 cid:147 hgt:183cm
3
4iyr:2013 ecl:amb cid:350 eyr:2023 pid:028048884
5hcl:#cfa07d byr:1929
6
7hcl:#ae17e1 iyr:2013
8eyr:2024
9ecl:brn pid:760753108 byr:1931
10hgt:179cm
11
12hcl:#cfa07d eyr:2025 pid:166559648
13iyr:2011 ecl:brn hgt:59in \ No newline at end of file
diff --git a/day4/input.txt b/day4/input.txt
deleted file mode 100644
index ba08163..0000000
--- a/day4/input.txt
+++ /dev/null
@@ -1,1023 +0,0 @@
1ecl:#eef340 eyr:2023 hcl:#c0946f pid:244684338 iyr:2020 cid:57 byr:1969 hgt:152cm
2
3pid:303807545 cid:213 ecl:gry hcl:#fffffd
4eyr:2038 byr:1951
5hgt:171cm iyr:2011
6
7hcl:#c0946f byr:1933 eyr:2025 pid:517067213 hgt:173cm
8ecl:hzl
9iyr:2018
10
11pid:5253256652 byr:2009 hgt:152cm iyr:1989 eyr:1968 hcl:64cb63 ecl:hzl
12
13iyr:2013
14pid:862607211 eyr:2020
15hgt:174cm
16byr:1990
17ecl:blu hcl:#888785
18
19ecl:grn byr:1955
20pid:608098408 eyr:2027 iyr:2020 hcl:#b6652a cid:264
21hgt:181cm
22
23byr:1998 ecl:hzl eyr:2021
24hcl:#866857 hgt:189cm iyr:2030
25pid:013735467
26
27pid:075417314 hcl:#b6652a byr:1957
28iyr:2011
29hgt:154cm
30eyr:2025
31ecl:amb
32
33iyr:1993 hgt:74cm eyr:1960
34byr:2029
35hcl:293244 ecl:#3cb5e5 pid:4861232363
36
37hgt:153cm hcl:#6b5442 pid:065240897 byr:1932
38cid:196 ecl:blu eyr:2028 iyr:2019
39
40eyr:2024 ecl:amb
41hcl:#866857 byr:1922 pid:496904942 hgt:164cm iyr:2020
42
43pid:847705161 byr:1951 cid:124 iyr:1991
44eyr:2028 ecl:dne
45hcl:6b2d28 hgt:172cm
46
47byr:2007 iyr:2029 ecl:hzl eyr:2026 hgt:168in
48hcl:z
49pid:63151612
50
51iyr:2027 hgt:172in
52cid:174 byr:2014 hcl:z eyr:1921
53ecl:grt pid:#cebdc2
54
55ecl:amb hcl:#d09c0f
56iyr:2015 hgt:156cm eyr:2026 byr:1962
57pid:086120872
58
59cid:125
60pid:837849996
61byr:1958 ecl:brn hgt:166cm hcl:#ceb3a1 eyr:2028 iyr:2012
62
63ecl:gry hgt:180cm
64pid:939059935 eyr:2023 byr:1977 hcl:#b6652a
65
66hgt:190in byr:2029 eyr:1984
67ecl:gry hcl:z pid:055092916 iyr:2010
68
69hgt:63in ecl:blu byr:1940 iyr:2012 eyr:2029 hcl:#7d3b0c
70pid:163033394
71
72eyr:2040 pid:181cm
73iyr:1928 hgt:76cm hcl:d8aafb byr:1949 cid:275 ecl:xry
74
75hcl:#cfa07d ecl:oth byr:1948 eyr:2021
76pid:719690182 hgt:179cm iyr:2020
77
78byr:1939 cid:266
79eyr:2026 iyr:2017 hcl:#f116d2
80ecl:hzl pid:522421825
81hgt:68in
82
83hcl:z hgt:61in
84cid:115 pid:180cm iyr:2030 byr:2014 eyr:2032 ecl:hzl
85
86ecl:xry
87eyr:2028 pid:191cm iyr:2015 hgt:150cm byr:2029
88
89eyr:2027
90hcl:#a97842 pid:997937480 hgt:61in iyr:2019
91byr:1921
92ecl:grn
93
94hgt:163cm
95pid:912318455 iyr:2016 byr:1988 ecl:brn hcl:#a97842 cid:221 eyr:2029
96
97cid:333 hcl:#c0946f
98hgt:163cm iyr:2018 eyr:2027 ecl:oth
99
100cid:70 hcl:#c0946f
101pid:961507902 byr:1949 ecl:grn iyr:2017 eyr:2029 hgt:69in
102
103hgt:169cm ecl:amb
104iyr:2013 pid:496169901
105byr:1943 eyr:2028 hcl:#ceb3a1
106cid:249
107
108ecl:blu cid:343
109iyr:1998 hgt:154in hcl:#efcc98 byr:1972
110
111pid:508213120 iyr:2012 eyr:2025 hcl:z hgt:70cm byr:1976
112ecl:brn
113
114iyr:1924
115eyr:2005
116hcl:z
117hgt:167 pid:154cm
118byr:2007
119
120pid:761333244 hgt:180cm iyr:2017 hcl:#18171d eyr:2021
121byr:1983
122cid:67 ecl:oth
123
124eyr:1993
125byr:2003
126hcl:#602927
127ecl:grt
128cid:84 hgt:178
129pid:1847086637 iyr:2026
130