コード例 #1
0
ファイル: day2.py プロジェクト: V-Wong/advent-of-code-2020

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))
コード例 #2
0
ファイル: day5.py プロジェクト: V-Wong/advent-of-code-2020
    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))
コード例 #3
0
    "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)))
コード例 #4
0
ファイル: day3.py プロジェクト: V-Wong/advent-of-code-2020
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))
コード例 #5
0
ファイル: day1.py プロジェクト: V-Wong/advent-of-code-2020
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]))