def count_valid_passwords(lines: List[PasswordPolicy], validator: Callable[[PasswordPolicy], bool]): return sum(1 for line in lines if validator(line)) def validator1(policy: PasswordPolicy): return policy.start <= Counter( policy.password)[policy.character] <= policy.end def validator2(policy: PasswordPolicy): password, character = policy.password, policy.character start, end = policy.start, policy.end return (password[start - 1] == character) ^ (password[end - 1] == character) def parse(policy: str) -> PasswordPolicy: match = re.match(r'(\d+)-(\d+) (\w): (\w+)', policy) return PasswordPolicy(int(match.group(1)), int(match.group(2)), match.group(3), match.group(4)) if __name__ == "__main__": password_policies = reader.read_lines("./input.txt", parse) print(count_valid_passwords(password_policies, validator2))
all_seats = { get_seat_id(seat_position): seat_position for seat_position in all_seat_positions } for row in range(1, ROW_MAX + 1): for col in range(COL_MAX + 1): if (row, col) not in all_seat_positions: seat_id = get_seat_id((row, col)) if seat_id - 1 in all_seats and seat_id + 1 in all_seats: return seat_id if __name__ == "__main__": data = reader.read_lines( "./input.txt", lambda x: str(x).replace("B", INCREASE).replace("R", INCREASE)) passes = [BoardingPass(line[:7], line[7:]) for line in data] # Part 1 print( max( get_seat_id(get_seat_position(boarding_pass)) for boarding_pass in passes)) # Part 2 print(find_own_seat_id(passes))
"pid": lambda id: len(id) == 9 and id.isnumeric(), } def parse_passport(raw_passport: str) -> Dict[str,str]: passport = {} for field in RULES: if match := re.match(f".*{field}:([\S]+)", raw_passport): passport[field] = match.group(1) return passport def is_valid_passport1(passport: Dict[str, str]) -> bool: return all(field in passport for field in RULES) def is_valid_passport2(passport: Dict[str, str]) -> bool: return all(key in passport and RULES[key](passport[key]) for key in RULES) if __name__ == "__main__": data = reader.read_lines("./input.txt", lambda x: str(x).replace("\n", " ") if x != "\n" else x) raw_passports = "".join(data).split("\n") # ugly hack passports = [parse_passport(raw_passport) for raw_passport in raw_passports] print(sum(1 for passport in passports if is_valid_passport1(passport))) print(sum(1 for passport in passports if is_valid_passport2(passport)))
from typing import List import math import reader def count_trees(tree_map: List[str], right: int, down: int) -> int: count = 0 for i in range(len(tree_map) // down): y = i * down x = (right * i) % (len(tree_map[0]) - 1) count += tree_map[y][x] == "#" return count if __name__ == "__main__": data = reader.read_lines("./input.txt") slopes = [(1, 1), (3, 1), (5, 1), (7, 1), (1, 2)] tree_counts = [count_trees(data, right, down) for right, down in slopes] print(math.prod(tree_counts))
def two_sum(nums: List[int], target: int) -> Union[Tuple[int, int], None]: ht = {} for i, v in enumerate(nums): if v in ht: return i, ht[v] else: ht[target - v] = i return None def three_sum(nums: List[int], target: int) -> Union[Tuple[int, int, int], None]: ht = {target - v: i for i, v in enumerate(nums)} for i in range(len(nums) - 1): for j in range(i + 1, len(nums)): pair_sum = nums[i] + nums[j] if pair_sum in ht and ht[pair_sum] not in (i, j): return i, j, ht[pair_sum] return None if __name__ == "__main__": nums = reader.read_lines("./input.txt", int) if (answer := three_sum(nums, 2020)) is not None: print(prod([nums[x] for x in answer]))