Пример #1
0
 def test_input(self):
     self.assertEqual(part2(get_input(2015, 2)), 3842356)
Пример #2
0
    r = re.compile(r"(\w+) would (\w+) (\d+) happiness units by sitting next to (\w+).")

    individuals = {}
    pairs = defaultdict(int)

    for line in text.splitlines():
        a, sign, val, b = r.match(line).groups()
        a = individuals.setdefault(a, len(individuals))
        b = individuals.setdefault(b, len(individuals))
        pairs[(1 << a) | (1 << b)] += int(val) if sign == "gain" else -int(val)

    n = len(individuals) + buffer

    return happiness(0, 1)


def part1(text):
    return family(text)


def part2(text):
    return family(text, True)


if __name__ == "__main__":  # pragma: no cover
    text = get_input(2015, 13)

    print(part1(text))
    print(part2(text))
Пример #3
0
 def test_input(self):
     self.assertEqual(part1(get_input(2020, 8)), 1766)
Пример #4
0
 def test_input(self):
     self.assertEqual(part2(get_input(2017, 3)), 349975)
Пример #5
0
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
https://adventofcode.com/2019/day/1
"""

from itertools import repeat, takewhile

from data.utils import get_input


def part1(text):
    return sum(int(mass) // 3 - 2 for mass in text.split())


def part2(text):
    def fuel(mass):
        fuels = (mass := mass // 3 - 2 for _ in repeat(None))
        return sum(takewhile(lambda mass: 0 < mass, fuels))

    return sum(map(fuel, map(int, text.split())))


if __name__ == "__main__":  # pragma: no cover
    text = get_input(2019, 1)

    print(part1(text))
    print(part2(text))
Пример #6
0
 def test_input(self):
     self.assertEqual(part1(get_input(2020, 13)), 4722)
Пример #7
0
"""

from itertools import chain

from more_itertools import ichunked

from data.utils import get_input


def total(iterable):
    return sum(tri[2] < tri[0] + tri[1] for tri in map(sorted, iterable))


def process(text):
    return (map(int, tri.split()) for tri in text.splitlines())


def part1(text):
    return total(process(text))


def part2(text):
    return total(ichunked(chain.from_iterable(zip(*process(text))), 3))


if __name__ == "__main__":  # pragma: no cover
    text = get_input(2016, 3)

    print(part1(text))
    print(part2(text))
Пример #8
0
 def test_input(self):
     self.assertEqual(part1(get_input(2015, 15)), 18965440)
Пример #9
0
 def test_input(self):
     self.assertEqual(part2(get_input(2015, 15)), 2766555000)
Пример #10
0
 def test_input(self):
     self.assertEqual(part2(get_input(2015, 7)), 2797)
Пример #11
0
    def deepflatten(node):
        yield node
        yield from chain(*map(deepflatten, graph[node]))

    r = re.compile(r"([a-z]+) \((\d+)\)(?: -> (.*))?")

    weights = {}
    graph = {}

    for line in text.splitlines():
        parent, weight, kids = r.match(line).groups()
        graph[parent] = empty if kids is None else kids.split(", ")
        weights[parent] = int(weight)

    scale(head := unique(chain.from_iterable(map(deepflatten, graph))))
    sibs = kids = dict((kid, weights[kid]) for kid in graph[head])

    while not all_equal(kids.values()):
        odd = unique(kids.values())
        head = next(kid for kid, weight in kids.items() if weight == odd)
        sibs, kids = kids, dict((kid, weights[kid]) for kid in graph[head])

    return mode(sibs.values()) - len(kids) * next(iter(kids.values()))


if __name__ == "__main__":  # pragma: no cover
    text = get_input(2017, 7)

    print(part1(text))
    print(part2(text))
Пример #12
0
 def test_input(self):
     self.assertEqual(part1(get_input(2015, 7)), 16076)
Пример #13
0
 def test_input(self):
     self.assertEqual(part2(get_input(2019, 4)), 305)
Пример #14
0
 def test_input(self):
     self.assertEqual(part1(get_input(2019, 4)), 495)
Пример #15
0
 def test_input(self):
     self.assertEqual(part1(get_input(2016, 5)), "c6697b55")
