Ejemplo n.º 1
0
import collections
import util


def jolt_differences(adapters):
    adapters = sorted(adapters)
    differences = collections.Counter(adapters[i] -
                                      (adapters[i - 1] if i else 0)
                                      for i in range(0, len(adapters)))
    differences[3] += 1
    return differences[1] * differences[3]


if __name__ == "__main__":
    print(jolt_differences(util.readints()))
Ejemplo n.º 2
0
import day15a
import util

if __name__ == "__main__":
    print(day15a.elfgame(util.readints(), endround=30000000))
Ejemplo n.º 3
0
import functools
import util


def next_possible(adapters, start):
    i = start + 1
    while i < len(adapters) and adapters[i] - adapters[start] <= 3:
        yield i
        i += 1


def count_possible(adapters):
    adapters = sorted(adapters)
    adapters.insert(0, 0)

    @functools.lru_cache
    def count_possible_from(start):
        if start == len(adapters) - 1:
            return 1
        return sum(
            count_possible_from(i) for i in next_possible(adapters, start))

    return count_possible_from(0)


if __name__ == "__main__":
    print(count_possible(util.readints()))
Ejemplo n.º 4
0
import day01a
import util

if __name__ == "__main__":
    print(day01a.day1(util.readints(), 2020, size=3))
Ejemplo n.º 5
0
import util


def say(n, r, n2r):
    prev_r = n2r.get(n, r)
    n2r[n] = r
    return r - prev_r, r + 1


def elfgame(numbers, endround=2020):
    n2r = {}
    r = 1
    for start_n in numbers:
        n, r = say(start_n, r, n2r)
    while r < endround:
        n, r = say(n, r, n2r)
    return n


if __name__ == "__main__":
    print(elfgame(util.readints()))
Ejemplo n.º 6
0
import itertools
import util


def day1(numbers, key, size=2):
    for combination in itertools.combinations(numbers, size):
        if sum(combination) == key:
            return util.prod(combination)
    raise SystemExit("No solution found")


if __name__ == "__main__":
    print(day1(util.readints(), 2020, size=2))
Ejemplo n.º 7
0
import day09a
import util


def find_continuous_set(numbers, target):
    for i in range(len(numbers)):
        total = numbers[i]
        for j in range(i + 1, len(numbers)):
            total += numbers[j]
            if total == target:
                continuous_set = sorted(numbers[i:j + 1])
                return continuous_set[0] + continuous_set[-1]
            if total > target:
                break
    raise SystemExit("No solution found")


if __name__ == "__main__":
    numbers = list(util.readints())
    target = day09a.find_invalid(numbers, 25)
    print(find_continuous_set(numbers, target))