-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathday4.py
More file actions
159 lines (133 loc) · 3.62 KB
/
day4.py
File metadata and controls
159 lines (133 loc) · 3.62 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
import re
import traceback
class Passport(object):
def __init__(self, byr, iyr, eyr, hgt, hcl, ecl, pid, cid=None):
self.byr = byr
self.iyr = iyr
self.eyr = eyr
self.hgt = hgt
self.hcl = hcl
self.ecl = ecl
self.pid = pid
self._cid = cid
def __str__(self):
return str(self.__class__) + ": " + str(self.__dict__)
@property
def byr(self):
return self._byr
@byr.setter
def byr(self, value):
if len(value) == 4 and (1920 <= int(value) <= 2002):
self._byr = value
else:
raise ValueError("invalid byr")
@property
def iyr(self):
return self._iyr
@iyr.setter
def iyr(self, value):
if len(value) == 4 and (2010 <= int(value) <= 2020):
self._iyr = value
else:
raise ValueError("invalid iyr")
@property
def eyr(self):
return self._eyr
@eyr.setter
def eyr(self, value):
if len(value) == 4 and (2020 <= int(value) <= 2030):
self._eyr = value
else:
raise ValueError("invalid eyr")
@property
def hgt(self):
return self._hgt
@hgt.setter
def hgt(self, value):
pattern = r'^\d+cm$|^\d+in$'
valid = re.match(pattern, value)
if valid:
items = re.findall(r'[^\W\d_]+|\d+', value)
num = int(items[0])
unit = items[1]
if unit == "cm":
valid = 150 <= num <= 193
else:
valid = 59 <= num <= 76
if valid:
self._hgt = value
else:
raise ValueError("invalid hgt")
@property
def hcl(self):
return self._hcl
@hgt.setter
def hcl(self, value):
pattern = r'^#[a-f0-9]{6}$'
valid = re.match(pattern, value)
if valid:
self._hcl = value
else:
raise ValueError("invalid hcl")
@property
def ecl(self):
return self._ecl
@ecl.setter
def ecl(self, value):
if value in {'amb', 'blu', 'brn', 'gry', 'grn', 'hzl', 'oth'}:
self._ecl = value
else:
raise ValueError("invalid ecl")
@property
def pid(self):
return self._pid
@pid.setter
def pid(self, value):
if len(value) == 9:
self._ecl = value
else:
raise ValueError("invalid pid")
@property
def cid(self):
return self._cid
f = open('day4input.txt', 'r')
content = f.read()
passports = content.split("\n\n")
cleaned_passports = []
index = 0
passports_numbered = {}
fail = 0
def create_passport_dict(passports):
all = []
for passport in passports:
passport = passport.replace("\n", " ").replace(" ", ",")
entry = passport.split(",")
passport_dict = {}
for pair in entry:
details = pair.split(":")
passport_dict[details[0]] = details[1]
all.append(passport_dict)
return all
cleaned_passports = create_passport_dict(passports)
for passport in cleaned_passports:
if len(passport) < 7:
fail += 1
if len(passport) == 7:
if "cid" in passport:
fail += 1
valid = len(cleaned_passports) - fail
print(valid)
#part 2
for passport_dict in cleaned_passports:
try:
passport_obj = Passport(**passport_dict)
except ValueError as err:
#print(traceback.format_exc())
continue
except TypeError as err:
#print(traceback.format_exc())
continue
passports_numbered[index] = passport_obj
index += 1
total_valid = len(passports_numbered)
print(total_valid)