Add advent code for 2020 days 1-4
This commit is contained in:
parent
2c466792a4
commit
948009891a
12 changed files with 256 additions and 0 deletions
8
day_4/info.md
Normal file
8
day_4/info.md
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
https://adventofcode.com/2020/day/4
|
||||
|
||||
|
||||
Part 1 Wrong Answers:
|
||||
- `260` (too low)
|
||||
|
||||
Part 2 Wrong Answers:
|
||||
- `225` (too high)
|
||||
25
day_4/part_1.py
Normal file
25
day_4/part_1.py
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
with open("input") as f:
|
||||
data = [x.replace("\n", " ") for x in f.read().split("\n\n")]
|
||||
|
||||
# The fields that passports have, if True, it's required, if False, it's an
|
||||
# optional field
|
||||
fields = {
|
||||
"byr": True,
|
||||
"iyr": True,
|
||||
"eyr": True,
|
||||
"hgt": True,
|
||||
"hcl": True,
|
||||
"ecl": True,
|
||||
"pid": True,
|
||||
"cid": False
|
||||
}
|
||||
|
||||
valid_passports = len(data)
|
||||
|
||||
for passport in data:
|
||||
for field, required in fields.items():
|
||||
if field not in passport and required:
|
||||
valid_passports -= 1
|
||||
break
|
||||
|
||||
print(f"Valid Passports: {valid_passports}")
|
||||
84
day_4/part_2.py
Normal file
84
day_4/part_2.py
Normal file
|
|
@ -0,0 +1,84 @@
|
|||
import re
|
||||
|
||||
with open("input") as f:
|
||||
data = [x.replace("\n", " ") for x in f.read().split("\n\n")]
|
||||
|
||||
# The fields that passports have
|
||||
fields = [
|
||||
"byr",
|
||||
"iyr",
|
||||
"eyr",
|
||||
"hgt",
|
||||
"hcl",
|
||||
"ecl",
|
||||
"pid"
|
||||
]
|
||||
|
||||
def year_validate(min, provided, max):
|
||||
return int(min) <= int(provided) <= int(max)
|
||||
|
||||
def size_validate(height):
|
||||
if height.endswith("cm"):
|
||||
return 150 <= int(height[:-2]) <= 193
|
||||
elif height.endswith("in"):
|
||||
return 59 <= int(height[:-2]) <= 76
|
||||
return False
|
||||
|
||||
def hair_validate(colour):
|
||||
return re.match(r"#[\w]{6}", str(colour)) != None
|
||||
|
||||
def eye_validate(colour):
|
||||
return colour in ("amb", "blu", "brn", "gry", "grn", "hzl", "oth")
|
||||
|
||||
def pid_validate(id):
|
||||
return re.match(r"^[0-9]{9}$", str(id)) != None
|
||||
|
||||
valid_passports = 0
|
||||
|
||||
# Check all the passports for valid data
|
||||
for passport in data:
|
||||
valid = True
|
||||
|
||||
# Check each required field
|
||||
for field in fields:
|
||||
|
||||
# Ensure passport has field
|
||||
if (i := passport.find(field)) != -1:
|
||||
value = passport[i:].split(" ")[0].split(":")[1]
|
||||
|
||||
if field == "byr":
|
||||
if not year_validate(1920, value, 2002):
|
||||
valid = False
|
||||
break
|
||||
elif field == "iyr":
|
||||
if not year_validate(2010, value, 2020):
|
||||
valid = False
|
||||
break
|
||||
elif field == "eyr":
|
||||
if not year_validate(2020, value, 2030):
|
||||
valid = False
|
||||
break
|
||||
elif field == "hgt":
|
||||
if not size_validate(value):
|
||||
valid = False
|
||||
break
|
||||
elif field == "hcl":
|
||||
if not hair_validate(value):
|
||||
valid = False
|
||||
break
|
||||
elif field == "ecl":
|
||||
if not eye_validate(value):
|
||||
valid = False
|
||||
break
|
||||
elif field == "pid":
|
||||
if not pid_validate(value):
|
||||
valid = False
|
||||
break
|
||||
else:
|
||||
valid = False
|
||||
|
||||
if valid:
|
||||
valid_passports += 1
|
||||
|
||||
|
||||
print(f"Valid Passports: {valid_passports}")
|
||||
Loading…
Add table
Add a link
Reference in a new issue