Browse Source

Day 4 completed.

master
noirscape 1 year ago
parent
commit
cee0f839de
4 changed files with 2538 additions and 0 deletions
  1. +1168
    -0
      4/puzzle 1/input.txt
  2. +73
    -0
      4/puzzle 1/main.py
  3. +1168
    -0
      4/puzzle 2/input.txt
  4. +129
    -0
      4/puzzle 2/main.py

+ 1168
- 0
4/puzzle 1/input.txt
File diff suppressed because it is too large
View File


+ 73
- 0
4/puzzle 1/main.py View File

@ -0,0 +1,73 @@
handle = open("input.txt", "r")
lines = [line.rstrip() for line in handle.readlines()]
test_lines = [
"ecl:gry pid:860033327 eyr:2020 hcl:#fffffd",
"byr:1937 iyr:2017 cid:147 hgt:183cm",
"",
"iyr:2013 ecl:amb cid:350 eyr:2023 pid:028048884",
"hcl:#cfa07d byr:1929",
"",
"hcl:#ae17e1 iyr:2013",
"eyr:2024",
"ecl:brn pid:760753108 byr:1931",
"hgt:179cm",
"",
"hcl:#cfa07d eyr:2025 pid:166559648",
"iyr:2011 ecl:brn hgt:59in"
]
def get_passports(lines):
lines.append("") # detection bug
split_passport_lines = []
current_passport_fields = []
for item in lines:
if item != "":
current_passport_fields.append(item)
else:
split_passport_lines.append(current_passport_fields)
current_passport_fields = []
passports = []
current_passport = {}
for data_passport in split_passport_lines:
for data_line in data_passport:
items = data_line.split()
for item in items:
key, value = item.split(':')
current_passport[key] = value
passports.append(current_passport)
current_passport = {}
return passports
def validate_passport(passport):
passport_valid = True
if "byr" not in passport:
passport_valid = False
if "cid" not in passport:
pass # Optional!
if "ecl" not in passport:
passport_valid = False
if "eyr" not in passport:
passport_valid = False
if "hcl" not in passport:
passport_valid = False
if "hgt" not in passport:
passport_valid = False
if "iyr" not in passport:
passport_valid = False
if "pid" not in passport:
passport_valid = False
return passport_valid
def main(lines):
passports = get_passports(lines)
valid_passports = 0
for passport in passports:
result = validate_passport(passport)
if result:
valid_passports += 1
print(f"total_passports={len(passports)}")
print(f"{valid_passports=}")
main(lines)
handle.close()

+ 1168
- 0
4/puzzle 2/input.txt
File diff suppressed because it is too large
View File


+ 129
- 0
4/puzzle 2/main.py View File

@ -0,0 +1,129 @@
import re
handle = open("input.txt", "r")
lines = [line.rstrip() for line in handle.readlines()]
invalid_test_lines = [
"eyr:1972 cid:100",
"hcl:#18171d ecl:amb hgt:170 pid:186cm iyr:2018 byr:1926",
"",
"iyr:2019",
"hcl:#602927 eyr:1967 hgt:170cm",
"ecl:grn pid:012533040 byr:1946",
"",
"hcl:dab227 iyr:2012",
"ecl:brn hgt:182cm pid:021572410 eyr:2020 byr:1992 cid:277",
"",
"hgt:59cm ecl:zzz",
"eyr:2038 hcl:74454a iyr:2023",
"pid:3556412378 byr:2007",
]
valid_test_lines = [
"pid:087499704 hgt:74in ecl:grn iyr:2012 eyr:2030 byr:1980",
"hcl:#623a2f",
"",
"eyr:2029 ecl:blu cid:129 byr:1989",
"iyr:2014 pid:896056539 hcl:#a97842 hgt:165cm",
"",
"hcl:#888785",
"hgt:164cm byr:2001 iyr:2015 cid:88",
"pid:545766238 ecl:hzl",
"eyr:2022",
"",
"iyr:2010 hgt:158cm hcl:#b6652a ecl:blu byr:1944 eyr:2021 pid:093154719",
]
def get_passports(lines):
lines.append("") # detection bug
split_passport_lines = []
current_passport_fields = []
for item in lines:
if item != "":
current_passport_fields.append(item)
else:
split_passport_lines.append(current_passport_fields)
current_passport_fields = []
passports = []
current_passport = {}
for data_passport in split_passport_lines:
for data_line in data_passport:
items = data_line.split()
for item in items:
key, value = item.split(':')
current_passport[key] = value
passports.append(current_passport)
current_passport = {}
return passports
def validate_passport(passport):
passport_valid = True
data_validation_check = []
if "byr" not in passport:
passport_valid = False
else: # Data validation!
byr = int(passport["byr"])
data_validation_check.append(1920 <= byr <= 2002)
if "cid" not in passport:
pass # Optional!
if "ecl" not in passport:
passport_valid = False
else:
data_validation_check.append(passport["ecl"] in ["amb", "blu", "brn", "gry", "grn", "hzl", "oth"])
if "eyr" not in passport:
passport_valid = False
else:
eyr = int(passport["eyr"])
data_validation_check.append(2020 <= eyr <= 2030)
if "hcl" not in passport:
passport_valid = False
else:
data_validation_check.append(re.match(r"^#[0-9a-f]{6}$", passport["hcl"]))
if "hgt" not in passport:
passport_valid = False
else:
regex = re.match(r"^(\d+)(in|cm)$", passport["hgt"])
if regex:
groups = regex.groups()
if groups[1] == "cm":
cm = int(groups[0])
data_validation_check.append(150 <= cm <= 193)
elif groups[1] == "in":
inch = int(groups[0])
data_validation_check.append(59 <= inch <= 76)
else:
data_validation_check.append(False)
if "iyr" not in passport:
passport_valid = False
else:
iyr = int(passport["iyr"])
data_validation_check.append(2010 <= iyr <= 2020)
if "pid" not in passport:
passport_valid = False
else:
data_validation_check.append(re.match(r"^[0-9]{9}$", passport["pid"]))
print(data_validation_check)
if not all(data_validation_check):
passport_valid = False
return passport_valid
def main(lines):
passports = get_passports(lines)
valid_passports = 0
for passport in passports:
result = validate_passport(passport)
if result:
valid_passports += 1
print(f"total_passports={len(passports)}")
print(f"{valid_passports=}")
main(lines)
handle.close()

Loading…
Cancel
Save