def test_input(self): self.assertEqual(part2(get_input(2015, 2)), 3842356)
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))
def test_input(self): self.assertEqual(part1(get_input(2020, 8)), 1766)
def test_input(self): self.assertEqual(part2(get_input(2017, 3)), 349975)
#!/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))
def test_input(self): self.assertEqual(part1(get_input(2020, 13)), 4722)
""" 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))
def test_input(self): self.assertEqual(part1(get_input(2015, 15)), 18965440)
def test_input(self): self.assertEqual(part2(get_input(2015, 15)), 2766555000)
def test_input(self): self.assertEqual(part2(get_input(2015, 7)), 2797)
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))
def test_input(self): self.assertEqual(part1(get_input(2015, 7)), 16076)
def test_input(self): self.assertEqual(part2(get_input(2019, 4)), 305)
def test_input(self): self.assertEqual(part1(get_input(2019, 4)), 495)
def test_input(self): self.assertEqual(part1(get_input(2016, 5)), "c6697b55")
def test_input(self): self.assertEqual(part1(get_input(2016, 7)), 115)
def test_input(self): self.assertEqual(part2(get_input(2016, 5)), "8c35d1ab")
def test_input(self): self.assertEqual(part2(get_input(2016, 7)), 231)
def test_input(self): self.assertEqual(part2(get_input(2020, 13)), 825305207525452)
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))
def test_input(self): self.assertEqual(part1(get_input(2017, 3)), 480)
def test_input(self): self.assertEqual(part1(get_input(2015, 3)), 2081)
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))
def test_input(self): self.assertEqual(part2(get_input(2015, 3)), 2341)
#!/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))
def test_input(self): self.assertEqual(part1(get_input(2015, 13)), 709)
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))
def test_input(self): self.assertEqual(part2(get_input(2015, 13)), 668)
def test_input(self): self.assertEqual(part2(get_input(2020, 8)), 1639)
def test_input(self): self.assertEqual(part1(get_input(2015, 2)), 1606483)