[WIP] Solution to problem 4 part 2 in Python

This commit is contained in:
David Doblas Jiménez 2021-11-18 21:39:16 +01:00
parent 65720af19d
commit d9f3206e1d

160
src/P4.py
View File

@ -83,5 +83,165 @@ def part_1() -> None:
print(f"There are {valid_passports} valid passports")
# --- Part Two ---
# The line is moving more quickly now, but you overhear airport security
# talking about how passports with invalid data are getting through. Better add
# some data validation, quick!
# You can continue to ignore the cid field, but each other field has strict
# rules about what values are valid for automatic validation:
# byr (Birth Year) - four digits; at least 1920 and at most 2002.
# iyr (Issue Year) - four digits; at least 2010 and at most 2020.
# eyr (Expiration Year) - four digits; at least 2020 and at most 2030.
# hgt (Height) - a number followed by either cm or in:
# If cm, the number must be at least 150 and at most 193.
# If in, the number must be at least 59 and at most 76.
# hcl (Hair Color) - a # followed by exactly six characters 0-9 or a-f.
# ecl (Eye Color) - exactly one of: amb blu brn gry grn hzl oth.
# pid (Passport ID) - a nine-digit number, including leading zeroes.
# cid (Country ID) - ignored, missing or not.
# Your job is to count the passports where all required fields are both present
# and valid according to the above rules. Here are some example values:
# byr valid: 2002
# byr invalid: 2003
# hgt valid: 60in
# hgt valid: 190cm
# hgt invalid: 190in
# hgt invalid: 190
# hcl valid: #123abc
# hcl invalid: #123abz
# hcl invalid: 123abc
# ecl valid: brn
# ecl invalid: wat
# pid valid: 000000001
# pid invalid: 0123456789
# Here are some invalid passports:
# 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
# Here are some valid passports:
# 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
# Count the number of valid passports - those that have all required fields and
# valid values. Continue to treat cid as optional. In your batch file, how many
# passports are valid?
# def is_valid(field: str) -> bool:
# # print(f"checking {field}")
# if field[:3] == "byr" and len(field[4:]) == 4:
# # print("byr?")
# if int(field[4:]) > 1920 or int(field[4:]) < 2002:
# # print("passed")
# return True
# if field[:3] == "iyr" and len(field[4:]) == 4:
# # print("iyr?")
# if int(field[4:]) > 2010 or int(field[4:]) < 2020:
# # print("passed")
# return True
# if field[:3] == "eyr" and len(field[4:]) == 4:
# # print("eyr?")
# if int(field[4:]) > 2020 or int(field[4:]) < 2030:
# # print("passed")
# return True
# if (
# field[:3] == "hgt"
# and len(field[4:-2]) > 0
# and type(int(field[4:-2])) == int
# ):
# # print("hgt?")
# if field[-2:] == "cm":
# # print("cm?")
# if int(field[4:-2]) > 150 or int(field[4:-2]) < 193:
# # print("passed")
# return True
# if field[-2:] == "in":
# # print("in?")
# if int(field[4:-2]) > 59 or int(field[4:-2]) < 76:
# # print("passed")
# return True
# if field[:3] == "hcl" and len(field[4:]) == 7:
# # print("hcl?")
# valid_char = 0
# for c in field[5:]:
# if c in "0123456789abcdef":
# valid_char += 1
# if valid_char == 6:
# # print("passed")
# return True
# if field[:3] == "ecl":
# # print("ecl?")
# if field[4:] in ["amb", "blu", "brn", "gry", "grn", "hzl", "oth"]:
# # print("passed")
# return True
# if field[:3] == "pid":
# # print("pid?")
# if len(field[4:]) == 9 and field[4:].isdigit():
# # print("passed")
# return True
# def part_2() -> None:
# valid_passports = 0
# for passport in passports:
# if len(passport) > 7:
# # print(f"checking passport: {passport}")
# valid_fields = 0
# for field in passport:
# if is_valid(field):
# valid_fields += 1
# if valid_fields > 7:
# # print("passed")
# valid_passports += 1
# if len(passport) == 7:
# # print(f"checking passport: {passport}")
# valid_fields = 0
# for field in passport:
# if is_valid(field):
# valid_fields += 1
# if "cid" in field:
# pass
# if valid_fields == 7:
# # print("valid passport")
# valid_passports += 1
# # break
# print(f"There are {valid_passports} valid passports")
if __name__ == "__main__":
part_1()
# part_2()