Пример #16
0
 def test_input(self):
     self.assertEqual(part1(get_input(2016, 7)), 115)
Пример #17
0
 def test_input(self):
     self.assertEqual(part2(get_input(2016, 5)), "8c35d1ab")
Пример #18
0
 def test_input(self):
     self.assertEqual(part2(get_input(2016, 7)), 231)
Пример #19
0
 def test_input(self):
     self.assertEqual(part2(get_input(2020, 13)), 825305207525452)
Пример #20
0

def direction(char):
    if char == "^":
        return 1j
    elif char == ">":
        return 1
    elif char == "v":
        return -1j
    elif char == "<":
        return -1


def part1(text):
    return len(set({0} | set(accumulate(map(direction, text)))))


def part2(text):
    locations = {0}
    locations.update(accumulate(map(direction, islice(text, 0, None, 2))))
    locations.update(accumulate(map(direction, islice(text, 1, None, 2))))

    return len(locations)


if __name__ == "__main__":  # pragma: no cover
    text = get_input(2015, 3)

    print(part1(text))
    print(part2(text))
Пример #21
0
 def test_input(self):
     self.assertEqual(part1(get_input(2017, 3)), 480)
Пример #22
0
 def test_input(self):
     self.assertEqual(part1(get_input(2015, 3)), 2081)
Пример #23
0
        return a & BITS == b & BITS

    return count_items(islice(zip(a_gen, b_gen), sample), packed(valid))


def part1(text, a_mult=16807, b_mult=48271, sample=int(4e7)):
    a_start, b_start = map(int, re.findall(r"\d+", text))

    a_gen = applyfunc(lambda a: (a_mult * a) % DIVISOR, a_start)
    b_gen = applyfunc(lambda b: (b_mult * b) % DIVISOR, b_start)

    return count(a_gen, b_gen, sample)


def part2(text, a_mult=16807, b_mult=48271, sample=int(5e6)):
    a_start, b_start = map(int, re.findall(r"\d+", text))

    a_gen = applyfunc(lambda a: (a_mult * a) % DIVISOR, a_start)
    a_gen = filterfalse(lambda a: a % 4, a_gen)
    b_gen = applyfunc(lambda b: (b_mult * b) % DIVISOR, b_start)
    b_gen = filterfalse(lambda b: b % 8, b_gen)

    return count(a_gen, b_gen, sample)


if __name__ == "__main__":  # pragma: no cover
    text = get_input(2017, 15)

    print(part1(text))
    print(part2(text))
Пример #24
0
 def test_input(self):
     self.assertEqual(part2(get_input(2015, 3)), 2341)
Пример #25
0
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
https://adventofcode.com/2015/day/25
"""
import re

from data.utils import get_input


def part1(text, code=20151125, mult=252533, mod=33554393):
    row, col = map(int, re.findall(r"\d+", text))

    n = (row + col - 1) * (row + col - 2) // 2 + col - 1

    return code * pow(mult, n, mod) % mod


if __name__ == "__main__":  # pragma: no cover
    text = get_input(2015, 25)

    print(part1(text))
Пример #26
0
 def test_input(self):
     self.assertEqual(part1(get_input(2015, 13)), 709)
Пример #27
0
from data.utils import get_input


def part1(text):
    def valid(line):
        lo, hi, char, password = r.match(line).groups()
        return int(lo) <= password.count(char) <= int(hi)

    r = re.compile(r"(\d+)-(\d+) (\w): (\w+)")

    return sum(map(valid, text.splitlines()))


def part2(text):
    def valid(line):
        lo, hi, char, password = r.match(line).groups()
        return (char == password[int(lo) - 1]) != (char
                                                   == password[int(hi) - 1])

    r = re.compile(r"(\d+)-(\d+) (\w): (\w+)")

    return sum(map(valid, text.splitlines()))


if __name__ == "__main__":  # pragma: no cover
    text = get_input(2020, 2)

    print(part1(text))
    print(part2(text))
Пример #28
0
 def test_input(self):
     self.assertEqual(part2(get_input(2015, 13)), 668)
Пример #29
0
 def test_input(self):
     self.assertEqual(part2(get_input(2020, 8)), 1639)
Пример #30
0
 def test_input(self):
     self.assertEqual(part1(get_input(2015, 2)), 1606483)