a.py 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. import os, argparse, re
  2. def parse_line(line):
  3. pairs = {}
  4. for m in re.finditer("([^\s:]+):([^\s:]+)", line):
  5. print(f"Found {m.group(1)}:{m.group(2)}")
  6. pairs[m.group(1)] = m.group(2)
  7. return pairs
  8. def validate_number(val, min, max):
  9. if not re.match("^\d{4}$", val):
  10. return False
  11. if int(val) < min or int(val) > max:
  12. return False
  13. return True
  14. def validate_height(val):
  15. m = re.match("^(\d+)(cm|in)$", val)
  16. if not m:
  17. return False
  18. len = int(m.group(1))
  19. if m.group(2) == "cm":
  20. if len >= 150 and len <= 193:
  21. return True
  22. elif m.group(2) == "in":
  23. if len >= 59 and len <= 76:
  24. return True
  25. return False
  26. def validate_hair_color(val):
  27. m = re.match("^#[\da-f]{6}$", val)
  28. if not m:
  29. return False
  30. return True
  31. def validate_eye_color(val):
  32. if val not in ["amb", "blu", "brn", "gry", "grn", "hzl", "oth"]:
  33. return False
  34. return True
  35. def validate_passport_number(val):
  36. m = re.match("^\d{9}$", val)
  37. if not m:
  38. return False
  39. return True
  40. def validate_field(key, value):
  41. match key:
  42. case "byr":
  43. return validate_number(value, 1920, 2002)
  44. case "iyr":
  45. return validate_number(value, 2010, 2020)
  46. case "eyr":
  47. return validate_number(value, 2020, 2030)
  48. case "hgt":
  49. return validate_height(value)
  50. case "hcl":
  51. return validate_hair_color(value)
  52. case "ecl":
  53. return validate_eye_color(value)
  54. case "pid":
  55. return validate_passport_number(value)
  56. return False
  57. def validate_passport(passport):
  58. mandatory_fields = ["byr", "iyr", "eyr", "hgt", "hcl", "ecl", "pid"]
  59. for k in mandatory_fields:
  60. if not k in passport:
  61. print(f"Invalid passport! Missing {k}")
  62. return False
  63. if not validate_field(k, passport[k]):
  64. print(f"Invalid field! {k}:{passport[k]}")
  65. return False
  66. print("Passport valid!")
  67. return True
  68. def solve_task(filename):
  69. valid_passports = 0
  70. current_passport = {}
  71. with open(filename) as infile:
  72. for raw_line in infile:
  73. line = raw_line.rstrip()
  74. if line == "":
  75. if validate_passport(current_passport):
  76. valid_passports += 1
  77. print("")
  78. current_passport = {}
  79. continue
  80. current_passport.update(parse_line(line))
  81. if validate_passport(current_passport):
  82. valid_passports += 1
  83. print(f"\nTotal number of valid passports: {valid_passports}")
  84. #os.system("pause")
  85. def parse_arguments():
  86. parser = argparse.ArgumentParser(description="Script that solves the case",epilog="Have a nice day!")
  87. parser.add_argument('filename', nargs='?', default="example.txt", help='Input file')
  88. args = parser.parse_args()
  89. return args
  90. def main():
  91. args = parse_arguments()
  92. solve_task(args.filename)
  93. if __name__ == "__main__":
  94. main()