Advertisement
bob_f

AOC2020D04.py

Sep 23rd, 2024 (edited)
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.27 KB | None | 0 0
  1. import pprint
  2.  
  3. def get_puzzle_input(a_file_name: str) -> list[dict[str, str]]:
  4.     passport = dict()
  5.     passports: list[dict[str, str]] = []
  6.     passport_chunks: list[str] = []
  7.  
  8.     def get_passport(a_passport_chunks: list[str]) -> dict[str, str]:
  9.         passport_line = ' '.join(a_passport_chunks)
  10.         return {x[0] : x[1] for x in (t.split(':') for t in passport_line.split()) }
  11.  
  12.     with open(a_file_name) as INFILE:
  13.         passport_lines = [line.strip() for line in INFILE]
  14.  
  15.     for passport_line in passport_lines:
  16.         if passport_line == '':
  17.             passports.append(get_passport(passport_chunks))
  18.             passport_chunks = []
  19.         else:
  20.             passport_chunks.append(passport_line)
  21.  
  22.     if passport_chunks:
  23.         passports.append(get_passport(passport_chunks))
  24.  
  25.     return passports    
  26.  
  27. def is_valid_field(a_passport_field_name: str, a_passport_field_value: str) -> bool:
  28.     is_valid: bool = False
  29.  
  30.     match a_passport_field_name:
  31.         case 'byr':
  32.             if len(a_passport_field_value) != 4:
  33.                 return False
  34.            
  35.             try:
  36.                 byr = int(a_passport_field_value)
  37.                 return True if 1920 <= byr <= 2002 else False
  38.             except ValueError:
  39.                 return False
  40.         case 'iyr':
  41.             if len(a_passport_field_value) != 4:
  42.                 return False
  43.            
  44.             try:
  45.                 byr = int(a_passport_field_value)
  46.                 return True if 2010 <= byr <= 2020 else False
  47.             except ValueError:
  48.                 return False
  49.         case 'eyr':
  50.             if len(a_passport_field_value) != 4:
  51.                 return False
  52.            
  53.             try:
  54.                 byr = int(a_passport_field_value)
  55.                 return True if 2020 <= byr <= 2030 else False
  56.             except ValueError:
  57.                 return False
  58.         case 'hgt':
  59.            
  60.             try:
  61.                 hgt = int(a_passport_field_value[:-2])
  62.             except ValueError:
  63.                 return False
  64.            
  65.             if a_passport_field_value.endswith('cm'):
  66.                 if 150 <= hgt <= 193:
  67.                     return True
  68.                
  69.             if a_passport_field_value.endswith('in'):
  70.                 if 59 <= hgt <= 76:
  71.                     return True
  72.  
  73.         case 'hcl':
  74.             hcl_set = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }
  75.  
  76.             if len(a_passport_field_value) != 7:
  77.                 return False
  78.            
  79.             if (a_passport_field_value[0] == '#'
  80.                 and all(hcl_suffix_char in hcl_set for hcl_suffix_char in a_passport_field_value[1:])):
  81.  
  82.                 return True
  83.  
  84.         case 'ecl':
  85.             if a_passport_field_value in ['amb', 'blu', 'brn', 'gry', 'grn', 'hzl', 'oth']:
  86.                 return True
  87.            
  88.         case 'pid':
  89.             if len(a_passport_field_value) == 9:
  90.                 try:
  91.                     _ = int(a_passport_field_value)
  92.                     return True
  93.                 except ValueError:
  94.                     return False
  95.  
  96.         case 'cid':
  97.             return True                    
  98.  
  99.     return is_valid
  100.  
  101. def is_valid_passport(a_passport: dict[str, str], a_p1_check: bool = True) -> bool:
  102.     is_valid: bool = False
  103.  
  104.     if (len(a_passport) >= 7
  105.         and all(k in a_passport for k in ['byr', 'iyr', 'eyr', 'hgt', 'hcl', 'ecl', 'pid'])):
  106.  
  107.             if a_p1_check:
  108.                 is_valid = True
  109.             else:
  110.                 if (is_valid_field('byr', a_passport['byr'])
  111.                     and is_valid_field('iyr', a_passport['iyr'])
  112.                     and is_valid_field('eyr', a_passport['eyr'])
  113.                     and is_valid_field('hgt', a_passport['hgt'])
  114.                     and is_valid_field('hcl', a_passport['hcl'])
  115.                     and is_valid_field('ecl', a_passport['ecl'])
  116.                     and is_valid_field('pid', a_passport['pid'])):
  117.  
  118.                     is_valid = True
  119.  
  120.     return is_valid
  121.  
  122. passports = get_puzzle_input('aoc_2020/aoc_2020_day_04.txt')
  123.  
  124. print(f"p1={sum([is_valid_passport(passport) for passport in passports])}")
  125. print(f"p2={sum([is_valid_passport(passport, a_p1_check=False) for passport in passports])}")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement