Day 1

For this challenge, we need to find two numbers from our input that sum to 2020, and calculate their multiplication.

In [2]:
def mul(numbers):
    x = 1
    for n in numbers:
        x *= n
    return x
In [3]:
def day_1(nums, N = 2):
    for numbers in itertools.combinations(nums, N):
        if sum(numbers) == 2020:
            return mul(numbers)
In [4]:
day_1(read_numbers("day-1-example.txt"))
Out [4]:
514579
In [5]:
day_1(read_numbers("day-1.txt"))
Out [5]:
224436

Part Two

Part two uses the same input but wants the product of three numbers that add up to 2020.

In [6]:
day_1(read_numbers("day-1.txt"), 3)
Out [6]:
303394260

Day 2

Password rules

Part one

In [7]:
def is_valid(line):
    rule, password = line.split(": ")
    num, letter = rule.split(" ")
    low, high = num.split("-")
    low, high = int(low), int(high)
    
    count = password.count(letter)
    return count >= low and count <= high
In [8]:
def num_valid(path):
    lines = read_lines(path)
    valid_lines = map(is_valid, lines)
    return sum(valid_lines)
In [9]:
num_valid("day-2-example.txt")
num_valid("day-2.txt")
Out [9]:
2
Out [9]:
528

Part two

In [10]:
def is_valid(line):
    rule, pw = line.split(": ")
    num, letter = rule.split(" ")
    pos1, pos2 = num.split("-")
    pos1, pos2 = int(pos1) - 1, int(pos2) - 1
    
    res = int(pw[pos1] == letter)
    res += int(pw[pos2] == letter)
    
    return res == 1
In [11]:
num_valid("day-2.txt")
Out [11]:
497