├── .gitignore ├── README.md ├── advent2020 ├── __init__.py ├── day01.py ├── day02.py ├── day03.py ├── day04.py ├── day05.py ├── day06.py ├── day07.py ├── day08.py ├── day09.py ├── day10.py ├── day11.py ├── day12.py ├── day13.py ├── day14.py ├── day14_v2.py ├── day15.py ├── day16.py ├── day17.py ├── day18.py ├── day19.py ├── day20.py ├── day21.py ├── day22.py ├── day23.py ├── day23_v2.py ├── day24.py ├── day25.py └── utils.py ├── inputs ├── day01.txt ├── day02.txt ├── day03.txt ├── day04.txt ├── day05.txt ├── day06.txt ├── day07.txt ├── day08.txt ├── day09.txt ├── day10.txt ├── day11.txt ├── day12.txt ├── day13.txt ├── day14.txt ├── day15.txt ├── day16.txt ├── day17.txt ├── day18.txt ├── day19.txt ├── day20.txt ├── day21.txt ├── day22.txt ├── day23.txt ├── day24.txt └── day25.txt ├── poetry.lock ├── pyproject.toml └── tests └── __init__.py /.gitignore: -------------------------------------------------------------------------------- 1 | __pycache__ 2 | .vscode -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Advent of Code 2020 2 | 3 | Follow along as I try to solve the problems in 4 | [Advent of Code](https://adventofcode.com). 5 | 6 | I livestream my solution attempts each night at 9pm (usually),or you can see the playlist of completed videos here: 7 | 8 | https://www.youtube.com/playlist?list=PLeDtc0GP5ICmVrjHJrIiDZFW_xr__Ifqk -------------------------------------------------------------------------------- /advent2020/__init__.py: -------------------------------------------------------------------------------- 1 | __version__ = '0.1.0' 2 | -------------------------------------------------------------------------------- /advent2020/day01.py: -------------------------------------------------------------------------------- 1 | from typing import List 2 | 3 | INPUTS = [ 4 | 1721, 5 | 979, 6 | 366, 7 | 299, 8 | 675, 9 | 1456, 10 | ] 11 | 12 | def find_product(inputs: List[int]) -> int: 13 | """ 14 | Find the two elements that add up to 2020 15 | and return their product 16 | """ 17 | needs = {2020 - i for i in inputs} 18 | 19 | for i in inputs: 20 | if i in needs: 21 | return i * (2020-i) 22 | 23 | assert find_product(INPUTS) == 514579 24 | 25 | def find_product3(inputs: List[int]) -> int: 26 | """ 27 | Find the two elements that add up to 2020 28 | and return their product 29 | """ 30 | needs = {2020 - i - j: (i, j) 31 | for i in inputs 32 | for j in inputs 33 | if i != j} 34 | 35 | for i in inputs: 36 | if i in needs: 37 | j, k = needs[i] 38 | return i * j * k 39 | 40 | assert find_product3(INPUTS) == 241861950 41 | 42 | with open("inputs/day01.txt") as f: 43 | inputs = [int(line.strip()) for line in f] 44 | print(find_product3(inputs)) -------------------------------------------------------------------------------- /advent2020/day02.py: -------------------------------------------------------------------------------- 1 | from __future__ import annotations 2 | 3 | from typing import NamedTuple 4 | 5 | PASSWORDS = [ 6 | "1-3 a: abcde", 7 | "1-3 b: cdefg", 8 | "2-9 c: ccccccccc" 9 | ] 10 | 11 | class Password(NamedTuple): 12 | lo: int 13 | hi: int 14 | char: str 15 | password: str 16 | 17 | def is_valid(self) -> bool: 18 | return self.lo <= self.password.count(self.char) <= self.hi 19 | 20 | def is_valid2(self) -> bool: 21 | is_lo = self.password[self.lo - 1] == self.char 22 | is_hi = self.password[self.hi - 1] == self.char 23 | 24 | return is_lo != is_hi 25 | 26 | @staticmethod 27 | def from_line(line: str) -> Password: 28 | """ 29 | "1-3 a: abcde", 30 | """ 31 | counts, char, password = line.strip().split() 32 | lo, hi = [int(n) for n in counts.split("-")] 33 | char = char[0] 34 | return Password(lo, hi, char, password) 35 | 36 | 37 | with open('inputs/day02.txt') as f: 38 | passwords = [Password.from_line(line) for line in f] 39 | print(sum(pw.is_valid2() for pw in passwords)) 40 | 41 | -------------------------------------------------------------------------------- /advent2020/day03.py: -------------------------------------------------------------------------------- 1 | from __future__ import annotations 2 | 3 | from typing import List, NamedTuple, Tuple, Set 4 | 5 | 6 | Point = Tuple[int, int] 7 | 8 | 9 | class Slope(NamedTuple): 10 | trees: Set[Point] 11 | width: int 12 | height: int 13 | 14 | @staticmethod 15 | def parse(raw: str) -> Slope: 16 | lines = raw.split("\n") 17 | trees = {(x, y) 18 | for y, row in enumerate(lines) 19 | for x, c in enumerate(row.strip()) 20 | if c == '#'} 21 | width = len(lines[0]) 22 | height = len(lines) 23 | 24 | return Slope(trees, width, height) 25 | 26 | 27 | def count_trees( 28 | slope: Slope, 29 | right: int = 3, 30 | down: int = 1 31 | ) -> int: 32 | num_trees = 0 33 | x = 0 34 | for y in range(0, slope.height, down): 35 | if (x, y) in slope.trees: 36 | num_trees += 1 37 | x = (x + right) % slope.width 38 | return num_trees 39 | 40 | 41 | # Right 1, down 1. 42 | # Right 3, down 1. (This is the slope you already checked.) 43 | # Right 5, down 1. 44 | # Right 7, down 1. 45 | # Right 1, down 2. 46 | SLOPES = [ 47 | (1, 1), 48 | (3, 1), 49 | (5, 1), 50 | (7, 1), 51 | (1, 2) 52 | ] 53 | 54 | def trees_product(slope: Slope, slopes: List[Point]) -> int: 55 | product = 1 56 | for right, down in slopes: 57 | product *= count_trees(slope, right=right, down=down) 58 | 59 | return product 60 | 61 | 62 | # 63 | # UNIT TESTS 64 | # 65 | 66 | RAW = """..##....... 67 | #...#...#.. 68 | .#....#..#. 69 | ..#.#...#.# 70 | .#...##..#. 71 | ..#.##..... 72 | .#.#.#....# 73 | .#........# 74 | #.##...#... 75 | #...##....# 76 | .#..#...#.#""" 77 | 78 | SLOPE = Slope.parse(RAW) 79 | 80 | assert count_trees(SLOPE) == 7 81 | 82 | assert trees_product(SLOPE, SLOPES) == 336 83 | 84 | # 85 | # PROBLEM 86 | # 87 | 88 | with open('inputs/day03.txt') as f: 89 | raw = f.read() 90 | slope = Slope.parse(raw) 91 | print(count_trees(slope)) 92 | print(trees_product(slope, SLOPES)) -------------------------------------------------------------------------------- /advent2020/day04.py: -------------------------------------------------------------------------------- 1 | from typing import Dict, List 2 | import re 3 | 4 | 5 | Passport = Dict[str, str] 6 | 7 | def make_passport(raw: str) -> Passport: 8 | lines = raw.strip().split("\n") 9 | lines = [line.strip() for line in lines if line.strip()] 10 | 11 | passport = {} 12 | 13 | for line in lines: 14 | for chunk in line.split(" "): 15 | key, value = chunk.split(":") 16 | passport[key] = value 17 | 18 | return passport 19 | 20 | def make_passports(raw: str) -> List[Passport]: 21 | chunks = raw.split("\n\n") 22 | return [make_passport(chunk) for chunk in chunks if chunk.strip()] 23 | 24 | DEFAULT_FIELDS = ["byr", "iyr", "eyr", "hgt", "hcl", "ecl", "pid"] 25 | 26 | 27 | def is_valid(passport: Passport, 28 | required_fields: List[str] = DEFAULT_FIELDS) -> bool: 29 | return all(field in passport for field in required_fields) 30 | 31 | 32 | def is_valid2(passport: Passport) -> bool: 33 | checks = [ 34 | 1920 <= int(passport.get('byr', -1)) <= 2002, 35 | 2010 <= int(passport.get('iyr', -1)) <= 2020, 36 | 2020 <= int(passport.get('eyr', -1)) <= 2030, 37 | is_valid_height(passport.get('hgt', '')), 38 | re.match(r"^#[0-9a-f]{6}$", passport.get('hcl', '')), 39 | passport.get('ecl') in ('amb', 'blu', 'brn', 'gry', 'grn', 'hzl', 'oth'), 40 | re.match(r"^[0-9]{9}$", passport.get('pid', '')) 41 | ] 42 | 43 | return all(checks) 44 | 45 | def is_valid_height(hgt: str) -> bool: 46 | if hgt.endswith('cm'): 47 | hgt = hgt.replace('cm', '') 48 | try: 49 | return 150 <= int(hgt) <= 193 50 | except: 51 | return False 52 | elif hgt.endswith("in"): 53 | hgt = hgt.replace("in", "") 54 | try: 55 | return 59 <= int(hgt) <= 76 56 | except: 57 | return False 58 | 59 | return False 60 | 61 | # 62 | # UNIT TESTS 63 | # 64 | 65 | RAW = """ecl:gry pid:860033327 eyr:2020 hcl:#fffffd 66 | byr:1937 iyr:2017 cid:147 hgt:183cm 67 | 68 | iyr:2013 ecl:amb cid:350 eyr:2023 pid:028048884 69 | hcl:#cfa07d byr:1929 70 | 71 | hcl:#ae17e1 iyr:2013 72 | eyr:2024 73 | ecl:brn pid:760753108 byr:1931 74 | hgt:179cm 75 | 76 | hcl:#cfa07d eyr:2025 pid:166559648 77 | iyr:2011 ecl:brn hgt:59in""" 78 | 79 | PASSPORTS = make_passports(RAW) 80 | 81 | assert sum(is_valid(passport) for passport in PASSPORTS) == 2 82 | 83 | INVALID = make_passports("""eyr:1972 cid:100 84 | hcl:#18171d ecl:amb hgt:170 pid:186cm iyr:2018 byr:1926 85 | 86 | iyr:2019 87 | hcl:#602927 eyr:1967 hgt:170cm 88 | ecl:grn pid:012533040 byr:1946 89 | 90 | hcl:dab227 iyr:2012 91 | ecl:brn hgt:182cm pid:021572410 eyr:2020 byr:1992 cid:277 92 | 93 | hgt:59cm ecl:zzz 94 | eyr:2038 hcl:74454a iyr:2023 95 | pid:3556412378 byr:2007""") 96 | 97 | VALID = make_passports("""pid:087499704 hgt:74in ecl:grn iyr:2012 eyr:2030 byr:1980 98 | hcl:#623a2f 99 | 100 | eyr:2029 ecl:blu cid:129 byr:1989 101 | iyr:2014 pid:896056539 hcl:#a97842 hgt:165cm 102 | 103 | hcl:#888785 104 | hgt:164cm byr:2001 iyr:2015 cid:88 105 | pid:545766238 ecl:hzl 106 | eyr:2022 107 | 108 | iyr:2010 hgt:158cm hcl:#b6652a ecl:blu byr:1944 eyr:2021 pid:093154719""") 109 | 110 | assert all(is_valid2(passport) for passport in VALID) 111 | assert not any(is_valid2(passport) for passport in INVALID) 112 | 113 | # 114 | # PROBLEMS 115 | # 116 | 117 | with open('inputs/day04.txt') as f: 118 | passports = make_passports(f.read()) 119 | 120 | print(sum(is_valid(passport) for passport in passports)) 121 | print(sum(is_valid2(passport) for passport in passports)) 122 | -------------------------------------------------------------------------------- /advent2020/day05.py: -------------------------------------------------------------------------------- 1 | """ 2 | BFFFBBFRRR: row 70, column 7, seat ID 567. 3 | FFFBBBFRRR: row 14, column 7, seat ID 119. 4 | BBFFBBFRLL: row 102, column 4, seat ID 820. 5 | """ 6 | 7 | from typing import NamedTuple 8 | 9 | class Seat(NamedTuple): 10 | row: int 11 | col: int 12 | 13 | @property 14 | def seat_id(self) -> int: 15 | return self.row * 8 + self.col 16 | 17 | def find_seat(bp: str) -> Seat: 18 | row = 0 19 | col = 0 20 | 21 | for i, c in enumerate(bp[:7]): 22 | multiplier = 2 ** (6 - i) 23 | include = 1 if c == 'B' else 0 24 | row += multiplier * include 25 | 26 | for i, c in enumerate(bp[-3:]): 27 | multiplier = 2 ** (2 - i) 28 | include = 1 if c == 'R' else 0 29 | col += multiplier * include 30 | 31 | return Seat(row, col) 32 | 33 | def find_seat2(bp: str) -> Seat: 34 | row = int(''.join({'B': '1', 'F': '0'}[c] for c in bp[:7]), 2) 35 | col = int(''.join({'R': '1', 'L': '0'}[c] for c in bp[-3:]), 2) 36 | return Seat(row, col) 37 | 38 | # 39 | # PROBLEMS 40 | # 41 | 42 | with open('inputs/day05.txt') as f: 43 | seats = [find_seat2(bp.strip()) for bp in f] 44 | 45 | print(max(seat.seat_id for seat in seats)) 46 | 47 | seat_ids = [seat.seat_id for seat in seats] 48 | 49 | lo = min(seat_ids) 50 | hi = max(seat_ids) 51 | 52 | print([x for x in range(lo, hi) 53 | if x not in seat_ids]) # and x-1 in seat_ids and x+1 in seat_ids]) -------------------------------------------------------------------------------- /advent2020/day06.py: -------------------------------------------------------------------------------- 1 | from typing import List 2 | from collections import Counter 3 | 4 | 5 | def count_yeses(raw: str) -> int: 6 | groups = raw.split("\n\n") 7 | num_yeses = 0 8 | for group in groups: 9 | people = group.split("\n") 10 | yeses = {c for person in people for c in person} 11 | num_yeses += len(yeses) 12 | return num_yeses 13 | 14 | 15 | def count_yeses2(raw: str) -> int: 16 | groups = raw.split("\n\n") 17 | num_yeses = 0 18 | for group in groups: 19 | people = group.split("\n") 20 | yeses = Counter(c for person in people for c in person) 21 | num_yeses += sum(count == len(people) for c, count in yeses.items()) 22 | return num_yeses 23 | 24 | # 25 | # UNIT TESTS 26 | # 27 | 28 | RAW = """abc 29 | 30 | a 31 | b 32 | c 33 | 34 | ab 35 | ac 36 | 37 | a 38 | a 39 | a 40 | a 41 | 42 | b""" 43 | 44 | assert count_yeses(RAW) == 11 45 | assert count_yeses2(RAW) == 6 46 | 47 | # 48 | # PROBLEMS 49 | # 50 | 51 | with open('inputs/day06.txt') as f: 52 | raw = f.read() 53 | print(count_yeses(raw)) 54 | print(count_yeses2(raw)) -------------------------------------------------------------------------------- /advent2020/day07.py: -------------------------------------------------------------------------------- 1 | from typing import NamedTuple, Dict, List, Tuple 2 | import re 3 | from collections import defaultdict 4 | 5 | 6 | class Bag(NamedTuple): 7 | color: str 8 | contains: Dict[str, int] 9 | 10 | 11 | def parse_line(line: str) -> Bag: 12 | part1, part2 = line.split(" contain ") 13 | color = part1[:-5] 14 | 15 | part2 = part2.rstrip(".") 16 | if part2 == "no other bags": 17 | return Bag(color, {}) 18 | 19 | contains = {} 20 | 21 | contained = part2.split(", ") 22 | for subbag in contained: 23 | subbag = re.sub(r"bags?$", "", subbag) 24 | first_space = subbag.find(" ") 25 | count = int(subbag[:first_space].strip()) 26 | color2 = subbag[first_space:].strip() 27 | contains[color2] = count 28 | return Bag(color, contains) 29 | 30 | def make_bags(raw: str) -> List[Bag]: 31 | return [parse_line(line) for line in raw.split("\n")] 32 | 33 | def parents(bags: List[Bag]) -> Dict[str, List[str]]: 34 | ic = defaultdict(list) 35 | for bag in bags: 36 | for child in bag.contains: 37 | ic[child].append(bag.color) 38 | return ic 39 | 40 | def can_eventually_contain(bags: List[Bag], color: str) -> List[str]: 41 | parent_map = parents(bags) 42 | 43 | check_me = [color] 44 | can_contain = set() 45 | 46 | while check_me: 47 | child = check_me.pop() 48 | for parent in parent_map.get(child, []): 49 | if parent not in can_contain: 50 | can_contain.add(parent) 51 | check_me.append(parent) 52 | 53 | return list(can_contain) 54 | 55 | def num_bags_inside( 56 | bags: List[Bag], 57 | color: str 58 | ) -> int: 59 | by_color = {bag.color: bag for bag in bags} 60 | 61 | num_bags = 0 62 | stack: List[Tuple[str, int]] = [(color, 1)] 63 | while stack: 64 | next_color, multiplier = stack.pop() 65 | bag = by_color[next_color] 66 | for child, count in bag.contains.items(): 67 | num_bags += multiplier * count 68 | stack.append((child, count * multiplier)) 69 | return num_bags 70 | 71 | # 72 | # UNIT TESTS 73 | # 74 | 75 | RAW = """light red bags contain 1 bright white bag, 2 muted yellow bags. 76 | dark orange bags contain 3 bright white bags, 4 muted yellow bags. 77 | bright white bags contain 1 shiny gold bag. 78 | muted yellow bags contain 2 shiny gold bags, 9 faded blue bags. 79 | shiny gold bags contain 1 dark olive bag, 2 vibrant plum bags. 80 | dark olive bags contain 3 faded blue bags, 4 dotted black bags. 81 | vibrant plum bags contain 5 faded blue bags, 6 dotted black bags. 82 | faded blue bags contain no other bags. 83 | dotted black bags contain no other bags.""" 84 | 85 | RAW2 = """shiny gold bags contain 2 dark red bags. 86 | dark red bags contain 2 dark orange bags. 87 | dark orange bags contain 2 dark yellow bags. 88 | dark yellow bags contain 2 dark green bags. 89 | dark green bags contain 2 dark blue bags. 90 | dark blue bags contain 2 dark violet bags. 91 | dark violet bags contain no other bags.""" 92 | 93 | BAGS1 = make_bags(RAW) 94 | BAGS2 = make_bags(RAW2) 95 | 96 | # 97 | # PROBLEMS 98 | # 99 | 100 | with open('inputs/day07.txt') as f: 101 | raw = f.read() 102 | 103 | bags = make_bags(raw) 104 | print(len(can_eventually_contain(bags, 'shiny gold'))) 105 | print(num_bags_inside(bags, "shiny gold")) -------------------------------------------------------------------------------- /advent2020/day08.py: -------------------------------------------------------------------------------- 1 | from __future__ import annotations 2 | 3 | from typing import NamedTuple, List 4 | 5 | class Instruction(NamedTuple): 6 | op: str 7 | arg: int 8 | 9 | @staticmethod 10 | def parse(line: str) -> Instruction: 11 | op, arg = line.strip().split() 12 | return Instruction(op, int(arg)) 13 | 14 | 15 | class Booter: 16 | def __init__(self, instructions: List[Instruction]) -> None: 17 | self.instructions = instructions 18 | self.accumulator = 0 19 | self.idx = 0 20 | 21 | def execute_one(self) -> None: 22 | op, arg = self.instructions[self.idx] 23 | 24 | if op == 'acc': 25 | self.accumulator += arg 26 | self.idx += 1 27 | elif op == 'jmp': 28 | self.idx += arg 29 | elif op == 'nop': 30 | self.idx += 1 31 | else: 32 | raise ValueError(f"unknown op: {op}") 33 | 34 | def run_until_repeat(self) -> None: 35 | executed = set() 36 | 37 | while self.idx not in executed: 38 | executed.add(self.idx) 39 | self.execute_one() 40 | 41 | def does_terminate(self) -> bool: 42 | executed = set() 43 | 44 | while self.idx not in executed: 45 | if self.idx == len(self.instructions): 46 | return True 47 | 48 | executed.add(self.idx) 49 | self.execute_one() 50 | 51 | return False 52 | 53 | 54 | def find_terminator(instructions: List[Instruction]) -> int: 55 | for i, (op, arg) in enumerate(instructions): 56 | subbed = instructions[:] 57 | 58 | if op == 'nop': 59 | subbed[i] = Instruction('jmp', arg) 60 | elif op == 'jmp': 61 | subbed[i] = Instruction('nop', arg) 62 | else: 63 | continue 64 | 65 | booter = Booter(subbed) 66 | 67 | if booter.does_terminate(): 68 | return booter.accumulator 69 | 70 | raise RuntimeError("never terminated") 71 | 72 | # 73 | # UNIT TESTS 74 | # 75 | 76 | RAW = """nop +0 77 | acc +1 78 | jmp +4 79 | acc +3 80 | jmp -3 81 | acc -99 82 | acc +1 83 | jmp -4 84 | acc +6""" 85 | 86 | INSTRUCTIONS = [Instruction.parse(line) for line in RAW.split("\n")] 87 | 88 | BOOTER = Booter(INSTRUCTIONS) 89 | BOOTER.run_until_repeat() 90 | assert BOOTER.accumulator == 5 91 | 92 | assert find_terminator(INSTRUCTIONS) == 8 93 | 94 | # 95 | # PROBLEM 96 | # 97 | 98 | with open('inputs/day08.txt') as f: 99 | raw = f.read() 100 | 101 | instructions = [Instruction.parse(line) for line in raw.split("\n")] 102 | booter = Booter(instructions) 103 | booter.run_until_repeat() 104 | print(booter.accumulator) 105 | print(find_terminator(instructions)) 106 | -------------------------------------------------------------------------------- /advent2020/day09.py: -------------------------------------------------------------------------------- 1 | from __future__ import annotations 2 | 3 | from typing import List, Iterator 4 | from collections import deque 5 | 6 | 7 | def not_sums(numbers: List[int], lookback: int = 25) -> Iterator[int]: 8 | q = deque() 9 | for n in numbers: 10 | if len(q) < lookback: 11 | q.append(n) 12 | else: 13 | sums = {a + b 14 | for i, a in enumerate(q) 15 | for j, b in enumerate(q) 16 | if i < j} 17 | if n not in sums: 18 | yield n 19 | q.append(n) 20 | q.popleft() 21 | 22 | def range_with_sum(numbers: List[int], target: int) -> List[int]: 23 | for i, n in enumerate(numbers): 24 | j = i 25 | total = n 26 | while total < target and j < len(numbers): 27 | j += 1 28 | total += numbers[j] 29 | if total == target and i < j: 30 | slice = numbers[i:j+1] 31 | return slice 32 | 33 | raise RuntimeError() 34 | 35 | 36 | def encryption_weakness(numbers: List[int], lookback: int = 25) -> int: 37 | target = next(not_sums(numbers, lookback)) 38 | slice = range_with_sum(numbers, target) 39 | return min(slice) + max(slice) 40 | 41 | # 42 | # Unit Tests 43 | # 44 | 45 | RAW = """35 46 | 20 47 | 15 48 | 25 49 | 47 50 | 40 51 | 62 52 | 55 53 | 65 54 | 95 55 | 102 56 | 117 57 | 150 58 | 182 59 | 127 60 | 219 61 | 299 62 | 277 63 | 309 64 | 576""" 65 | 66 | NUMBERS = [int(x) for x in RAW.split("\n")] 67 | 68 | assert next(not_sums(NUMBERS, 5)) == 127 69 | 70 | assert encryption_weakness(NUMBERS, 5) == 62 71 | 72 | # 73 | # Problem 74 | # 75 | 76 | with open('inputs/day09.txt') as f: 77 | raw = f.read() 78 | 79 | numbers = [int(x) for x in raw.split("\n")] 80 | print(next(not_sums(numbers))) 81 | print(encryption_weakness(numbers)) -------------------------------------------------------------------------------- /advent2020/day10.py: -------------------------------------------------------------------------------- 1 | from __future__ import annotations 2 | from typing import List, Dict 3 | 4 | from collections import Counter 5 | 6 | def count_skips(adapters: List[int]) -> Counter: 7 | adapters = sorted(adapters + [0]) 8 | adapters.append(max(adapters) + 3) 9 | 10 | diffs = [next_a - prev_a for prev_a, next_a in zip(adapters, adapters[1:])] 11 | assert all(1 <= diff <= 3 for diff in diffs) 12 | 13 | return Counter(diffs) 14 | 15 | def count_paths(adapters: List[int]) -> int: 16 | adapters.append(0) 17 | adapters.append(max(adapters) + 3) 18 | 19 | output = adapters[-1] 20 | 21 | # num_ways[i] is the numbers of ways to get to i 22 | num_ways = [0] * (output + 1) 23 | 24 | num_ways[0] = 1 25 | 26 | if 1 in adapters: 27 | num_ways[1] = 1 28 | 29 | if 2 in adapters and 1 in adapters: 30 | num_ways[2] = 2 31 | elif 2 in adapters: 32 | num_ways[2] = 1 33 | 34 | for n in range(3, output + 1): 35 | if n not in adapters: 36 | continue 37 | 38 | num_ways[n] = num_ways[n-3] + num_ways[n-2] + num_ways[n-1] 39 | 40 | return num_ways[output] 41 | 42 | # 43 | # Unit Tests 44 | # 45 | 46 | RAW1 = """16 47 | 10 48 | 15 49 | 5 50 | 1 51 | 11 52 | 7 53 | 19 54 | 6 55 | 12 56 | 4""" 57 | 58 | RAW2 = """28 59 | 33 60 | 18 61 | 42 62 | 31 63 | 14 64 | 46 65 | 20 66 | 48 67 | 47 68 | 24 69 | 23 70 | 49 71 | 45 72 | 19 73 | 38 74 | 39 75 | 11 76 | 1 77 | 32 78 | 25 79 | 35 80 | 8 81 | 17 82 | 7 83 | 9 84 | 4 85 | 2 86 | 34 87 | 10 88 | 3""" 89 | 90 | ADAPTERS1 = [int(x) for x in RAW1.split("\n")] 91 | ADAPTERS2 = [int(x) for x in RAW2.split("\n")] 92 | 93 | SKIPS1 = count_skips(ADAPTERS1) 94 | assert SKIPS1[1] * SKIPS1[3] == 7 * 5 95 | 96 | SKIPS2 = count_skips(ADAPTERS2) 97 | assert SKIPS2[1] * SKIPS2[3] == 22 * 10 98 | 99 | assert count_paths(ADAPTERS1) == 8 100 | assert count_paths(ADAPTERS2) == 19208 101 | 102 | # 103 | # Problem 104 | # 105 | 106 | with open('inputs/day10.txt') as f: 107 | adapters = [int(x) for x in f] 108 | 109 | skips = count_skips(adapters) 110 | print(skips[1] * skips[3]) 111 | print(count_paths(adapters)) -------------------------------------------------------------------------------- /advent2020/day11.py: -------------------------------------------------------------------------------- 1 | from __future__ import annotations 2 | from typing import List 3 | from collections import Counter 4 | 5 | Grid = List[List[str]] 6 | 7 | neighbors = [(-1, 0), (-1, -1), (-1, +1), 8 | ( 0,-1), ( 0, +1), 9 | ( 1, 1), (1, 0), (1, - 1)] 10 | 11 | def next_value(grid: Grid, i: int, j: int) -> str: 12 | nr = len(grid) 13 | nc = len(grid[0]) 14 | 15 | counts = Counter( 16 | grid[i + di][j + dj] 17 | for di, dj in neighbors 18 | if 0 <= i + di < nr and 0 <= j + dj < nc 19 | ) 20 | 21 | c = grid[i][j] 22 | 23 | if c == 'L' and counts['#'] == 0: 24 | return '#' 25 | if c == '#' and counts['#'] >= 4: 26 | return 'L' 27 | else: 28 | return c 29 | 30 | def step(grid: Grid) -> Grid: 31 | return [ 32 | [ 33 | next_value(grid, i, j) 34 | for j, c in enumerate(row) 35 | ] 36 | for i, row in enumerate(grid) 37 | ] 38 | 39 | def final_seats(grid: Grid) -> int: 40 | while True: 41 | next_grid = step(grid) 42 | if next_grid == grid: 43 | break 44 | grid = next_grid 45 | 46 | return sum(c == '#' for row in grid for c in row) 47 | 48 | 49 | ### PART 2 50 | 51 | 52 | def first_seat(grid: Grid, i: int, j: int, di: int, dj: int) -> str: 53 | nr = len(grid) 54 | nc = len(grid[0]) 55 | 56 | while True: 57 | i += di 58 | j += dj 59 | 60 | if 0 <= i < nr and 0 <= j < nc: 61 | c = grid[i][j] 62 | if c == '#' or c == 'L': 63 | return c 64 | else: 65 | return '.' 66 | 67 | 68 | def next_value2(grid: Grid, i: int, j: int) -> str: 69 | counts = Counter( 70 | first_seat(grid, i, j, di, dj) 71 | for di, dj in neighbors 72 | ) 73 | 74 | c = grid[i][j] 75 | 76 | if c == 'L' and counts['#'] == 0: 77 | return '#' 78 | if c == '#' and counts['#'] >= 5: 79 | return 'L' 80 | else: 81 | return c 82 | 83 | 84 | def step2(grid: Grid) -> Grid: 85 | return [ 86 | [ 87 | next_value2(grid, i, j) 88 | for j, c in enumerate(row) 89 | ] 90 | for i, row in enumerate(grid) 91 | ] 92 | 93 | def final_seats2(grid: Grid) -> int: 94 | while True: 95 | next_grid = step2(grid) 96 | if next_grid == grid: 97 | break 98 | grid = next_grid 99 | 100 | return sum(c == '#' for row in grid for c in row) 101 | 102 | 103 | # 104 | # unit tests 105 | # 106 | 107 | RAW = """L.LL.LL.LL 108 | LLLLLLL.LL 109 | L.L.L..L.. 110 | LLLL.LL.LL 111 | L.LL.LL.LL 112 | L.LLLLL.LL 113 | ..L.L..... 114 | LLLLLLLLLL 115 | L.LLLLLL.L 116 | L.LLLLL.LL""" 117 | 118 | GRID = [list(row) for row in RAW.split("\n")] 119 | 120 | assert final_seats(GRID) == 37 121 | assert final_seats2(GRID) == 26 122 | 123 | # 124 | # problem 125 | # 126 | with open('inputs/day11.txt') as f: 127 | grid = [list(line.strip()) for line in f] 128 | 129 | # print(final_seats(grid)) 130 | print(final_seats2(grid)) -------------------------------------------------------------------------------- /advent2020/day12.py: -------------------------------------------------------------------------------- 1 | """Action N means to move north by the given value. 2 | Action S means to move south by the given value. 3 | Action E means to move east by the given value. 4 | Action W means to move west by the given value. 5 | Action L means to turn left the given number of degrees. 6 | Action R means to turn right the given number of degrees. 7 | Action F means to move forward by the given value in the direction the ship is currently facing.""" 8 | 9 | from __future__ import annotations 10 | from typing import NamedTuple 11 | from dataclasses import dataclass 12 | 13 | class Action(NamedTuple): 14 | action: str 15 | amount: int 16 | 17 | @staticmethod 18 | def parse(raw: str): 19 | return Action(raw[0], int(raw[1:])) 20 | 21 | @dataclass 22 | class Ship: 23 | x: int = 0 24 | y: int = 0 25 | heading: int = 0 26 | 27 | def move(self, action: Action) -> None: 28 | if action.action == 'N': 29 | self.y += action.amount 30 | elif action.action == 'S': 31 | self.y -= action.amount 32 | elif action.action == 'E': 33 | self.x += action.amount 34 | elif action.action == 'W': 35 | self.x -= action.amount 36 | elif action.action == 'L': 37 | self.heading = (self.heading + action.amount) % 360 38 | elif action.action == 'R': 39 | self.heading = (self.heading - action.amount) % 360 40 | elif action.action == 'F': 41 | if self.heading == 0: 42 | self.x += action.amount 43 | elif self.heading == 90: 44 | self.y += action.amount 45 | elif self.heading == 180: 46 | self.x -= action.amount 47 | elif self.heading == 270: 48 | self.y -= action.amount 49 | else: 50 | raise ValueError(f"bad heading {self.heading}") 51 | else: 52 | raise ValueError(f"unknown action {action}") 53 | 54 | 55 | @dataclass 56 | class ShipAndWaypoint: 57 | ship_x: int = 0 58 | ship_y: int = 0 59 | ship_heading: int = 0 60 | 61 | waypoint_x: int = 10 62 | waypoint_y: int = 1 63 | 64 | def move(self, action: Action) -> None: 65 | if action.action == 'N': 66 | self.waypoint_y += action.amount 67 | elif action.action == 'S': 68 | self.waypoint_y -= action.amount 69 | elif action.action == 'E': 70 | self.waypoint_x += action.amount 71 | elif action.action == 'W': 72 | self.waypoint_x -= action.amount 73 | elif action.action == 'L': 74 | # rotate the waypoint around the ship the given number of degrees 75 | for _ in range(action.amount // 90): 76 | self.waypoint_x, self.waypoint_y = -self.waypoint_y, self.waypoint_x 77 | elif action.action == 'R': 78 | for _ in range(action.amount // 90): 79 | self.waypoint_x, self.waypoint_y = self.waypoint_y, -self.waypoint_x 80 | 81 | elif action.action == 'F': 82 | self.ship_x += action.amount * self.waypoint_x 83 | self.ship_y += action.amount * self.waypoint_y 84 | else: 85 | raise ValueError(f"unknown action {action}") 86 | 87 | 88 | # 89 | # unit tests 90 | # 91 | 92 | RAW = """F10 93 | N3 94 | F7 95 | R90 96 | F11""" 97 | 98 | ACTIONS = [Action.parse(line) for line in RAW.split("\n")] 99 | SHIP = Ship() 100 | 101 | for action in ACTIONS: 102 | SHIP.move(action) 103 | 104 | assert SHIP.x == 17 105 | assert SHIP.y == -8 106 | 107 | SAW = ShipAndWaypoint() 108 | for action in ACTIONS: 109 | SAW.move(action) 110 | 111 | assert SAW.ship_x == 214 112 | assert SAW.ship_y == -72 113 | 114 | # 115 | # problem 116 | # 117 | 118 | with open('inputs/day12.txt') as f: 119 | raw = f.read() 120 | actions = [Action.parse(line) for line in raw.split("\n")] 121 | ship = Ship() 122 | for action in actions: 123 | ship.move(action) 124 | print(abs(ship.x) + abs(ship.y)) 125 | 126 | saw = ShipAndWaypoint() 127 | for action in actions: 128 | saw.move(action) 129 | print(abs(saw.ship_x) + abs(saw.ship_y)) 130 | -------------------------------------------------------------------------------- /advent2020/day13.py: -------------------------------------------------------------------------------- 1 | from __future__ import annotations 2 | 3 | from typing import List 4 | from functools import reduce 5 | 6 | def earliest_bus(depart: int, buses: List[int]) -> int: 7 | missed_by = [depart % bus for bus in buses] 8 | waits = { 9 | bus: bus - miss if miss > 0 else 0 10 | for bus, miss in zip(buses, missed_by) 11 | } 12 | 13 | # choose the bus with the lowest wait 14 | bus = min(buses, key=lambda bus: waits[bus]) 15 | 16 | return bus * waits[bus] 17 | 18 | 19 | def make_factors(raw_buses: List[str]): 20 | indexed = [(i, int(bus)) for i, bus in enumerate(raw_buses) if bus != 'x'] 21 | factors = [(bus, (bus - i) % bus) for i, bus in indexed] 22 | return factors 23 | 24 | # chinese remainder code from 25 | # https://rosettacode.org/wiki/Chinese_remainder_theorem#Python_3.6 26 | 27 | def chinese_remainder(n, a): 28 | sum = 0 29 | prod = reduce(lambda a, b: a*b, n) 30 | for n_i, a_i in zip(n, a): 31 | p = prod // n_i 32 | sum += a_i * mul_inv(p, n_i) * p 33 | return sum % prod 34 | 35 | 36 | def mul_inv(a, b): 37 | b0 = b 38 | x0, x1 = 0, 1 39 | if b == 1: return 1 40 | while a > 1: 41 | q = a // b 42 | a, b = b, a%b 43 | x0, x1 = x1 - q * x0, x0 44 | if x1 < 0: x1 += b0 45 | return x1 46 | 47 | 48 | # Thanks to YouTube commenter Paul Fornia who suggested this approach. 49 | def chinese_remainder2(divisors: List[int], remainders: List[int]) -> int: 50 | solution = remainders[0] 51 | increment = divisors[0] 52 | 53 | # invariant: at step i, we have that 54 | # `solution % d[j] == r[j]` 55 | # `increment % d[j] == 0` 56 | # for all i <= j. In particular, we can add multiples of `increment` 57 | # to `solution` without changing the first invariant. 58 | 59 | for d, r in zip(divisors[1:], remainders[1:]): 60 | while solution % d != r: 61 | solution += increment 62 | increment *= d 63 | 64 | return solution % increment 65 | 66 | # 67 | # unit tests 68 | # 69 | 70 | RAW = """939 71 | 7,13,x,x,59,x,31,19""" 72 | 73 | L1, L2 = RAW.split("\n") 74 | DEPART = int(L1) 75 | BUSES = [int(x) for x in L2.split(",") if x != "x"] 76 | assert earliest_bus(DEPART, BUSES) == 295 77 | 78 | # 79 | # scratch around 80 | # 81 | 82 | """ 83 | 7,13,x,x,59,x,31,19 84 | 85 | find t such that 86 | 87 | t % 7 == 0 88 | t % 13 == 13 - 1 89 | skip 2 90 | skip 3 91 | t % 59 == 59 - 4 92 | skip 5 93 | t % 31 == 31 - 6 94 | t % 19 == 19 - 7 95 | """ 96 | 97 | # 98 | # problem 99 | # 100 | 101 | with open('inputs/day13.txt') as f: 102 | depart = int(next(f)) 103 | buses_raw = [x for x in next(f).split(",")] 104 | buses = [int(x) for x in buses_raw if x != "x"] 105 | 106 | 107 | print(earliest_bus(depart, buses)) 108 | 109 | n, a = zip(*make_factors(buses_raw)) 110 | 111 | -------------------------------------------------------------------------------- /advent2020/day14.py: -------------------------------------------------------------------------------- 1 | from __future__ import annotations 2 | from os import umask 3 | from typing import Dict, List, Iterator, Iterable 4 | from collections import defaultdict 5 | import itertools 6 | 7 | def to_binary(value: int, num_digits: int = 36) -> List[int]: 8 | digits = [] 9 | for _ in range(num_digits): 10 | digits.append(value % 2) 11 | value = value // 2 12 | return list(reversed(digits)) 13 | 14 | def apply_mask(value: int, mask: str) -> int: 15 | """do not use, doesn't work""" 16 | output = 0 17 | for i, m in enumerate(reversed(mask)): 18 | if m == '1': 19 | output += 2 ** i 20 | elif m == '0': 21 | pass 22 | else: 23 | output += (2 ** i) & value 24 | 25 | return output 26 | 27 | def apply_mask2(value: int, mask: str) -> int: 28 | digits = to_binary(value) 29 | output = 0 30 | 31 | for i, (digit, m) in enumerate(zip(digits, mask)): 32 | if m == '1': 33 | digits[i] = 1 34 | elif m == '0': 35 | digits[i] = 0 36 | 37 | return sum(digit * (2 ** i) for i, digit in enumerate(reversed(digits))) 38 | 39 | def apply_multi_mask(value: int, mask: str) -> Iterator[int]: 40 | digits = to_binary(value) 41 | output = 0 42 | 43 | xs = [i for i, c in enumerate(mask) if c == 'X'] 44 | sub_values = [[0, 1] for _ in xs] 45 | for choice in itertools.product(*sub_values): 46 | print(choice) 47 | new_digits = digits[:] 48 | it = iter(choice) 49 | for i, (digit, m) in enumerate(zip(digits, mask)): 50 | if m == '0': 51 | pass # leave the digit as is 52 | elif m == '1': 53 | new_digits[i] = 1 54 | else: 55 | new_digits[i] = next(it) 56 | 57 | yield sum(digit * (2 ** i) for i, digit in enumerate(reversed(new_digits))) 58 | 59 | 60 | def run(program: List[str]) -> Dict[int, int]: 61 | memory = defaultdict(int) 62 | mask = None 63 | 64 | for line in program: 65 | if line.startswith("mask"): 66 | mask = line.split(" = ")[-1] 67 | else: 68 | mem, value_s = line.split(" = ") 69 | value = int(value_s) 70 | pos = int(mem[4:-1]) 71 | 72 | value = apply_mask2(value, mask) 73 | 74 | memory[pos] = value 75 | 76 | 77 | return memory 78 | 79 | 80 | def run2(program: List[str]) -> Dict[int, int]: 81 | mask = None 82 | memory = defaultdict(int) 83 | 84 | for line in program: 85 | print(line) 86 | if line.startswith("mask"): 87 | mask = line.split(" = ")[-1] 88 | else: 89 | mem, value_s = line.split(" = ") 90 | value = int(value_s) 91 | pos = int(mem[4:-1]) 92 | 93 | print(pos, value) 94 | 95 | for pos2 in apply_multi_mask(pos, mask): 96 | memory[pos2] = value 97 | 98 | return memory 99 | 100 | 101 | # 102 | # unit tests 103 | # 104 | 105 | RAW = """mask = XXXXXXXXXXXXXXXXXXXXXXXXXXXXX1XXXX0X 106 | mem[8] = 11 107 | mem[7] = 101 108 | mem[8] = 0""" 109 | 110 | PROGRAM = RAW.split("\n") 111 | MEMORY = run(PROGRAM) 112 | assert sum(MEMORY.values()) == 165 113 | 114 | RAW2 = """mask = 000000000000000000000000000000X1001X 115 | mem[42] = 100 116 | mask = 00000000000000000000000000000000X0XX 117 | mem[26] = 1""" 118 | 119 | PROGRAM2 = RAW2.split("\n") 120 | MEMORY2 = run2(PROGRAM2) 121 | assert sum(MEMORY2.values()) == 208 122 | 123 | # 124 | # problem 125 | # 126 | 127 | with open('inputs/day14.txt') as f: 128 | program = [line for line in f] 129 | memory = run(program) 130 | print(sum(memory.values())) 131 | 132 | memory2 = run2(program) 133 | print(sum(memory2.values())) -------------------------------------------------------------------------------- /advent2020/day14_v2.py: -------------------------------------------------------------------------------- 1 | from __future__ import annotations 2 | from os import umask 3 | from typing import Dict, List, Iterator, Iterable 4 | from collections import defaultdict 5 | import itertools 6 | 7 | def to_binary(value: int, num_digits: int = 36) -> str: 8 | return f"{value:36b}".replace(" ", "0") 9 | 10 | def apply_mask(value: int, mask: str) -> int: 11 | outdigits = [] 12 | 13 | for vb, mb in zip(to_binary(value), mask): 14 | if mb == 'X': 15 | outdigits.append(vb) 16 | else: 17 | outdigits.append(mb) 18 | 19 | return int("".join(outdigits), 2) 20 | 21 | 22 | def apply_multi_mask(value: int, mask: str) -> Iterator[int]: 23 | binary = to_binary(value) 24 | 25 | xs = [i for i, c in enumerate(mask) if c == 'X'] 26 | sub_values = [['0', '1'] for _ in xs] 27 | for choice in itertools.product(*sub_values): 28 | new_binary = list(binary) 29 | it = iter(choice) 30 | 31 | for i, (vb, mb) in enumerate(zip(binary, mask)): 32 | if mb == '0': 33 | pass 34 | elif mb == '1': 35 | new_binary[i] = '1' 36 | else: 37 | new_binary[i] = next(it) 38 | 39 | yield int(''.join(new_binary), 2) 40 | 41 | 42 | 43 | def run(program: List[str]) -> Dict[int, int]: 44 | memory = defaultdict(int) 45 | mask = None 46 | 47 | for line in program: 48 | if line.startswith("mask"): 49 | mask = line.split(" = ")[-1] 50 | else: 51 | mem, value_s = line.split(" = ") 52 | value = int(value_s) 53 | pos = int(mem[4:-1]) 54 | 55 | value = apply_mask(value, mask) 56 | 57 | memory[pos] = value 58 | 59 | 60 | return memory 61 | 62 | 63 | def run2(program: List[str]) -> Dict[int, int]: 64 | mask = None 65 | memory = defaultdict(int) 66 | 67 | for line in program: 68 | print(line) 69 | if line.startswith("mask"): 70 | mask = line.split(" = ")[-1] 71 | else: 72 | mem, value_s = line.split(" = ") 73 | value = int(value_s) 74 | pos = int(mem[4:-1]) 75 | 76 | print(pos, value) 77 | 78 | for pos2 in apply_multi_mask(pos, mask): 79 | memory[pos2] = value 80 | 81 | return memory 82 | 83 | 84 | # 85 | # unit tests 86 | # 87 | 88 | RAW = """mask = XXXXXXXXXXXXXXXXXXXXXXXXXXXXX1XXXX0X 89 | mem[8] = 11 90 | mem[7] = 101 91 | mem[8] = 0""" 92 | 93 | PROGRAM = RAW.split("\n") 94 | MEMORY = run(PROGRAM) 95 | assert sum(MEMORY.values()) == 165 96 | 97 | RAW2 = """mask = 000000000000000000000000000000X1001X 98 | mem[42] = 100 99 | mask = 00000000000000000000000000000000X0XX 100 | mem[26] = 1""" 101 | 102 | PROGRAM2 = RAW2.split("\n") 103 | MEMORY2 = run2(PROGRAM2) 104 | assert sum(MEMORY2.values()) == 208 105 | 106 | # 107 | # problem 108 | # 109 | 110 | with open('inputs/day14.txt') as f: 111 | program = [line for line in f] 112 | memory = run(program) 113 | print(sum(memory.values())) 114 | 115 | memory2 = run2(program) 116 | print(sum(memory2.values())) -------------------------------------------------------------------------------- /advent2020/day15.py: -------------------------------------------------------------------------------- 1 | from __future__ import annotations 2 | 3 | from typing import List, Iterator, Dict 4 | import itertools 5 | 6 | def play_game(starting_numbers: List[int]) -> Iterator[int]: 7 | last_seen: Dict[int, int] = {} 8 | gap = None 9 | 10 | for i in itertools.count(0): 11 | if i < len(starting_numbers): 12 | # still in starting numbers, use them 13 | n = starting_numbers[i] 14 | elif gap: 15 | # number seen before, so say the gap 16 | n = gap 17 | else: 18 | # new number, so say zero 19 | n = 0 20 | 21 | if n in last_seen: 22 | # saw this already, so figure out the gap 23 | gap = i - last_seen[n] 24 | else: 25 | # first time, so no gap 26 | gap = None 27 | 28 | # update last seen and yield 29 | last_seen[n] = i 30 | yield n 31 | 32 | def n2020(starting_numbers: List[int]) -> int: 33 | game = play_game(starting_numbers) 34 | for i in range(2020): 35 | n = next(game) 36 | return n 37 | 38 | def n30000000(starting_numbers: List[int]) -> int: 39 | game = play_game(starting_numbers) 40 | for i in range(30000000): 41 | if i % 1000 == 0: 42 | print(i, i / 30000000) 43 | n = next(game) 44 | return n 45 | 46 | 47 | # 48 | # unit tests 49 | # 50 | 51 | game = play_game([0, 3, 6]) 52 | output = [next(game) for _ in range(10)] 53 | assert n2020([0, 3, 6]) == 436 54 | 55 | # 56 | # problem 57 | # 58 | 59 | numbers = [2,20,0,4,1,17] 60 | # print(n2020(numbers)) 61 | # print(n30000000(numbers)) -------------------------------------------------------------------------------- /advent2020/day16.py: -------------------------------------------------------------------------------- 1 | from __future__ import annotations 2 | from typing import Dict, List, NamedTuple, Tuple 3 | import math 4 | 5 | Range = Tuple[int, int] 6 | 7 | def make_range(s: str) -> Range: 8 | lo, hi = s.split("-") 9 | return (int(lo), int(hi)) 10 | 11 | class Rule(NamedTuple): 12 | name: str 13 | ranges: Tuple[Range, Range] 14 | 15 | def is_valid(self, i: int) -> bool: 16 | return any(lo <= i <= hi for lo, hi in self.ranges) 17 | 18 | @staticmethod 19 | def parse(line: str) -> Rule: 20 | name, ranges = line.split(": ") 21 | r1, r2 = ranges.split(" or ") 22 | return Rule( 23 | name=name, 24 | ranges=(make_range(r1), make_range(r2)) 25 | ) 26 | 27 | Ticket = List[int] 28 | 29 | def make_ticket(s: str) -> Ticket: 30 | return [int(n) for n in s.split(",")] 31 | 32 | class Problem(NamedTuple): 33 | rules: List[Rule] 34 | your_ticket: Ticket 35 | nearby_tickets: List[Ticket] 36 | 37 | def valid_for_any_field(self, i: int) -> bool: 38 | return any(rule.is_valid(i) for rule in self.rules) 39 | 40 | def is_invalid(self, ticket: Ticket) -> bool: 41 | for n in ticket: 42 | if not self.valid_for_any_field(n): 43 | return True 44 | return False 45 | 46 | def error_rate(self) -> int: 47 | return sum( 48 | n 49 | for ticket in self.nearby_tickets 50 | for n in ticket 51 | if not self.valid_for_any_field(n) 52 | ) 53 | 54 | def discard_invalid_tickets(self) -> Problem: 55 | valid_tickets = [ 56 | t for t in self.nearby_tickets 57 | if not self.is_invalid(t) 58 | ] 59 | return self._replace(nearby_tickets=valid_tickets) 60 | 61 | @staticmethod 62 | def parse(raw: str) -> Problem: 63 | a, b, c = raw.split("\n\n") 64 | b = b.split("\n")[-1] 65 | 66 | rules = [Rule.parse(line) for line in a.split("\n")] 67 | my_ticket = make_ticket(b) 68 | nearby_tickets = [make_ticket(line) for line in c.split("\n")[1:]] 69 | 70 | return Problem(rules, my_ticket, nearby_tickets) 71 | 72 | 73 | def identify_fields(problem: Problem) -> List[str]: 74 | num_fields = len(problem.your_ticket) 75 | tickets = [problem.your_ticket] + problem.nearby_tickets 76 | 77 | # candidates[i] is the possibilities for the ith field 78 | candidates = [ 79 | {rule for rule in problem.rules 80 | if all(rule.is_valid(ticket[i]) for ticket in tickets)} 81 | for i in range(num_fields) 82 | ] 83 | 84 | while True: 85 | unique_rules = [rule for cand in candidates if len(cand) == 1 for rule in cand] 86 | if len(unique_rules) == num_fields: 87 | return [rule.name for cand in candidates for rule in cand] 88 | 89 | for i in range(num_fields): 90 | cand = candidates[i] 91 | if len(cand) > 1: 92 | cand = {rule for rule in cand if rule not in unique_rules} 93 | candidates[i] = cand 94 | 95 | 96 | # 97 | # unit test 98 | # 99 | 100 | RAW = """class: 1-3 or 5-7 101 | row: 6-11 or 33-44 102 | seat: 13-40 or 45-50 103 | 104 | your ticket: 105 | 7,1,14 106 | 107 | nearby tickets: 108 | 7,3,47 109 | 40,4,50 110 | 55,2,20 111 | 38,6,12""" 112 | 113 | PROBLEM = Problem.parse(RAW) 114 | 115 | assert PROBLEM.error_rate() == 71 116 | 117 | PROBLEM2 = PROBLEM.discard_invalid_tickets() 118 | 119 | assert PROBLEM2.nearby_tickets == [[7, 3, 47]] 120 | 121 | # 122 | # problem 123 | # 124 | 125 | with open('inputs/day16.txt') as f: 126 | raw = f.read() 127 | problem = Problem.parse(raw) 128 | print(problem.error_rate()) 129 | 130 | problem2 = problem.discard_invalid_tickets() 131 | fields = identify_fields(problem2) 132 | 133 | departure_values = [ 134 | n 135 | for name, n in zip(fields, problem2.your_ticket) 136 | if name.startswith('departure') 137 | ] 138 | assert len(departure_values) == 6 139 | print(math.prod(departure_values)) 140 | -------------------------------------------------------------------------------- /advent2020/day17.py: -------------------------------------------------------------------------------- 1 | from __future__ import annotations 2 | from typing import NamedTuple, Set, Iterator, Tuple, List 3 | import itertools 4 | 5 | 6 | Point = Tuple[int, ...] 7 | 8 | 9 | def neighbors(point: Point) -> Iterator[Point]: 10 | dim = len(point) 11 | changes = [[-1, 0, 1] for _ in range(dim)] 12 | for deltas in itertools.product(*changes): 13 | if any(d != 0 for d in deltas): 14 | p: List[int] = [x + dx for x, dx in zip(point, deltas)] 15 | yield tuple(p) 16 | 17 | Grid = Set[Point] 18 | 19 | 20 | def step(grid: Grid) -> Grid: 21 | new_candidates = { 22 | p 23 | for point in grid 24 | for p in neighbors(point) 25 | if p not in grid 26 | } 27 | 28 | new_grid = set() 29 | 30 | for point in grid: 31 | n = sum(p in grid for p in neighbors(point)) 32 | if n in (2, 3): 33 | new_grid.add(point) 34 | 35 | for point in new_candidates: 36 | n = sum(p in grid for p in neighbors(point)) 37 | if n == 3: 38 | new_grid.add(point) 39 | 40 | return new_grid 41 | 42 | def make_grid(raw: str, dim: int): 43 | lines = raw.split("\n") 44 | pad = tuple([0] * (dim-2)) 45 | return { 46 | (x, y) + pad 47 | for y, row in enumerate(lines) 48 | for x, c in enumerate(row) 49 | if c == '#' 50 | } 51 | 52 | # 53 | # unit tests 54 | # 55 | 56 | RAW = """.#. 57 | ..# 58 | ###""" 59 | 60 | GRID3 = make_grid(RAW, 3) 61 | 62 | for _ in range(6): 63 | GRID3 = step(GRID3) 64 | 65 | assert len(GRID3) == 112 66 | 67 | GRID4 = make_grid(RAW, 4) 68 | 69 | for _ in range(6): 70 | GRID4 = step(GRID4) 71 | 72 | assert len(GRID4) == 848 73 | 74 | # 75 | # problem 76 | # 77 | 78 | with open('inputs/day17.txt') as f: 79 | raw = f.read() 80 | 81 | grid3 = make_grid(raw, 3) 82 | for _ in range(6): 83 | grid3 = step(grid3) 84 | print(len(grid3)) 85 | 86 | grid4 = make_grid(raw, 4) 87 | for i in range(6): 88 | print(i) 89 | grid4 = step(grid4) 90 | print(len(grid4)) 91 | -------------------------------------------------------------------------------- /advent2020/day18.py: -------------------------------------------------------------------------------- 1 | from __future__ import annotations 2 | from dataclasses import dataclass 3 | from typing import List 4 | import re 5 | 6 | Expression = List[str] 7 | 8 | def evaluate(expression: Expression) -> int: 9 | """ 10 | This is for an expression with no parentheses 11 | """ 12 | value = int(expression[0]) 13 | for i in range(1, len(expression), 2): 14 | op = expression[i] 15 | if op == "+": 16 | value = value + int(expression[i+1]) 17 | elif op == "*": 18 | value = value * int(expression[i+1]) 19 | else: 20 | raise ValueError(f"bad op: {op}") 21 | 22 | return value 23 | 24 | # Regex to match open-parens ... closed-parens 25 | # with no parens in between 26 | rgx = r"\([^\(]+?\)" 27 | 28 | def evaluate_raw(raw: str) -> int: 29 | while (match := re.search(rgx, raw)): 30 | value = evaluate(match.group()[1:-1].split()) 31 | raw = raw[:match.start()] + str(value) + raw[match.end():] 32 | else: 33 | tokens = raw.split() 34 | return evaluate(tokens) 35 | 36 | 37 | def evaluate2(expression: Expression) -> int: 38 | """again assumes expression has no parens""" 39 | while len(expression) > 1: 40 | if "+" in expression: 41 | # find the plus and use it on the surrounding numbers 42 | i = expression.index("+") 43 | new_val = int(expression[i-1]) + int(expression[i+1]) 44 | # and then put that result back 45 | expression = expression[:i-1] + [str(new_val)] + expression[i+2:] 46 | else: 47 | return evaluate(expression) 48 | 49 | return int(expression[0]) 50 | 51 | 52 | def evaluate_raw2(raw: str) -> int: 53 | while (match := re.search(rgx, raw)): 54 | value = evaluate2(match.group()[1:-1].split()) 55 | raw = raw[:match.start()] + str(value) + raw[match.end():] 56 | else: 57 | tokens = raw.split() 58 | return evaluate2(tokens) 59 | 60 | 61 | # 62 | # unit tests 63 | # 64 | 65 | RAW = "1 + 2 * 3 + 4 * 5 + 6" 66 | assert evaluate_raw(RAW) == 71 67 | assert evaluate_raw2(RAW) == 231 68 | 69 | RAW2 = "((2 + 4 * 9) * (6 + 9 * 8 + 6) + 6) + 2 + 4 * 2" 70 | assert evaluate_raw(RAW2) == 13632 71 | assert evaluate_raw2(RAW2) == 23340 72 | 73 | # 74 | # problem 75 | # 76 | 77 | with open('inputs/day18.txt') as f: 78 | raw = f.read() 79 | lines = raw.split("\n") 80 | print(sum(evaluate_raw(line) for line in lines)) 81 | print(sum(evaluate_raw2(line) for line in lines)) -------------------------------------------------------------------------------- /advent2020/day19.py: -------------------------------------------------------------------------------- 1 | from __future__ import annotations 2 | from typing import NamedTuple, List, Optional, Tuple, Iterator 3 | from collections import deque 4 | 5 | class Rule(NamedTuple): 6 | id: int 7 | literal: Optional[str] = None 8 | subrules: List[List[int]] = [] 9 | 10 | @staticmethod 11 | def parse(line: str) -> Rule: 12 | rule_id, rest = line.strip().split(": ") 13 | if rest.startswith('"'): 14 | return Rule(id=int(rule_id), literal=rest[1:-1]) 15 | 16 | if "|" in rest: 17 | parts = rest.split(" | ") 18 | else: 19 | parts = [rest] 20 | 21 | return Rule(id=int(rule_id), 22 | subrules=[[int(n) for n in part.split()] for part in parts]) 23 | 24 | 25 | def check(s: str, rules: List[Rule]) -> bool: 26 | """ 27 | Returns True if s is a match for rules[0] 28 | """ 29 | # queue of pairs (remaining string, remaining rules) 30 | q = deque([(s, [0])]) 31 | 32 | while q: 33 | # take from the queue 34 | s, rule_ids = q.popleft() 35 | 36 | # consumed the whole string and all the rules, 37 | # so that's a match 38 | if not s and not rule_ids: 39 | return True 40 | 41 | # consumed the string or the rules but not both, 42 | # so this is a dead end, forget it and continue 43 | elif not s or not rule_ids: 44 | continue 45 | 46 | # each rule can match at most 1 character 47 | # so if we have more than that it's definitely not a match 48 | elif len(rule_ids) > len(s): 49 | continue 50 | 51 | # have both s and rule_ids. So let's try the first rule in our ids 52 | rule = rules[rule_ids[0]] 53 | rule_ids = rule_ids[1:] 54 | 55 | # first rule is literal, so if it matches the first character, 56 | # then add the rest of the string and the rest of the rules to the queue 57 | if rule.literal and s[0] == rule.literal: 58 | q.append((s[1:], rule_ids)) 59 | 60 | # otherwise, I have one more sequences of subrules, 61 | # for each of those sequences, I prepend it to the remaining rule_ids 62 | # and add that new list of rule ids to the queue with s 63 | else: 64 | for subrule_ids in rule.subrules: 65 | q.append((s, subrule_ids + rule_ids)) 66 | 67 | 68 | # queue is exhausted, never found a match, so return False 69 | return False 70 | 71 | 72 | def parse(raw: str): 73 | raw_rules, raw_strings = raw.split("\n\n") 74 | rules = [Rule.parse(rr) for rr in raw_rules.split("\n")] 75 | rules.sort() # <--- ARGH 76 | assert all(rule.id == i for i, rule in enumerate(rules)) 77 | strings = raw_strings.split("\n") 78 | return rules, strings 79 | 80 | 81 | # 82 | # unit tests 83 | # 84 | 85 | RAW = """0: 4 1 5 86 | 1: 2 3 | 3 2 87 | 2: 4 4 | 5 5 88 | 3: 4 5 | 5 4 89 | 4: "a" 90 | 5: "b" 91 | 92 | ababbb 93 | bababa 94 | abbbab 95 | aaabbb 96 | aaaabbb""" 97 | 98 | RULES, STRINGS = parse(RAW) 99 | 100 | assert sum(check(s, RULES) for s in STRINGS) == 2 101 | 102 | # 103 | # problem 104 | # 105 | 106 | with open('inputs/day19.txt') as f: 107 | raw = f.read() 108 | rules, strings = parse(raw) 109 | 110 | # good = 0 111 | # for i, s in enumerate(strings): 112 | # print(i, s) 113 | # if check(s, rules): 114 | # good += 1 115 | 116 | # print(good) 117 | 118 | # part 2 119 | rules[8] = Rule.parse("8: 42 | 42 8") 120 | rules[11] = Rule.parse("11: 42 31 | 42 11 31") 121 | 122 | good = 0 123 | for i, s in enumerate(strings): 124 | print(i, s) 125 | if check(s, rules): 126 | good += 1 127 | 128 | print(good) -------------------------------------------------------------------------------- /advent2020/day20.py: -------------------------------------------------------------------------------- 1 | from __future__ import annotations 2 | from typing import NamedTuple, List, Tuple, Iterator, Dict, Set, Optional 3 | from collections import Counter 4 | import math 5 | 6 | Edge = str 7 | 8 | class Edges(NamedTuple): 9 | top: Edge 10 | bottom: Edge 11 | left: Edge 12 | right: Edge 13 | 14 | Pixels = List[List[str]] 15 | 16 | class Tile(NamedTuple): 17 | tile_id: int 18 | pixels: Pixels 19 | 20 | def rotate(self, n: int) -> Tile: 21 | """ 22 | Rotate the tile clockwise n times 23 | and return a new Tile object 24 | """ 25 | pixels = self.pixels 26 | for _ in range(n): 27 | rotated = [] 28 | for c in range(len(pixels[0])): 29 | rotated.append([row[c] for row in reversed(pixels)]) 30 | pixels = rotated 31 | return self._replace(pixels=pixels) 32 | 33 | def flip_horizontal(self, do: bool = False) -> Tile: 34 | """ 35 | Flip the tile horizontally and return a new tile object 36 | """ 37 | pixels = [list(reversed(row)) for row in self.pixels] if do else self.pixels 38 | return self._replace(pixels=pixels) 39 | 40 | def flip_vertical(self, do: bool = False) -> Tile: 41 | """ 42 | Flip the tile vertically and return a new tile object 43 | """ 44 | pixels = list(reversed(self.pixels)) if do else self.pixels 45 | return self._replace(pixels=pixels) 46 | 47 | def all_rotations(self) -> Iterator[Tile]: 48 | """ 49 | Return the 8 tiles I can get from this one 50 | by doing rotations and flips 51 | """ 52 | for flip_h in [True, False]: 53 | for rot in [0, 1, 2, 3]: 54 | yield (self 55 | .flip_horizontal(flip_h) 56 | .rotate(rot) 57 | ) 58 | 59 | 60 | def show(self) -> None: 61 | for row in self.pixels: 62 | print(''.join(row)) 63 | 64 | @property 65 | def top(self) -> str: 66 | return ''.join(self.pixels[0]) 67 | 68 | @property 69 | def bottom(self) -> str: 70 | return ''.join(self.pixels[-1]) 71 | 72 | @property 73 | def left(self) -> str: 74 | return ''.join([row[0] for row in self.pixels]) 75 | 76 | @property 77 | def right(self) -> str: 78 | return ''.join([row[-1] for row in self.pixels]) 79 | 80 | def edges( 81 | self, 82 | reverse: bool = False 83 | ) -> Edges: 84 | """ 85 | Returns the edges of the tile as strings. 86 | If reverse == True, rotates the tile by 180 degrees first, 87 | which results in all the edges being in the opposite direction 88 | """ 89 | if reverse: 90 | return self.rotate(2).edges() 91 | return Edges( 92 | top=self.top, bottom=self.bottom, right=self.right, left=self.left 93 | ) 94 | 95 | @staticmethod 96 | def parse(raw_tile: str) -> Tile: 97 | lines = raw_tile.split("\n") 98 | tile_id = int(lines[0].split()[-1][:-1]) 99 | pixels = [list(line) for line in lines[1:]] 100 | return Tile(tile_id, pixels) 101 | 102 | def make_tiles(raw: str) -> List[Tile]: 103 | tiles_raw = raw.split("\n\n") 104 | return [Tile.parse(tile_raw) for tile_raw in tiles_raw] 105 | 106 | 107 | def find_corners(tiles: List[Tile]) -> List[Tile]: 108 | """ 109 | Return corners oriented so that 110 | they would be the top left corner 111 | """ 112 | # count up all the edges / reverse edges that occur 113 | # for example, if a tile had the top edge "ABCD", 114 | # we would count "ABCD" once and also "DCBA" once 115 | edge_counts = Counter( 116 | edge 117 | for tile in tiles 118 | for reverse in [True, False] 119 | for edge in tile.edges(reverse) 120 | ) 121 | 122 | corners = [] 123 | 124 | for tile in tiles: 125 | sides_with_no_matches = 0 126 | for edge in tile.edges(): 127 | if edge_counts[edge] == 1 and edge_counts[edge[::-1]] == 1: 128 | sides_with_no_matches += 1 129 | 130 | if sides_with_no_matches == 2: 131 | # rotate to get corner edges at top and left 132 | for rot in [0, 1, 2, 3]: 133 | tile = tile.rotate(rot) 134 | edges = tile.edges() 135 | 136 | if edge_counts[edges.left] == 1 and edge_counts[edges.top] == 1: 137 | corners.append(tile) 138 | break 139 | 140 | return corners 141 | 142 | 143 | Assembly = List[List[Optional[Tile]]] 144 | 145 | class Constraint(NamedTuple): 146 | """ 147 | Says that the tile at location (i, j) 148 | must have sides that match the specified 149 | top / bottom / left / right 150 | """ 151 | i: int 152 | j: int 153 | top: Optional[str] = None 154 | bottom: Optional[str] = None 155 | left: Optional[str] = None 156 | right: Optional[str] = None 157 | 158 | def satisfied_by(self, tile: Tile) -> bool: 159 | """ 160 | Does the tile satisfy this constraint 161 | """ 162 | if self.top and tile.top != self.top: 163 | return False 164 | if self.bottom and tile.bottom != self.bottom: 165 | return False 166 | if self.left and tile.left != self.left: 167 | return False 168 | if self.right and tile.right != self.right: 169 | return False 170 | return True 171 | 172 | @property 173 | def num_constraints(self) -> int: 174 | return ( 175 | (self.top is not None) + 176 | (self.bottom is not None) + 177 | (self.left is not None) + 178 | (self.right is not None) 179 | ) 180 | 181 | def find_constraints(assembly: Assembly) -> Iterator[Constraint]: 182 | """ 183 | Create constraints from a (partially filled in) Assembly. 184 | No constraints for already-filled-in tiles or unconstrained locations. 185 | """ 186 | n = len(assembly) 187 | 188 | for i, row in enumerate(assembly): 189 | for j, tile in enumerate(row): 190 | # already have a tile here 191 | if assembly[i][j]: 192 | continue 193 | constraints: Dict[str, str] = {} 194 | if i > 0 and (nbr := assembly[i-1][j]): 195 | constraints["top"] = nbr.bottom 196 | if i < n-1 and (nbr := assembly[i+1][j]): 197 | constraints["bottom"] = nbr.top 198 | if j > 0 and (nbr := assembly[i][j-1]): 199 | constraints["left"] = nbr.right 200 | if j < n-1 and (nbr := assembly[i][j+1]): 201 | constraints["right"] = nbr.left 202 | 203 | if constraints: 204 | yield Constraint(i, j, **constraints) 205 | 206 | 207 | def assemble_image(tiles: List[Tile]) -> Assembly: 208 | """ 209 | Take the tiles and figure out how to stick them together 210 | """ 211 | num_tiles = len(tiles) 212 | side_length = int(math.sqrt(num_tiles)) 213 | corners = find_corners(tiles) 214 | 215 | # Pick a corner, any corner 216 | tile = corners[0] 217 | 218 | # Create an empty assembly 219 | assembly: Assembly = [[None for _ in range(side_length)] for _ in range(side_length)] 220 | 221 | # Put this corner tile in the top left 222 | assembly[0][0] = tile 223 | 224 | # Keep track of which tiles I've already placed 225 | placed: Dict[int, Tuple[int, int]] = {tile.tile_id: (0, 0)} 226 | 227 | # Repeat until all tiles have been placed 228 | while len(placed) < num_tiles: 229 | # Just care about unplaced tiles 230 | tiles = [t for t in tiles if t.tile_id not in placed] 231 | 232 | # Find the constraints based on all the tiles placed so far 233 | # and order them by descending # of constraints 234 | constraints = list(find_constraints(assembly)) 235 | constraints.sort(key=lambda c: c.num_constraints, reverse=True) 236 | 237 | # Did I find a tile to add, so we can break out of inner loops 238 | found_one = False 239 | 240 | # Try constraints one at a time and see if we can find a tile 241 | # that satisfies them 242 | for constraint in constraints: 243 | for tile in tiles: 244 | # try all rotations for this tile, to see if any satisfies this constraint 245 | for rot in tile.all_rotations(): 246 | if constraint.satisfied_by(rot): 247 | # place this rotation (which is a tile) at i, j 248 | assembly[constraint.i][constraint.j] = rot 249 | placed[rot.tile_id] = (constraint.i, constraint.j) 250 | found_one = True 251 | break 252 | if found_one: 253 | break 254 | if found_one: 255 | break 256 | 257 | return assembly 258 | 259 | def glue(assembly: Assembly) -> Pixels: 260 | """ 261 | Glue together the Tiles into a single grid of pixels, 262 | removing the edges of each tile 263 | """ 264 | N = len(assembly) 265 | n = len(assembly[0][0].pixels) 266 | nout = (n - 2) * N 267 | glued = [['' for _ in range(nout)] for _ in range(nout)] 268 | for i, row in enumerate(assembly): 269 | for j, tile in enumerate(row): 270 | cropped = [line[1:-1] for line in tile.pixels[1:-1]] 271 | for ii, crow in enumerate(cropped): 272 | for jj, pixel in enumerate(crow): 273 | glued[i * (n-2) + ii][j * (n-2) + jj] = pixel 274 | 275 | return glued 276 | 277 | SEA_MONSTER_RAW = """ # 278 | # ## ## ### 279 | # # # # # #""" 280 | 281 | # offsets for a sea monster 282 | SEA_MONSTER = [ 283 | (i, j) 284 | for i, row in enumerate(SEA_MONSTER_RAW.split("\n")) 285 | for j, c in enumerate(row) 286 | if c == '#'] 287 | 288 | def find_sea_monsters(pixels: Pixels) -> Iterator[Tuple[int, int]]: 289 | """ 290 | Return the indices of the top left corner of each sea monster 291 | """ 292 | for i, row in enumerate(pixels): 293 | for j, c in enumerate(row): 294 | try: 295 | if all(pixels[i + di][j + dj] == '#' for di, dj in SEA_MONSTER): 296 | yield (i, j) 297 | except IndexError: 298 | continue 299 | 300 | def roughness(glued: Pixels) -> int: 301 | """ 302 | Count the #s that are not part of a sea monster 303 | """ 304 | # put the pixels in a Tile so we can use Tile methods 305 | tile = Tile(0, glued) 306 | 307 | # for each of the 8 rotation/flips, find the list of sea monster top lefts 308 | finds = [(t, list(find_sea_monsters(t.pixels))) for t in tile.all_rotations()] 309 | 310 | # only keep the ones that had sea monsters 311 | finds = [(t, sm) for t, sm in finds if sm] 312 | 313 | # hopefully only one of them had sea monsters 314 | assert len(finds) == 1 315 | 316 | # and that's our tile (and sea monster locations) 317 | t, sms = finds[0] 318 | 319 | # now we can computer all pixels that are showing a sea monster 320 | sea_monster_pixels = {(i + di, j + dj) 321 | for i, j in sms 322 | for di, dj in SEA_MONSTER} 323 | 324 | # and count all the '#'s that are not sea monster pixels 325 | return sum(c == '#' and (i, j) not in sea_monster_pixels 326 | for i, row in enumerate(t.pixels) 327 | for j, c in enumerate(row)) 328 | 329 | # 330 | # unit tests 331 | # 332 | 333 | RAW = """Tile 2311: 334 | ..##.#..#. 335 | ##..#..... 336 | #...##..#. 337 | ####.#...# 338 | ##.##.###. 339 | ##...#.### 340 | .#.#.#..## 341 | ..#....#.. 342 | ###...#.#. 343 | ..###..### 344 | 345 | Tile 1951: 346 | #.##...##. 347 | #.####...# 348 | .....#..## 349 | #...###### 350 | .##.#....# 351 | .###.##### 352 | ###.##.##. 353 | .###....#. 354 | ..#.#..#.# 355 | #...##.#.. 356 | 357 | Tile 1171: 358 | ####...##. 359 | #..##.#..# 360 | ##.#..#.#. 361 | .###.####. 362 | ..###.#### 363 | .##....##. 364 | .#...####. 365 | #.##.####. 366 | ####..#... 367 | .....##... 368 | 369 | Tile 1427: 370 | ###.##.#.. 371 | .#..#.##.. 372 | .#.##.#..# 373 | #.#.#.##.# 374 | ....#...## 375 | ...##..##. 376 | ...#.##### 377 | .#.####.#. 378 | ..#..###.# 379 | ..##.#..#. 380 | 381 | Tile 1489: 382 | ##.#.#.... 383 | ..##...#.. 384 | .##..##... 385 | ..#...#... 386 | #####...#. 387 | #..#.#.#.# 388 | ...#.#.#.. 389 | ##.#...##. 390 | ..##.##.## 391 | ###.##.#.. 392 | 393 | Tile 2473: 394 | #....####. 395 | #..#.##... 396 | #.##..#... 397 | ######.#.# 398 | .#...#.#.# 399 | .######### 400 | .###.#..#. 401 | ########.# 402 | ##...##.#. 403 | ..###.#.#. 404 | 405 | Tile 2971: 406 | ..#.#....# 407 | #...###... 408 | #.#.###... 409 | ##.##..#.. 410 | .#####..## 411 | .#..####.# 412 | #..#.#..#. 413 | ..####.### 414 | ..#.#.###. 415 | ...#.#.#.# 416 | 417 | Tile 2729: 418 | ...#.#.#.# 419 | ####.#.... 420 | ..#.#..... 421 | ....#..#.# 422 | .##..##.#. 423 | .#.####... 424 | ####.#.#.. 425 | ##.####... 426 | ##..#.##.. 427 | #.##...##. 428 | 429 | Tile 3079: 430 | #.#.#####. 431 | .#..###### 432 | ..#....... 433 | ######.... 434 | ####.#..#. 435 | .#...#.##. 436 | #.#####.## 437 | ..#.###... 438 | ..#....... 439 | ..#.###...""" 440 | 441 | TILES = make_tiles(RAW) 442 | CORNERS = find_corners(TILES) 443 | assert len(CORNERS) == 4 444 | assert math.prod(tile.tile_id for tile in CORNERS) == 20899048083289 445 | 446 | IMAGES = assemble_image(TILES) 447 | GLUED = glue(IMAGES) 448 | assert roughness(GLUED) == 273 449 | 450 | # 451 | # problem 452 | # 453 | 454 | with open('inputs/day20.txt') as f: 455 | raw = f.read() 456 | 457 | tiles = make_tiles(raw) 458 | corners = find_corners(tiles) 459 | assert len(corners) == 4 460 | print(math.prod(tile.tile_id for tile in corners)) 461 | images = assemble_image(tiles) 462 | glued = glue(images) 463 | print(roughness(glued)) -------------------------------------------------------------------------------- /advent2020/day21.py: -------------------------------------------------------------------------------- 1 | from __future__ import annotations 2 | from typing import NamedTuple, Set, List, Dict 3 | from collections import defaultdict 4 | 5 | class Food(NamedTuple): 6 | ingredients: List[str] 7 | allergens: List[str] 8 | 9 | @staticmethod 10 | def parse(line: str) -> Food: 11 | parts = line.split("(contains ") 12 | if len(parts) == 1: 13 | allergens = [] 14 | else: 15 | allergens = parts[1][:-1].split(", ") 16 | return Food(parts[0].split(), allergens) 17 | 18 | def candidates(foods: List[Food]) -> Dict[str, Set[str]]: 19 | # for each allergen, what could its ingredients be 20 | candidates: Dict[str, Set[str]] = {} 21 | 22 | for food in foods: 23 | for allergen in food.allergens: 24 | if allergen not in candidates: 25 | candidates[allergen] = set(food.ingredients) 26 | else: 27 | candidates[allergen] = candidates[allergen] & set(food.ingredients) 28 | 29 | allergens = list(candidates) 30 | # remove uniquely known allergens 31 | keep_going = True 32 | 33 | while keep_going: 34 | keep_going = False 35 | # what are the allergens where we know what their ingredient has to be 36 | known = {allergen: cands for allergen, cands in candidates.items() 37 | if len(cands) == 1} 38 | taken_ingredients = {ingredient for cands in known.values() for ingredient in cands} 39 | 40 | for allergen in allergens: 41 | # if this has multiple choices 42 | if allergen not in known and (candidates[allergen] & taken_ingredients): 43 | keep_going = True 44 | candidates[allergen] = candidates[allergen] - taken_ingredients 45 | 46 | return candidates 47 | 48 | def count_no_allergens(foods: List[Food]) -> int: 49 | cands = candidates(foods) 50 | can_contain = {ingredient for cands in cands.values() for ingredient in cands} 51 | 52 | return sum(ingredient not in can_contain 53 | for food in foods 54 | for ingredient in food.ingredients) 55 | 56 | def arrange(candidates: Dict[str, Set[str]]) -> str: 57 | assert all(len(s) == 1 for s in candidates.values()) 58 | 59 | return ",".join(next(iter(cands)) for allergen, cands in sorted(candidates.items())) 60 | 61 | 62 | # 63 | # unit tests 64 | # 65 | 66 | RAW = """mxmxvkd kfcds sqjhc nhms (contains dairy, fish) 67 | trh fvjkl sbzzf mxmxvkd (contains dairy) 68 | sqjhc fvjkl (contains soy) 69 | sqjhc mxmxvkd sbzzf (contains fish)""" 70 | 71 | FOODS = [Food.parse(line) for line in RAW.split("\n")] 72 | assert count_no_allergens(FOODS) == 5 73 | 74 | CANDIDATES = candidates(FOODS) 75 | assert arrange(CANDIDATES) == "mxmxvkd,sqjhc,fvjkl" 76 | 77 | # 78 | # problem 79 | # 80 | 81 | with open('inputs/day21.txt') as f: 82 | raw = f.read() 83 | 84 | foods = [Food.parse(line) for line in raw.split("\n")] 85 | print(count_no_allergens(foods)) 86 | cands = candidates(foods) 87 | print(arrange(cands)) -------------------------------------------------------------------------------- /advent2020/day22.py: -------------------------------------------------------------------------------- 1 | from __future__ import annotations 2 | from typing import List, Tuple 3 | from collections import deque 4 | import itertools 5 | 6 | 7 | class Game: 8 | def __init__(self, deck1: List[int], deck2: List[int]) -> None: 9 | self.deck1 = deque(deck1) 10 | self.deck2 = deque(deck2) 11 | self.game_over = False 12 | 13 | def play_one(self) -> None: 14 | card1 = self.deck1.popleft() 15 | card2 = self.deck2.popleft() 16 | if card1 > card2: 17 | self.deck1.extend([card1, card2]) 18 | elif card2 > card1: 19 | self.deck2.extend([card2, card1]) 20 | else: 21 | raise RuntimeError("cards were equal") 22 | if not self.deck1 or not self.deck2: 23 | self.game_over = True 24 | 25 | def play(self) -> None: 26 | while not self.game_over: 27 | self.play_one() 28 | 29 | def winning_score(self) -> int: 30 | if not self.game_over: 31 | raise RuntimeError("game is not over") 32 | winning_hand = self.deck1 or self.deck2 33 | return sum(card * i for card, i in zip(reversed(winning_hand), itertools.count(1))) 34 | 35 | def make_decks(raw: str) -> Tuple[List[int], List[int]]: 36 | hand1, hand2 = raw.split("\n\n") 37 | deck1 = [int(line.strip()) for line in hand1.split("\n")[1:]] 38 | deck2 = [int(line.strip()) for line in hand2.split("\n")[1:]] 39 | return deck1, deck2 40 | 41 | class RecursiveGame: 42 | def __init__(self, deck1: List[int], deck2: List[int]) -> None: 43 | self.deck1 = deque(deck1) 44 | self.deck2 = deque(deck2) 45 | self.winner = None 46 | self.seen = set() 47 | 48 | def signature(self) -> Tuple[Tuple[int], Tuple[int]]: 49 | return (tuple(self.deck1), tuple(self.deck2)) 50 | 51 | def play_one(self) -> None: 52 | sig = self.signature() 53 | if sig in self.seen: 54 | self.winner = 1 55 | return 56 | else: 57 | self.seen.add(sig) 58 | 59 | 60 | card1 = self.deck1.popleft() 61 | card2 = self.deck2.popleft() 62 | 63 | if len(self.deck1) >= card1 and len(self.deck2) >= card2: 64 | # winner is determined by playing recursive combat 65 | recursive_game = RecursiveGame( 66 | list(self.deck1)[:card1], 67 | list(self.deck2)[:card2] 68 | ) 69 | recursive_game.play() 70 | winner = recursive_game.winner 71 | else: 72 | # winner is determined by card 73 | winner = 1 if card1 > card2 else 2 74 | 75 | if winner == 1: 76 | self.deck1.extend([card1, card2]) 77 | else: 78 | self.deck2.extend([card2, card1]) 79 | 80 | if not self.deck1: 81 | self.winner = 2 82 | elif not self.deck2: 83 | self.winner = 1 84 | 85 | 86 | def play(self) -> None: 87 | while not self.winner: 88 | self.play_one() 89 | 90 | def winning_score(self) -> int: 91 | if not self.winner: 92 | raise RuntimeError("game is not over") 93 | winning_hand = self.deck1 or self.deck2 94 | return sum(card * i for card, i in zip(reversed(winning_hand), itertools.count(1))) 95 | 96 | 97 | # 98 | # unit tests 99 | # 100 | 101 | RAW = """Player 1: 102 | 9 103 | 2 104 | 6 105 | 3 106 | 1 107 | 108 | Player 2: 109 | 5 110 | 8 111 | 4 112 | 7 113 | 10""" 114 | 115 | DECK1, DECK2 = make_decks(RAW) 116 | GAME = Game(DECK1, DECK2) 117 | GAME.play() 118 | assert GAME.winning_score() == 306 119 | 120 | RECURSIVE_GAME = RecursiveGame(DECK1, DECK2) 121 | RECURSIVE_GAME.play() 122 | assert RECURSIVE_GAME.winning_score() == 291 123 | 124 | # 125 | # problem 126 | # 127 | 128 | with open('inputs/day22.txt') as f: 129 | raw = f.read() 130 | deck1, deck2 = make_decks(raw) 131 | game = Game(deck1, deck2) 132 | game.play() 133 | print(game.winning_score()) 134 | 135 | recursive_game = RecursiveGame(deck1, deck2) 136 | recursive_game.play() 137 | print(recursive_game.winning_score()) -------------------------------------------------------------------------------- /advent2020/day23.py: -------------------------------------------------------------------------------- 1 | from __future__ import annotations 2 | from collections import deque 3 | import itertools 4 | 5 | class CupGame: 6 | def __init__(self, cups: str) -> None: 7 | self.cups = deque([int(c) for c in cups]) 8 | self.lo = min(self.cups) 9 | self.hi = max(self.cups) 10 | 11 | def move(self) -> None: 12 | # Get the current cup and move it to the end 13 | current = self.cups.popleft() 14 | self.cups.append(current) 15 | 16 | # take the next 3 17 | c1 = self.cups.popleft() 18 | c2 = self.cups.popleft() 19 | c3 = self.cups.popleft() 20 | 21 | missing = [c1, c2, c3] 22 | 23 | destination = current - 1 24 | while not destination in self.cups: 25 | destination -= 1 26 | if destination < self.lo: 27 | destination = self.hi 28 | 29 | # now rotate to get to destination 30 | while True: 31 | cup = self.cups.popleft() 32 | self.cups.append(cup) 33 | if cup == destination: 34 | break 35 | 36 | self.cups.extend(missing) 37 | 38 | # now rotate to the cup after current 39 | while True: 40 | cup = self.cups.popleft() 41 | self.cups.append(cup) 42 | if cup == current: 43 | break 44 | 45 | def labels(self) -> str: 46 | while True: 47 | cup = self.cups.popleft() 48 | self.cups.append(cup) 49 | if cup == 1: 50 | return ''.join(str(i) for i in list(self.cups)[:-1]) 51 | 52 | 53 | from dataclasses import dataclass 54 | 55 | @dataclass 56 | class Node: 57 | """ 58 | We need a linked list to represent the cycle 59 | """ 60 | value: int 61 | prev: Node 62 | next: Node 63 | 64 | class CupGame2: 65 | def __init__(self, raw_cups: str) -> None: 66 | cups = [int(c) for c in raw_cups] 67 | self.current = prev = cups[0] 68 | self.nodes = {prev: Node(prev, None, None)} 69 | for cup in itertools.chain(cups[1:], range(max(cups) + 1, 1_000_001)): 70 | # add backlink to previous node 71 | self.nodes[cup] = Node(cup, self.nodes[prev], None) 72 | # add forward link from previous node 73 | self.nodes[prev].next = self.nodes[cup] 74 | prev = cup 75 | # add links between end and beginning 76 | self.nodes[self.current].prev = self.nodes[cup] 77 | self.nodes[cup].next = self.nodes[self.current] 78 | 79 | assert len(self.nodes) == 1_000_000 80 | 81 | def ten_from(self, n: int): 82 | """just for debugging""" 83 | node = self.nodes[n] 84 | for _ in range(10): 85 | print(node.value, end=',') 86 | node = node.next 87 | 88 | def move(self) -> None: 89 | current = self.nodes[self.current] 90 | 91 | # find next 3 nodes 92 | n1 = current.next 93 | n2 = n1.next 94 | n3 = n2.next 95 | rest = n3.next 96 | 97 | # get their values 98 | v1 = n1.value 99 | v2 = n2.value 100 | v3 = n3.value 101 | 102 | # remove them 103 | current.next = rest 104 | rest.prev = current 105 | 106 | # null out their pointers so they can be garbage collected 107 | n1.next = n1.prev = n2.next = n2.prev = n3.next = n3.prev = None 108 | 109 | def decrement(dest: int) -> int: 110 | if dest <= 1: 111 | return 1_000_000 112 | else: 113 | return dest - 1 114 | 115 | destination = decrement(current.value) 116 | while destination in [v1, v2, v3]: 117 | destination = decrement(destination) 118 | 119 | # insert the missing nodes 120 | dest_node = self.nodes[destination] 121 | rest = dest_node.next 122 | n1_new = Node(v1, dest_node, None) 123 | n2_new = Node(v2, n1_new, None) 124 | n3_new = Node(v3, n2_new, rest) 125 | 126 | self.nodes[v1] = n1_new 127 | self.nodes[v2] = n2_new 128 | self.nodes[v3] = n3_new 129 | 130 | dest_node.next = n1_new 131 | n1_new.next = n2_new 132 | n2_new.next = n3_new 133 | rest.prev = n3_new 134 | 135 | self.current = self.nodes[self.current].next.value 136 | 137 | 138 | # 139 | # unit tests 140 | # 141 | 142 | RAW = "389125467" 143 | GAME = CupGame(RAW) 144 | for i in range(100): 145 | GAME.move() 146 | print(i, GAME.cups) 147 | assert GAME.labels() == "67384529" 148 | 149 | GAME2 = CupGame2(RAW) 150 | # for i in range(1_000_000): 151 | # seen = set() 152 | # curr = GAME2.nodes[GAME2.current] 153 | # for _ in range(1_000_000): 154 | # seen.add(curr.value) 155 | # curr = curr.next 156 | # print(i, len(seen)) 157 | # if len(seen) < 1_000_000: 158 | # break 159 | # GAME2.move() 160 | 161 | # for i in range(10_000_000): 162 | # # if i % 1000 == 0: 163 | # # print(i) 164 | # GAME2.move() 165 | # node = GAME2.nodes[1] 166 | # print(node.next.value, node.next.next.value) 167 | 168 | 169 | # 170 | # problem 171 | # 172 | 173 | # with open('inputs/day23.txt') as f: 174 | # raw = f.read() 175 | 176 | raw = "157623984" 177 | # game = CupGame(raw) 178 | # for _ in range(100): 179 | # game.move() 180 | # print(game.labels()) 181 | game2 = CupGame2(raw) 182 | for i in range(10_000_000): 183 | if i % 1000 == 0: 184 | print(i) 185 | game2.move() 186 | node = game2.nodes[1] 187 | print(node.next.value * node.next.next.value) -------------------------------------------------------------------------------- /advent2020/day23_v2.py: -------------------------------------------------------------------------------- 1 | """ 2 | I was so unhappy with how ugly my solution was 3 | that I cleaned it up. 4 | """ 5 | from __future__ import annotations 6 | import itertools 7 | from typing import Optional, Iterable, List 8 | 9 | 10 | class CupGame: 11 | def __init__(self, 12 | cups: Iterable[int], 13 | continue_to: Optional[int] = None) -> None: 14 | 15 | if continue_to: 16 | cups = itertools.chain(cups, range(max(cups) + 1, continue_to + 1)) 17 | 18 | it = iter(cups) 19 | self.current = prev = next(it) 20 | self.nexts = {} 21 | 22 | for cup in it: 23 | self.nexts[prev] = prev = cup 24 | 25 | self.nexts[prev] = self.current 26 | self.max = max(self.nexts) 27 | 28 | def move(self) -> None: 29 | # find next 3 nodes 30 | n1 = self.nexts[self.current] 31 | n2 = self.nexts[n1] 32 | n3 = self.nexts[n2] 33 | rest = self.nexts[n3] 34 | 35 | # remove them 36 | self.nexts[self.current] = rest 37 | 38 | destination = self.current 39 | while destination in [self.current, n1, n2, n3]: 40 | destination = self.max if destination == 1 else destination - 1 41 | 42 | # insert the missing nodes after destination 43 | self.nexts[destination], self.nexts[n3] = n1, self.nexts[destination] 44 | 45 | # update current 46 | self.current = self.nexts[self.current] 47 | 48 | def labels(self) -> str: 49 | out = [] 50 | n = 1 51 | while self.nexts[n] != 1: 52 | n = self.nexts[n] 53 | out.append(str(n)) 54 | 55 | return ''.join(out) 56 | 57 | def parse(raw: str) -> List[int]: 58 | return [int(c) for c in list(raw)] 59 | 60 | # 61 | # unit tests 62 | # 63 | 64 | RAW = "389125467" 65 | CUPS = parse(RAW) 66 | 67 | GAME = CupGame(CUPS) 68 | for i in range(100): 69 | GAME.move() 70 | assert GAME.labels() == "67384529" 71 | 72 | GAME2 = CupGame(CUPS, continue_to=1_000_000) 73 | for i in range(10_000_000): 74 | GAME2.move() 75 | n1 = GAME2.nexts[1] 76 | n2 = GAME2.nexts[n1] 77 | assert (n1, n2) == (934001, 159792) 78 | 79 | 80 | # 81 | # problem 82 | # 83 | 84 | raw = "157623984" 85 | cups = parse(raw) 86 | 87 | game = CupGame(cups) 88 | for _ in range(100): 89 | game.move() 90 | print(game.labels()) 91 | 92 | game2 = CupGame(cups, continue_to=1_000_000) 93 | for i in range(10_000_000): 94 | game2.move() 95 | n1 = game2.nexts[1] 96 | n2 = game2.nexts[n1] 97 | 98 | print(n1 * n2) 99 | -------------------------------------------------------------------------------- /advent2020/day24.py: -------------------------------------------------------------------------------- 1 | from __future__ import annotations 2 | from typing import List, Tuple, Set, Dict, Iterator 3 | from collections import Counter 4 | 5 | Hex = Tuple[float, float] 6 | 7 | def parse(raw: str) -> List[str]: 8 | """ 9 | directions are e, ne, se, w, nw, sw 10 | 11 | nw ne 12 | w - o - e 13 | se sw 14 | """ 15 | out = [] 16 | while raw: 17 | if raw[:2] in ("nw", "ne", "sw", "se"): 18 | out.append(raw[:2]) 19 | raw = raw[2:] 20 | else: 21 | out.append(raw[0]) 22 | raw = raw[1:] 23 | return out 24 | 25 | def find_tile(steps: List[str]) -> Hex: 26 | """returns final (x, y)""" 27 | x = y = 0 28 | for step in steps: 29 | if step == "e": 30 | x += 1 31 | elif step == "ne": 32 | x += 0.5 33 | y += 1 34 | elif step == "nw": 35 | x -= 0.5 36 | y += 1 37 | elif step == "w": 38 | x -= 1 39 | elif step == "sw": 40 | x -= 0.5 41 | y -= 1 42 | elif step == "se": 43 | x += 0.5 44 | y -= 1 45 | 46 | return x, y 47 | 48 | def find_black_tiles(raw: str) -> Set[Hex]: 49 | counts: Dict[Hex, int] = Counter() 50 | 51 | for line in raw.split("\n"): 52 | steps = parse(line) 53 | x, y = find_tile(steps) 54 | counts[(x, y)] += 1 55 | 56 | return {k for k, v in counts.items() if v % 2 == 1} 57 | 58 | 59 | def count_black_tiles(raw: str) -> int: 60 | return len(find_black_tiles(raw)) 61 | 62 | def neighbors(hex: Hex) -> Iterator[Hex]: 63 | x, y = hex 64 | yield x + 1, y # e 65 | yield x - 1, y # w 66 | yield x + 0.5, y + 1 # ne 67 | yield x - 0.5, y + 1 # nw 68 | yield x + 0.5, y - 1 # se 69 | yield x - 0.5, y - 1 # sw 70 | 71 | def step(black_tiles: Set[Hex]) -> Set[Hex]: 72 | neighbor_counts = Counter() 73 | for hex in black_tiles: 74 | for neighbor in neighbors(hex): 75 | neighbor_counts[neighbor] += 1 76 | 77 | return { 78 | hex 79 | for hex, count in neighbor_counts.items() 80 | if (hex in black_tiles and 1 <= count <= 2) or (hex not in black_tiles and count == 2) 81 | } 82 | 83 | # 84 | # unit testing 85 | # 86 | 87 | RAW = """sesenwnenenewseeswwswswwnenewsewsw 88 | neeenesenwnwwswnenewnwwsewnenwseswesw 89 | seswneswswsenwwnwse 90 | nwnwneseeswswnenewneswwnewseswneseene 91 | swweswneswnenwsewnwneneseenw 92 | eesenwseswswnenwswnwnwsewwnwsene 93 | sewnenenenesenwsewnenwwwse 94 | wenwwweseeeweswwwnwwe 95 | wsweesenenewnwwnwsenewsenwwsesesenwne 96 | neeswseenwwswnwswswnw 97 | nenwswwsewswnenenewsenwsenwnesesenew 98 | enewnwewneswsewnwswenweswnenwsenwsw 99 | sweneswneswneneenwnewenewwneswswnese 100 | swwesenesewenwneswnwwneseswwne 101 | enesenwswwswneneswsenwnewswseenwsese 102 | wnwnesenesenenwwnenwsewesewsesesew 103 | nenewswnwewswnenesenwnesewesw 104 | eneswnwswnwsenenwnwnwwseeswneewsenese 105 | neswnwewnwnwseenwseesewsenwsweewe 106 | wseweeenwnesenwwwswnew""" 107 | 108 | assert count_black_tiles(RAW) == 10 109 | 110 | # 111 | # problem 112 | # 113 | 114 | with open('inputs/day24.txt') as f: 115 | raw = f.read() 116 | 117 | print(count_black_tiles(raw)) 118 | 119 | tiles = find_black_tiles(raw) 120 | for _ in range(100): 121 | tiles = step(tiles) 122 | print(len(tiles)) -------------------------------------------------------------------------------- /advent2020/day25.py: -------------------------------------------------------------------------------- 1 | from __future__ import annotations 2 | 3 | from typing import Iterator 4 | """ 5 | The handshake used by the card and the door involves an operation 6 | that transforms a subject number. To transform a subject number, 7 | start with the value 1. Then, a number of times called the loop size, 8 | perform the following steps: 9 | 10 | Set the value to itself multiplied by the subject number. 11 | Set the value to the remainder after dividing the value by 20201227. 12 | """ 13 | 14 | def handshakes(subject_number: int = 7) -> Iterator[int]: 15 | value = 1 16 | while True: 17 | yield value 18 | value = (value * subject_number) % 20201227 19 | 20 | def handshake(loop_number: int, subject_number: int = 7) -> int: 21 | for i, n in enumerate(handshakes(subject_number)): 22 | if i == loop_number: 23 | return n 24 | raise RuntimeError() 25 | 26 | def find_loop_number(public_key: int, subject_number: int = 7) -> int: 27 | for i, n in enumerate(handshakes(subject_number)): 28 | if n == public_key: 29 | return i 30 | raise RuntimeError() 31 | 32 | 33 | # 34 | # unit tests 35 | # 36 | 37 | assert find_loop_number(5764801) == 8 38 | assert find_loop_number(17807724) == 11 39 | 40 | # 41 | # problem 42 | # 43 | 44 | door_key = 12578151 45 | card_key = 5051300 46 | 47 | door_number = find_loop_number(door_key) 48 | print(handshake(door_number, card_key)) 49 | 50 | card_number = find_loop_number(card_key) 51 | print(handshake(card_number, door_key)) 52 | -------------------------------------------------------------------------------- /advent2020/utils.py: -------------------------------------------------------------------------------- 1 | if __name__ == "__main__": 2 | print("utils") -------------------------------------------------------------------------------- /inputs/day01.txt: -------------------------------------------------------------------------------- 1 | 1895 2 | 1504 3 | 1660 4 | 1775 5 | 1743 6 | 1607 7 | 1267 8 | 1133 9 | 292 10 | 1646 11 | 1285 12 | 1808 13 | 1512 14 | 1839 15 | 1869 16 | 1578 17 | 1318 18 | 1385 19 | 1829 20 | 1800 21 | 1491 22 | 1600 23 | 1290 24 | 1856 25 | 1781 26 | 1881 27 | 1953 28 | 2008 29 | 1681 30 | 1472 31 | 1846 32 | 2010 33 | 1619 34 | 1584 35 | 1849 36 | 1876 37 | 1744 38 | 1980 39 | 1421 40 | 911 41 | 1308 42 | 1762 43 | 1398 44 | 1470 45 | 1974 46 | 1902 47 | 1985 48 | 2001 49 | 1926 50 | 1374 51 | 1678 52 | 1523 53 | 1894 54 | 1597 55 | 1778 56 | 1940 57 | 1362 58 | 1613 59 | 1629 60 | 1473 61 | 1633 62 | 1867 63 | 1838 64 | 1931 65 | 1850 66 | 1776 67 | 1689 68 | 1311 69 | 1947 70 | 1988 71 | 1779 72 | 1381 73 | 1683 74 | 1677 75 | 1675 76 | 1587 77 | 767 78 | 1401 79 | 1412 80 | 1544 81 | 1484 82 | 618 83 | 1755 84 | 1073 85 | 1970 86 | 1735 87 | 1770 88 | 1623 89 | 1665 90 | 1783 91 | 1400 92 | 1892 93 | 1921 94 | 1506 95 | 1978 96 | 1731 97 | 1739 98 | 1515 99 | 1354 100 | 1264 101 | 1394 102 | 1763 103 | 1569 104 | 1453 105 | 1539 106 | 2006 107 | 1586 108 | 1855 109 | 1609 110 | 1729 111 | 1624 112 | 506 113 | 1668 114 | 1803 115 | 1486 116 | 1767 117 | 1720 118 | 1753 119 | 1994 120 | 1718 121 | 1922 122 | 1314 123 | 1250 124 | 1516 125 | 1546 126 | 1625 127 | 1708 128 | 1286 129 | 1993 130 | 1785 131 | 491 132 | 1705 133 | 1924 134 | 1752 135 | 1888 136 | 1651 137 | 1604 138 | 1750 139 | 1547 140 | 1481 141 | 1704 142 | 1851 143 | 904 144 | 1920 145 | 1939 146 | 1277 147 | 1870 148 | 1934 149 | 1617 150 | 1833 151 | 1797 152 | 1817 153 | 1967 154 | 1935 155 | 1914 156 | 1621 157 | 1468 158 | 1859 159 | 1552 160 | 1640 161 | 1709 162 | 1121 163 | 1973 164 | 1343 165 | 1266 166 | 1806 167 | 1360 168 | 1299 169 | 1990 170 | 1356 171 | 1631 172 | 1555 173 | 1811 174 | 1323 175 | 1794 176 | 1550 177 | 1448 178 | 1848 179 | 1826 180 | 1723 181 | 1891 182 | 1302 183 | 1655 184 | 947 185 | 1580 186 | 1908 187 | 1641 188 | 1816 189 | 1701 190 | 1871 191 | 1588 192 | 1843 193 | 1643 194 | 1893 195 | 1866 196 | 1628 197 | 1417 198 | 1795 199 | 1995 200 | 1937 -------------------------------------------------------------------------------- /inputs/day03.txt: -------------------------------------------------------------------------------- 1 | .#..#....##...#....#.....#.#... 2 | ........##....#..#..##....#.#.. 3 | ......##......##.........#....# 4 | ...#.....#....##.......#.#....# 5 | .#.###.#.#..#.....##..#....#.#. 6 | ##.........##.....####......#.. 7 | #...#..........#.##............ 8 | ####............#..........#.#. 9 | ......#......#....##...#..##... 10 | #..#....#...#......#......####. 11 | ......#..........#.........#.#. 12 | ...##.......#..#.#..#..#....#.. 13 | ..####....#.#...............##. 14 | ...###........#.....#.......... 15 | #..#.##...##.#..##...##...#.... 16 | .###........#.##..#.#.....#.... 17 | .#.......#..##.......#......#.. 18 | .##...........#..............#. 19 | ...#..#.....#...........#...#.. 20 | .....#..............#..#....... 21 | .......#....#.....##........... 22 | .#...#.............#.....##.... 23 | ....#.#....#...#...#..#..##.#.. 24 | ...#..##..##...#..##........#.# 25 | .###..#...#.#.#.#..#...#....... 26 | .....##.#.##.#.#.......#..#.... 27 | .##.#...#.....#...#....#.....#. 28 | .....#......###....###..##.#..# 29 | .....#..##....#..#.#..#.#.#.... 30 | #....#.....#.#.......#...#....# 31 | ...#........#............#..#.. 32 | #.#...#...#..##.........#...##. 33 | .#..#.#...........#....#...#... 34 | ##..#.#..........#.....###...#. 35 | #..#........#.......#.#..#....# 36 | ..#...##....#..#....#....#..... 37 | ...#.....##....#...#..#....##.# 38 | .....#......#...#.#.#.#.#...... 39 | ###.....#..#.#..........##.#... 40 | ...............#..#...#.#....#. 41 | #.....#.....###....#..........# 42 | ........#...#.#.......#..#...#. 43 | ..#.##...#...#...#.........#... 44 | #..........#..#.#...........##. 45 | ##.......#.#.#...#.....#....... 46 | ...#.#.#.....#......#....##..#. 47 | ##.#.....#....#...#.......#.... 48 | .#......##..#.##.#....##..##.#. 49 | ..#..#......#....#...#..#.#.... 50 | ...#..###...#.......#..#....... 51 | ...#....#..#....#........##.... 52 | #...#...#....#.#.........###.#. 53 | .#.........##..##...#.......... 54 | ...##.....##.........#..#..#... 55 | ###....#......#.##..#...#...... 56 | .###....#.#.......#..#....#...# 57 | ....####........##....#.#....## 58 | ..#.....#......##...#..#..#.... 59 | ...#....#...#......#.###.#.#.#. 60 | ......#.......#..#...#...#..... 61 | .#...#...#..#.#..........#..... 62 | ........#..#.........#.#....##. 63 | .#....#.......#........#.##.#.. 64 | ...#...#..#.....#......#...##.. 65 | .#.................#........### 66 | .......#.#..#.#...#............ 67 | .#.......#..##...#.###....#.##. 68 | #........#.###.#..#........##.. 69 | ..##.#....##......##........#.. 70 | ...............#............... 71 | #.......#......##..#.#....#.#.# 72 | ..#.....#......#.#.#...#...##.. 73 | ..........#........#.....##...# 74 | #..........#.#..#..##..#......# 75 | .......#..###..##.#..##........ 76 | #.#..##..###..#.###.....#.#..## 77 | ..#.#........#...###...##...... 78 | .......##.....##...#.##........ 79 | .#.#...###..#..#......##....##. 80 | #...#.#.....##..#..#..#.#....#. 81 | ........#......#....#..#....... 82 | ...#.#.#.#........###....#...#. 83 | .#......#...#.......#......#... 84 | #...#.##.#..#.#..#.........#... 85 | ....#......##......#........#.# 86 | ..##.#.....#..#......#..#...... 87 | #.##...##...#................#. 88 | .....#..#....#....#####........ 89 | ....#..#..#.#...#.#............ 90 | .........#.#....#..#....##...#. 91 | #....#..........#......#......# 92 | .......#..............#......#. 93 | .#..#...#..#.#.....#.#.#.##.#.. 94 | .##........#......#...#.##..... 95 | ...#.##..#........#...........# 96 | ..#...#..#........#.......#.#.. 97 | #.....#..#.#..#..#...#...#..#.. 98 | ..................#.#.....#...# 99 | ........#...##.#..#.........#.. 100 | .#...##.#...........##.##...#.. 101 | #......#.........#...#...#...#. 102 | ..........#.............#...#.. 103 | #............##.#..#...#.#...#. 104 | ..#.##...##....##.#...####...#. 105 | #.##..#......#.......#.#...##.. 106 | .....#...#..#......#####.##..#. 107 | #...#.#.##..#..##.....#......#. 108 | .#..#......#.#.#...#.#...##.#.. 109 | .#.....#..##........#.....#...# 110 | .................#..........#.. 111 | ##.#.#......#.####..#.....#.... 112 | .#...##.####..#...#............ 113 | ..#...............###....#....# 114 | #...#..###..#.#.##...........## 115 | ...................#..#.....#.. 116 | ...#.##.#...#.....#......#.##.. 117 | #.#...#.........##.#........#.# 118 | .##.......#..#..#.....##....#.. 119 | ......##.#.#..#...#.#..##.....# 120 | ..#..###...#...#......#.#...... 121 | ..##....#.#...#....#....#..#..# 122 | #..##....#........#..##..#..#.# 123 | .......#............#....##..#. 124 | .#.#..#.........#.#.##......#.. 125 | #.#....#..##..#..###.#.....##.. 126 | .###.#......#.....#####...#.... 127 | #...#.#...##......#...#.#...##. 128 | #..#.........#..#............#. 129 | ...##......##.......##....##... 130 | ...#...##....###..###.#...#.... 131 | #.#....#...#.#...##..#........# 132 | .#..#..................#....#.. 133 | #......#..#...##..##...#..##..# 134 | ...#..#.....#...#........#.#.#. 135 | #...#..##....#.....#........#.. 136 | .##..#....#.....#.#............ 137 | ##..##.#.#.##.#.#..#.#..#....#. 138 | #.......#...............#.....# 139 | ..#.....#..##.....#...##.##.... 140 | ...#..#...#.#.#....#......#.... 141 | ###.#.......#....#....#.#...#.. 142 | .....###..#...###.#.#..#....... 143 | .....#.........##.#....#..##.#. 144 | ........#....#....#....#.#..##. 145 | ........###....#.#.........#.#. 146 | .#..###..#........#.......##.#. 147 | .#.#........................... 148 | ..#....##...#.#....#....#.#.... 149 | .#...#...##.#........###....#.. 150 | #.#....#...#.#.#...##......##.. 151 | #......#....#...#..#....#...#.. 152 | ...#..##........#.#...##......# 153 | ....##...........##...#..#..#.. 154 | ......#..#........#..#....##.## 155 | .###..#.#.........#.....#...... 156 | .#..##............#......#..... 157 | ..##.#.#..#..#.###....#..#..#.. 158 | ....#.#..#.#..##...##.#.#.#.#.. 159 | ....#..#....#...............#.. 160 | ..#...#.##.....##....#..##..#.. 161 | .......##.#....#.##....#....... 162 | .#...#........#...#......#.###. 163 | ..#....##.......#....#.#...#.#. 164 | .....#.....#...##..#....#.#..## 165 | ..##........##............##... 166 | ..........#...#.......#.......# 167 | .#...............#...#.##...... 168 | #.##......#....#.##.#..#..#...# 169 | ......###.........#...#..#....# 170 | ....#......#...#....#....#...#. 171 | #...##...#....#......####....#. 172 | .................#......#...... 173 | ..#..........##.......##..#.##. 174 | .#.....#.......#...######..#..# 175 | ....##.#...#...#..........#.... 176 | .....#.......#...#.#.......###. 177 | #...#.###.....#...#.......#.... 178 | .#.##.####....#.....#.#........ 179 | .......#.....##............##.. 180 | ..#...#.#.##........#...##...#. 181 | ........#...####.##..#....#...# 182 | #.......#...##.#......#..#...#. 183 | ......#.........#..###.#.#....# 184 | #..##...#...#..#...#...#.....#. 185 | .#...#...#.#.................## 186 | #......#.....#..#.#..#......##. 187 | .......#.##...#.......#.......# 188 | .#.#..#..#......#....#.#...#.#. 189 | ..#...#.#..#......#...#.#.#.... 190 | ........#..............#..##... 191 | .##..#..##.#....#.#..###..#..#. 192 | ..#....#......#...#.#.#....#... 193 | ...#..#..#....#..#.....##...... 194 | .#......#...#........##........ 195 | .#......#..#...##..#..#.#.#.... 196 | .##......#.##.........#....#... 197 | ....#....##..#..###.#..#......# 198 | ....#....##..........#.#...#... 199 | ..##.#.............#..#.....#.. 200 | ..#.....#....#....#.......##... 201 | .##.#....#....#...#....##.#.... 202 | ...#.#..#.###.#..#.#.......#.#. 203 | .....##.....#.......#......#... 204 | .#.....#..#.#.#..#........##... 205 | ##.....................#....... 206 | ..###............#........##..# 207 | .#.##.....#..#..#..#.#.......#. 208 | .##...................#..#..#.. 209 | ..#.#...#..........##..#..##... 210 | #......#..#..#.#..#......#..#.# 211 | .#...#....#.#.........#.....#.# 212 | #..........#.#....#....#.#.#.#. 213 | #.....#..........#..#....#..#.. 214 | ........#....#..##.#.#.......#. 215 | .#.......##.......#..##...#.... 216 | ...#..##..#......##.#..#.#..#.. 217 | .#..#.......#..##..#......#.... 218 | ###.#.........#......#.#....... 219 | ...#......#....#..##..#.#..#... 220 | ......#..#.....#.........#....# 221 | ....#..#..#..#.........##.#..#. 222 | ......#..#..#..#....#...#..##.# 223 | ......##.#..#..#.#.......#.#.## 224 | ..#.....#...#..#....#.......... 225 | .##..##.....##.......#.##.#.... 226 | ...#..#.......#..#.......#..... 227 | .........#....##..#.#....#.#... 228 | .....#..#...#.........#....#..# 229 | .........##.....#.#...#.###...# 230 | .#......####..##...#..#........ 231 | .#......##....#.....#.......... 232 | ##.......##.#.......#.......... 233 | .#......#.#.#.#....#........#.. 234 | ......##..##...#...#........... 235 | .#...#.#..#......#.#.#.#....#.# 236 | ...#.........#.....#...###..... 237 | #.....##....#.##...#....#...... 238 | .#..#...#..##.###.#.#.#...#.... 239 | ...#......#..#....#...#...#.... 240 | .#..............#.....#........ 241 | ..##...#.....#..#.....#..#.#... 242 | .##...#....#.##...#.........##. 243 | ..#......#...##..#.....#......# 244 | #.#..............#...#...#..#.# 245 | ..#..#.#...........#...#.#.#... 246 | #..........#...#..#..##..#....# 247 | ............#...#........###... 248 | .........#.....#.....#..#...... 249 | #...#.#..##......#.#####....... 250 | ...#........#..............#... 251 | ......###.#.#.....#..#....##.#. 252 | .#.#.#..##....###.#..#....##... 253 | .#....#.##............##.#..... 254 | ##...##.#......#.#.##.##...###. 255 | .......#.#........#.....#...... 256 | ....#.....#......#...#.#..#.... 257 | .#.........#....#...#...#...#.# 258 | #.......#................#..#.. 259 | .##...........#.##...##....#... 260 | #...#.#...###.........#.......# 261 | .#...#......................... 262 | #.......#...#.....##.##...##... 263 | .#.#....#.......#.#.##.#....#.. 264 | #..#....#...#.#.##.#....#....#. 265 | .##.....#.#..#...#..#.......... 266 | .............#...#.#..#........ 267 | ....#........#..#......##...... 268 | #.....#....#.....#.......#..... 269 | ........#.......##....#........ 270 | .#.#..##....................... 271 | ##..#.....#........#.....#..... 272 | .#......#.#...#.#..........#..# 273 | .#..#.....#..#..........#.###.. 274 | ......#.#..#.#.......#.#.....#. 275 | .#....#......#..##............. 276 | #...##.........#.#.#...#.....#. 277 | ..#................#..#..###... 278 | #.....#....##.#..##......#.#.#. 279 | ..#....#...#...#............... 280 | #................#....#...#.#.. 281 | ................#...#.....#.##. 282 | ..#.#.#..#.##.......##.......## 283 | ...........#......##.......###. 284 | ...#.......##.........#.#.#.#.. 285 | .#...#.#..#...#.#.....#........ 286 | ............#####......##...... 287 | ....###....#.##...#..#......... 288 | ..#.#...#.......#...#...#.###.. 289 | ..............##..#...#....#... 290 | #.#..##...#....##.........#.... 291 | ..#...#.....#...........#...#.. 292 | #.#..###..#.#..#........#..#.#. 293 | ...###...##...#...#.#.........# 294 | ..#........#.....#.#.#.......#. 295 | ...#..#..........#.....#...#... 296 | ....#..#.....#....##....#.##... 297 | .....##..#...#.#..##...#...##.# 298 | ...........###...##....#....... 299 | ##..#.#..#..#...#....##..#..#.. 300 | ##...#.#......##.#..#...#....#. 301 | .#.......#...........#...#..... 302 | #...#....#.......#...#.##...... 303 | .........#.......#...#.#...#... 304 | .......##.#..................#. 305 | ........#..#.#......#.....#.... 306 | .....#.#.#.#....##...#.###..... 307 | #.#.........#..#.#.#.#.#....... 308 | .............#....#.......###.. 309 | .#.##....#....##.........####.. 310 | ...........###.#............... 311 | #.........##.#.#..#.....##.###. 312 | .#.#.....#.#...#.....##...#...# 313 | #....#...#.........#.#.......#. 314 | .....#.###..#....#...##..#...#. 315 | #........#....#.#..#....#.#.... 316 | #.#..##......#.........#.#..... 317 | ##..#.....#......###....#....#. 318 | #.#.####..#.#.#......##...#..#. 319 | ....#.....#.#.#.#.....#........ 320 | ..##..........#......#.#.#..#.. 321 | .#...##.##.........#.........## 322 | ..#.#.#..........#..#..#......# 323 | ###..###..#...#................ -------------------------------------------------------------------------------- /inputs/day05.txt: -------------------------------------------------------------------------------- 1 | BBFFBBFLRL 2 | BFFFBBBRLL 3 | FFBBFFFLLR 4 | FBFBFFBRRL 5 | FBBBBBFLLR 6 | BFBBFFBLRL 7 | BFBBFBFRRL 8 | BFBFFBBLLL 9 | BFBFFFBRLL 10 | FFFBFBFLLL 11 | BFBFBBBLRR 12 | BFBBFBFRLR 13 | FFFBBBBLLL 14 | BFFBFFFLLR 15 | BBFBFBBLLL 16 | BFFFBBBRRR 17 | FBBFFBFRLR 18 | BFFFFBBRRR 19 | FFBFFFBLLL 20 | BBFFFFBRRL 21 | BFFFFFBLRL 22 | BBFBBBBLRR 23 | FBBFBFBRLR 24 | BFBFFFBRRL 25 | BBFFFBBLRR 26 | BBFBBFFRRR 27 | FFBBFBBLLR 28 | BFBFFFBLLL 29 | BFFBBBBLRR 30 | FBBBBFBLRL 31 | BBFBFBFRRR 32 | BFFFBFBLRR 33 | BBFFFBBRRL 34 | FFBFBBBRLR 35 | BFFFBBBRLR 36 | FBBBBFBRLL 37 | BFBBBBFLLR 38 | BFFBFBBRRR 39 | BFBFFBBLRL 40 | FFFBBFBRLR 41 | FFBBBBFLLL 42 | BFBFBBFLLR 43 | BBFBBBFRLR 44 | BFFBBBBRLL 45 | FFBFFFBLRL 46 | FBFFBBFRLL 47 | BFBBFFFLLR 48 | FBFBBFFLRL 49 | FFFBBBFLRR 50 | BBFBBFFLRR 51 | BFBBFBFLLR 52 | BFFBFBFRRR 53 | BFBBFFFRLR 54 | BFFBFBBLRR 55 | FBFBBBBLLL 56 | FBFBFFFLRL 57 | FFBFBBBRLL 58 | FFBFBBBLRR 59 | BFFBFBFLLL 60 | FBBFFBBRRR 61 | FBFBFBFLRR 62 | FBBFBBBRRL 63 | BFFBBBBRLR 64 | FFFBFFBRRR 65 | BFFFFBFRRR 66 | FBBFBFFRLL 67 | FFBBFBFRLL 68 | BBFFBBBRLR 69 | FFBBFFBRLL 70 | FBBBBFFRLR 71 | FBBFFBFLLR 72 | BFFBFBFRLR 73 | BBFBBBBRLL 74 | BFBFFBBLLR 75 | FFBFFFFRLL 76 | BFBFFFFLRR 77 | BBFFBFBLLL 78 | BBFFBBBRLL 79 | BBFBBBFLRL 80 | FBFFBBFLRL 81 | FBFBFBBRRR 82 | FFBBFBFLLR 83 | FBFFFBBRRL 84 | BBFFBFBRRL 85 | FBFBBFFRLR 86 | FFBFFBBLLR 87 | BFBFBFBLRR 88 | BBFFBFBLRR 89 | FBBFBFBLRR 90 | FBFFBFFRRL 91 | FBFFBBBRLR 92 | FBFFBBFRRR 93 | BFBBBFFLLR 94 | BBFFBFFLRR 95 | BFBFFFFRRR 96 | BFFBFFBRRL 97 | BBFFBBFLLR 98 | BFBFFBFLRL 99 | FFFBFBBRRR 100 | BFBBBFFLRR 101 | FBBBBBBRLR 102 | FBBFFFFLLL 103 | FFFFBBFRRL 104 | BFBFBFBLLL 105 | FFBBBFBLRL 106 | FBFFFFFLRR 107 | BFFBFFFRRL 108 | BFFBBFBLLL 109 | FBFBFBBRRL 110 | FBBFFFBRLR 111 | FFBBBBFRRL 112 | BFFBBBFRRR 113 | BFFBBFBRRR 114 | BFFFBFFRRL 115 | FBBFFFBRRR 116 | FFBBFBBLRL 117 | FFFBBBBLLR 118 | BFBBFBBRRL 119 | BFBFFBBRLR 120 | BBFFBFFLLL 121 | BFBBFFFLRR 122 | BBFFBFFLLR 123 | BFFFFBFLRL 124 | FFBFFBFLRL 125 | FFFBFBBRLR 126 | FBFBBFBRLR 127 | BFFBBBFLLL 128 | FFBBFBBRRL 129 | FFFBBBFLLL 130 | BFFBBBFRLR 131 | BFBFBBBLLR 132 | BFBFBFFRLR 133 | FBBFFFFRRL 134 | BFFFFFFLLL 135 | BBFFBFBRRR 136 | BFFFBFFLLR 137 | BBFFBFFLRL 138 | FFBFFFFLLR 139 | FFBFFBBRLL 140 | FFFFBBFRLR 141 | BFBBBBBLLL 142 | BFFFFFBLLR 143 | FBBBBBBRRR 144 | FFFBFFBRRL 145 | BFBBFFBLRR 146 | BFBBFBBRLL 147 | FBBFFFBLLR 148 | BFFBFFFLLL 149 | BBFFBBFRLL 150 | BBFBBBBRRL 151 | FFFBBFFLLL 152 | BFFFBBFRRR 153 | BFBFBFFLLR 154 | BFBFBBBRLR 155 | FBBBBFFLLL 156 | FBFBFBFRLL 157 | FFFBBBFRRR 158 | FFBFBFFLRL 159 | FBFFFFBRLL 160 | BBFFFFFRLL 161 | BFBBFFFRRR 162 | FFFBBBBRRL 163 | BBFFFFFLLL 164 | BBFBBFBLRR 165 | FFFFBBBLRL 166 | BBFBFFFLRL 167 | FBFFBFBLLL 168 | BFFFFBFLLL 169 | BBFFFFFLRL 170 | BFBBFFBLLL 171 | BBFFFBFLLL 172 | BFBBFBBRRR 173 | BFBFBBBLLL 174 | FBFBBBBLRL 175 | FFBFBFFRRR 176 | FBFBBBFLRR 177 | FBFFBBBLLL 178 | BFFFFBBLRL 179 | FBFBFBFLLL 180 | FFBBBFBRRR 181 | FFFBFFFRRL 182 | FBFFBFFLLL 183 | FBFFFFBLRR 184 | FBBBBBFRLL 185 | FBBFFBBRLR 186 | BFBBBFFRRR 187 | BFBFFBFRLR 188 | FFFBBBBRLR 189 | FBFBFBFRRL 190 | BFBFBFBRRR 191 | FFFBBFBLLR 192 | FFBFBFFLRR 193 | FBBBBFFRRR 194 | BBFBFBBRLR 195 | BBFFFBFRRR 196 | FBBBFBBRRL 197 | FBBBFFBLRL 198 | FBFFFFFRRL 199 | BBFFBBFRLR 200 | FFBBBFFRRR 201 | FBFBFFFRLR 202 | BFBBFFBRLR 203 | BFFBFBFLLR 204 | BFFBBBFLRR 205 | FFFBBFBLRR 206 | FFFBBFFRRL 207 | BBFBBBFRRR 208 | FBBFBFBRRR 209 | FFFBFBBRLL 210 | FBBFBBFLLR 211 | BFFFBFFLRL 212 | BFBBFFBLLR 213 | BFFFFFBRLL 214 | BBFBBFFRLR 215 | FBFFBBBRLL 216 | FFBFFBFRLL 217 | FFBFFBFLLR 218 | BFBFBFBRLL 219 | BFFBFBBLLR 220 | FBFFFFFRLL 221 | FFBBBFBLRR 222 | FBFFFBFRLL 223 | FFBBFBFLRL 224 | BBFBFFFRRR 225 | FBFFFBBLLL 226 | BFFFFFBRLR 227 | BFBBBBBRLL 228 | BFFFBBBLLL 229 | FBBFFBBRLL 230 | BFFBBBBRRR 231 | BBFBBFBRLL 232 | FBBFBBFLRR 233 | BFBBFBBLLL 234 | FFBBBFFLLR 235 | BFBFBBFRLL 236 | FFFBBBFLRL 237 | BFBFBBFLRR 238 | FBFFBFBRRL 239 | FFBFFBFRLR 240 | BBFFBBBLLR 241 | BFBBBBFLRR 242 | FBBFFFBRRL 243 | FBFBFFFRLL 244 | FFBBBFBRLL 245 | BFFFFFBRRR 246 | BBFFBBFLRR 247 | BBFBFBFLLR 248 | FBFFFBFLRL 249 | BBFFBFFRLL 250 | FBBBFFBLRR 251 | BFFFBFBRRR 252 | FFFBFBBLLR 253 | FBFFBBBLRL 254 | BFFBFFFRLL 255 | BFFBBFFRLR 256 | BFBBBFFLRL 257 | BFFBBFBRLL 258 | FBFBFBFRRR 259 | FBFBBBBRRL 260 | FBFBFFFRRL 261 | BFFBBFFRRR 262 | FBFBBBBLLR 263 | FBBBBFFLLR 264 | BFFBFFFRRR 265 | BFBBBBBLLR 266 | BFFBBFBLRL 267 | FBBFFBFLRL 268 | BBFFBBFRRL 269 | BFFFFFFRRR 270 | FBBFBBBLLL 271 | BBFBFBBRRR 272 | FBBBFBFRLR 273 | FFFBFFFLRR 274 | FBFBBFFRRR 275 | FFBFFBFRRR 276 | FFBBFBBRRR 277 | FBBFBBFRRL 278 | BBFFFFFRRR 279 | BFFBBBFLLR 280 | FFBBFBBLRR 281 | FBFBBBFLLL 282 | FBFFFBFLLR 283 | BBFBFFFLRR 284 | FFBFFFFLLL 285 | BFFFFBFRLR 286 | BFFFBBBRRL 287 | FFFBBBFRLR 288 | FFBBBFBRLR 289 | FBFBFBBRLL 290 | BBFBBFBRLR 291 | BBFBFFFRLR 292 | FFBFBBBLRL 293 | FBFFFBFLRR 294 | BBFFFFBLRR 295 | FFFBBFFLLR 296 | FFBBFBFRRL 297 | BBFFFFFLRR 298 | FFBBBBBRRR 299 | FFBFBBFLLR 300 | FFFBFFFRLL 301 | FBBBBBFLRR 302 | FBBFBBBLRR 303 | FBBBBBFLRL 304 | FFFBBFBRLL 305 | FFFBFBBRRL 306 | FFFBFFFLRL 307 | BFBBBBFRRR 308 | FBBFBBFLRL 309 | BFFBBBFLRL 310 | BBBFFFFLLL 311 | BBFBFFFRRL 312 | FBBFBBFRLR 313 | FBFBFBFRLR 314 | FFBFFFBRLL 315 | BFFBFFFLRL 316 | BFFFFBFRLL 317 | BBFBFBBRRL 318 | BFBBFFBRLL 319 | BFFBFBBLRL 320 | FBBBFFBRRL 321 | BBFFFBBRLL 322 | FFFFBBBRRL 323 | BFBBFBBLRR 324 | FFFFBBBLLR 325 | FFFBFFBLLL 326 | FBBFFBBLLL 327 | BFFFFFFLRR 328 | FBBBFFFRRR 329 | BFFFBFBLLL 330 | FBFBBFBRRL 331 | FBFFBFFLRL 332 | BFBBBFBLRL 333 | BFFBFBBLLL 334 | BBFBFBBLRR 335 | BFFFBBFRRL 336 | FBBBFFFLRR 337 | FBBBBBBLLL 338 | BBFFBFBRLL 339 | FBBBFFFLLL 340 | FFBBFFBLLL 341 | FBBFFBBLLR 342 | FBBBBFBLRR 343 | FFFFBBFRRR 344 | BFBBFBFLRR 345 | BFBBBFBRRR 346 | FBBFFBBLRL 347 | BBFBFBBLLR 348 | FFBFFFBLRR 349 | FFFFBBBLLL 350 | FBBFBBBRRR 351 | FBFBFBFLRL 352 | FFBFBFFLLR 353 | BFBFBBFLLL 354 | FFFBFBBLLL 355 | FFBBFFBRRR 356 | BFBBBFBRLR 357 | FBFBFFFLRR 358 | BFFBBFFLRR 359 | FBBFFBFRLL 360 | FFBFBBBRRL 361 | BFBFFBBRLL 362 | BFBBFBBRLR 363 | FBBBBBBLRR 364 | FFFBBFBLRL 365 | FBBBFFFLLR 366 | BFBFBBFRLR 367 | FBFFBFBRLR 368 | FBBBFFFLRL 369 | FBFFFBBLRL 370 | FFBBFBBRLL 371 | BBFBFFBRLR 372 | FBFBBFFLLL 373 | BBFBFFFLLL 374 | BBFFFBBRLR 375 | BBFBFBFRLR 376 | BBFFFBBLLR 377 | BBFBFBFLRR 378 | BFBFBBBRRL 379 | FFBFFFFRRL 380 | FBFBFBBLRR 381 | FFBBBFBRRL 382 | BBFFFFBRRR 383 | BFFBFFBLRL 384 | FBBFFFFLRR 385 | BBFBBFBRRR 386 | FBFBBBFLLR 387 | FFBFFFFRRR 388 | BBFBBBFLLR 389 | BFBBFBFRRR 390 | FBFBFFFLLR 391 | FFBFBBFLLL 392 | BFBFFFFLLL 393 | BFFFFFFRLR 394 | BBFFBFFRRL 395 | FBFFBBBLLR 396 | FFBFBFBRRR 397 | BBFFBBBRRL 398 | BFBBBBBLRL 399 | BBFBBBFLRR 400 | FBFBFBBLLL 401 | BFFBBFBLLR 402 | BFBFBFFLLL 403 | FBFFBFFRRR 404 | BFFBFBFLRR 405 | BFFBBBBLLR 406 | FBBBFFFRLL 407 | FFBBFBFLRR 408 | FBFBFFBLLL 409 | FBBFFFFLLR 410 | FBBBBFFLRR 411 | FBBFBFBLLR 412 | FBBBBBBRRL 413 | BBFBFFBRLL 414 | FBFBFFBRRR 415 | BFFBFFFLRR 416 | BFFFBBBLRL 417 | FBFFBBBRRL 418 | FBBFFBBRRL 419 | FFFBBBFLLR 420 | FFFFBBBLRR 421 | FBFFBBFRRL 422 | FBFFBBBRRR 423 | FBBBFFBRLR 424 | BFBFFBFLLR 425 | BFBBFFBRRL 426 | FBBBFBBLRR 427 | BFFFBBFRLR 428 | FFBFBFFRLL 429 | BFFFBFFRLL 430 | BBFFBBFLLL 431 | FFFBBFBLLL 432 | FBBBBFFLRL 433 | FBBBFBFLLL 434 | BBFFFBFLLR 435 | BFBBFFFRRL 436 | FBFFFFFRRR 437 | BBFBBFBLLL 438 | FBBBBBFLLL 439 | BBFFBBBLRL 440 | BFFBBBFRRL 441 | FFFBBBBRRR 442 | BFBBFBBLLR 443 | FBFBFBBRLR 444 | BFBFFBBRRL 445 | FBFBBFFRLL 446 | BBFFFFBRLL 447 | FFBFBBBLLL 448 | FBBFBFBLLL 449 | BFFFFBBLRR 450 | BFFFFBFLLR 451 | FBBFFFBLRL 452 | FBFBBFFLLR 453 | BFBFFBFRLL 454 | BBFBBBBRRR 455 | BBFBFFBLLL 456 | FFBBFFBLLR 457 | BFFBFFBLLR 458 | BFBBBFBLLL 459 | BFFBBFFLRL 460 | BBFFFBFRRL 461 | BFFFBFBRLL 462 | BBFFBFFRRR 463 | FFBBBBBRRL 464 | FFBFBFBRLR 465 | BFBBFFFLLL 466 | BFBBBFFLLL 467 | BFFFBFBRRL 468 | FBFFFBBRLL 469 | FBFFBFBRLL 470 | FFBBBFFLRL 471 | FBBFFBBLRR 472 | BFBBBFFRRL 473 | BFBBBBFLLL 474 | BFBBBFBLRR 475 | BFBFFFFRLR 476 | FFBFFBBLRL 477 | BFBBBFBLLR 478 | FBFFBBFLRR 479 | FFFBBFFRLL 480 | BFFFFBFLRR 481 | FFBFFBBRLR 482 | BBFFFBFRLL 483 | FBBBFBFRLL 484 | BBFFFFBLLR 485 | FFBFFFFRLR 486 | BFFBFFBRRR 487 | BBFBBFBLRL 488 | FBBFFFFRLR 489 | FFBBFFFLLL 490 | FFBFBFBLRL 491 | FFBBBBFLRL 492 | BFFFBFBLLR 493 | BFBFBFFLRL 494 | BBFBBBFRLL 495 | FBBFFFBRLL 496 | BFBFFBFRRL 497 | FBFFBFFRLL 498 | BBFFBBFRRR 499 | BFBBBBFRLL 500 | FBBFBBFRLL 501 | BFFBBFBLRR 502 | BFFBFFBLRR 503 | BFFFBBFLRL 504 | FBBBFBBRLR 505 | FFFBBBBLRR 506 | BBFFFBFRLR 507 | BFFBBBBLRL 508 | BBFBFFBLLR 509 | FBBFFBFRRR 510 | FBFFBBFLLR 511 | BBFBFFBRRL 512 | FFBFFBBRRR 513 | BBFBBFFLLL 514 | FFFBFBFRRR 515 | FBFFFFFLLR 516 | FFFBFBFLRR 517 | BFFFFFFRRL 518 | FBBBFBFLLR 519 | FFFBBFBRRL 520 | FFBBFBFRLR 521 | FBBBFBFLRL 522 | BFBBBBFRRL 523 | FFBFFFFLRR 524 | BBFBFBFRLL 525 | BBFBFBFLRL 526 | FBBFFFFRRR 527 | FFBBBFBLLR 528 | FFBFFFBRRR 529 | BFFBFFFRLR 530 | FFBFFBFLRR 531 | FFFBBFBRRR 532 | BFFFFBFRRL 533 | BFFFBFFLRR 534 | FFBFBBFLRR 535 | BFBBFBBLRL 536 | BFBBFBFLLL 537 | FFBBBFFLLL 538 | FFFBFFFLLL 539 | FBFFFBBRLR 540 | FBFBBBFRLL 541 | FBBBBFBRRL 542 | FFFFBBBRRR 543 | BBFBFFFRLL 544 | FBBFBFFLRL 545 | FBFBFFBRLL 546 | FBBBFFFRRL 547 | FFBFBFBLRR 548 | BFBFFFBRLR 549 | FBFFFFFLLL 550 | BFFBFBBRLL 551 | FFBFBBBRRR 552 | FFBFBFBLLL 553 | FBBBBBFRRR 554 | FFBFBBFRLL 555 | BFFFFBBRRL 556 | BFBBBFBRRL 557 | FBFFFFFRLR 558 | FFFBBFFLRL 559 | FFFBFFFLLR 560 | FBBFBBFRRR 561 | BBFFFBBLLL 562 | BFFFFFBLRR 563 | FBFFFFBLLR 564 | BBFFFFBLLL 565 | FFBBFBBLLL 566 | FBFFBBFRLR 567 | BFBBBBBLRR 568 | FBFBFFBLRL 569 | FBFFBFFLLR 570 | BBFFFFBLRL 571 | BBFBBBBRLR 572 | BFBBBBBRRR 573 | FBFBBBBRRR 574 | FBBBFFBLLR 575 | BBFFFBBRRR 576 | FBBBFBBRLL 577 | FBBBFBFRRL 578 | FBBFBFFLLL 579 | FFBBFFFLRL 580 | BFFBFBFRLL 581 | BBFBBFBLLR 582 | FFFBFBFRLR 583 | BBFBBBFRRL 584 | FFBBFBFLLL 585 | FFFBFFBRLL 586 | BFFFBFBLRL 587 | FBFFFBBLLR 588 | BFFFFFBRRL 589 | FFBBBBBLRL 590 | BFFFBBBLLR 591 | BFBBFBFRLL 592 | BBFBFFBLRR 593 | FBBBFBBLLR 594 | BFBFBFFLRR 595 | FBFBBBFRRL 596 | BFBBBFFRLR 597 | FBBBBFFRRL 598 | BBFFBFBRLR 599 | BBFFFFBRLR 600 | FBBBBFBLLL 601 | FBFFFBFRRL 602 | FBBBFBBLRL 603 | BBFBBFFRLL 604 | FBBBFFFRLR 605 | FBFFFFFLRL 606 | FFBBFFFRLL 607 | BFBFFFBRRR 608 | BBFBFFFLLR 609 | BBFFFBFLRR 610 | FBFBFBBLRL 611 | FBBFFBFRRL 612 | FFBBBBFLLR 613 | BFFFBFBRLR 614 | FBBBBBFRLR 615 | FBFBBBBRLR 616 | BFFBFFBLLL 617 | BFFBFBBRLR 618 | FFBBFFFRRR 619 | FFBBBFFRRL 620 | FFBFBBFRRR 621 | BBFBBFBRRL 622 | BFFFFBBLLL 623 | BFFFFBBLLR 624 | BFBBBFBRLL 625 | BBFFFFFLLR 626 | FBFFFFBRRR 627 | FFFBFFFRLR 628 | BFBFFFFRLL 629 | BFBBFFFLRL 630 | FFFBFBFRLL 631 | BFFFFFBLLL 632 | FFBBBFFRLL 633 | BFBFFFFLRL 634 | FFBFBBBLLR 635 | BFBFFBFRRR 636 | FBBBFFBLLL 637 | FFBBFFFLRR 638 | FFBBBFFLRR 639 | BBFFBBBLRR 640 | FFBFFFBRRL 641 | FBFFBFBLLR 642 | BFFBBFFLLL 643 | BFBBFBFLRL 644 | BFFFBBFLRR 645 | FFFBFBFLLR 646 | BBFFBBBRRR 647 | BFBBFFFRLL 648 | FFBFBFFRLR 649 | BBFFFBBLRL 650 | BFFBBBBRRL 651 | BFBBBFFRLL 652 | FFFBBFFRRR 653 | FFBFFFFLRL 654 | FFBBBBFRLR 655 | FBFBBFBRLL 656 | FBBBFFBRLL 657 | FFBBBBFRLL 658 | BFFFBFFLLL 659 | FBBBBFBRLR 660 | BBFFBBBLLL 661 | FBBBBFBLLR 662 | FBBFBFFRRL 663 | FBBBFBFLRR 664 | BBFBFBBRLL 665 | FBFBFFBLRR 666 | FBBBBBFRRL 667 | FFBFFBBRRL 668 | FBFBBBFRRR 669 | BFBFBFBRLR 670 | BFFBBFFRLL 671 | BFBBBBBRLR 672 | BFFBBBFRLL 673 | FFBFFBFLLL 674 | BBFFBFFRLR 675 | FFBBBBBLLR 676 | BFFBBFFRRL 677 | FBBFBFBLRL 678 | FFFBFBFRRL 679 | FFBBFFFRLR 680 | FBBFBFBRRL 681 | FBBFFFFLRL 682 | FFBBBFBLLL 683 | FFBFFBBLRR 684 | FFBFBFFLLL 685 | FBFBFBBLLR 686 | BBFFBFBLLR 687 | BBFBFBBLRL 688 | FFFBFFFRRR 689 | BFFFFFFRLL 690 | BFFFBBFLLR 691 | BFBFFBBRRR 692 | FFBBBBBRLR 693 | FBBBBBBLRL 694 | FBFBBFBLLL 695 | FBFFBFBLRR 696 | FBFFFFBRLR 697 | BFBBBBFLRL 698 | FBBBFBFRRR 699 | FBFBFBFLLR 700 | FBFFFBBLRR 701 | BFFBFFBRLR 702 | BFFFBBFLLL 703 | BFFFBBFRLL 704 | BFBFFFBLRR 705 | FFBFBFBRRL 706 | FBBBFFBRRR 707 | FFBBFBBRLR 708 | FFFBFFBLRR 709 | BFBFFFFRRL 710 | FBFFFBFRRR 711 | FBBFBFBRLL 712 | BBFBFBFLLL 713 | FFBBFFBRLR 714 | FFBFBBFLRL 715 | BFFBFFBRLL 716 | FFBBBBFRRR 717 | BFBFBBBRRR 718 | BBFFFBFLRL 719 | FBFFFBFRLR 720 | BBFBFFBRRR 721 | FBFBBBFLRL 722 | FBFFFFBLRL 723 | FFFBFBBLRR 724 | FFFBBBBRLL 725 | FFBFBFBRLL 726 | FBFBBFBLRR 727 | BFFFFBBRLL 728 | FBFBBBBRLL 729 | FFBBFFBRRL 730 | FFBBFFBLRR 731 | FBBFBBFLLL 732 | BFFBFBFRRL 733 | FFFBBBBLRL 734 | FBBFFFBLLL 735 | FFBFBFBLLR 736 | BFBBBBFRLR 737 | BFFFBFFRLR 738 | FBBFBBBRLL 739 | FFBFBBFRLR 740 | FFBFFFBLLR 741 | FFFBBFFLRR 742 | FBFBFFBRLR 743 | BFFFFBBRLR 744 | FFFFBBBRLR 745 | BFBFFFBLLR 746 | FFFBBBFRRL 747 | FBBFFBFLRR 748 | BFBFBFBLLR 749 | FFFBFFBLRL 750 | FBBFBBBLRL 751 | FFFBFFBLLR 752 | BFBFFFBLRL 753 | FFFBFBFLRL 754 | FBFBBFBLRL 755 | FBFBBFBRRR 756 | BFBFBFBLRL 757 | BFBFBBBLRL 758 | BFFBFBFLRL 759 | FFFBBFFRLR 760 | BBFBBBBLLR 761 | FFBFBFFRRL 762 | BBFFFFFRLR 763 | FFBFFFBRLR 764 | FBBFBFFRRR 765 | FFBBFFBLRL 766 | FFBBBBBLLL 767 | BFBBBBBRRL 768 | BBFFFFFRRL 769 | BBFBBFFRRL 770 | FFBFBBFRRL 771 | FFBBFBFRRR 772 | FFBBBBFLRR 773 | FBFBFFBLLR 774 | BBFBBBBLLL 775 | FBFFFBBRRR 776 | BFBFBBFLRL 777 | BBFBFFBLRL 778 | FFBBBBBLRR 779 | BFFBBBBLLL 780 | BBFBBFFLRL 781 | FFBBBBBRLL 782 | FFBFFBFRRL 783 | BFFFFFFLRL 784 | FBFFBFFLRR 785 | BFFBBFFLLR 786 | FBFFBBFLLL 787 | BBFBBBBLRL 788 | FBFBBBFRLR 789 | BFFFFFFLLR 790 | FBBFFBFLLL 791 | FBBBBFFRLL 792 | FBBBBFBRRR 793 | BFBFFFFLLR 794 | BFBFBBBRLL 795 | FBBFBBBRLR 796 | BFBFFBBLRR 797 | FBBBFBBRRR 798 | FBBFBFFLLR 799 | BFFBBFBRRL 800 | BFBFBBFRRR 801 | FBFBBFBLLR 802 | FBFFBFBLRL 803 | FBFFFFBRRL 804 | FBFBFFFRRR 805 | BFFFBFFRRR 806 | FBBFBBBLLR 807 | FFFFBBBRLL 808 | BFBFFBFLLL 809 | FBBFBFFLRR 810 | FBBBBBBRLL 811 | FFBBBFFRLR 812 | FFBBFFFRRL 813 | BBFBBFFLLR 814 | FBBFFFFRLL 815 | BFBFBFBRRL 816 | FBFFFBFLLL 817 | FFBFFBBLLL 818 | BFFBBFBRLR 819 | FFFBFBBLRL 820 | BFBBFFBRRR 821 | FBFFBFBRRR 822 | BFBFBBFRRL 823 | FBBBFBBLLL 824 | BBFBFBFRRL 825 | BFFBFBBRRL 826 | BBFBBBFLLL 827 | FFFBFFBRLR 828 | BFFFBBBLRR 829 | FBFFFFBLLL 830 | FFFBBBFRLL 831 | FBFBBFFLRR 832 | FBFBFFFLLL 833 | BFBFBFFRLL 834 | FBFBBFFRRL 835 | FBBBBBBLLR 836 | BFBFBFFRRR 837 | FBFFBBBLRR 838 | FBFFBFFRLR 839 | FBFBBBBLRR 840 | BBFFBFBLRL 841 | FBBFBFFRLR 842 | FBBFFFBLRR 843 | BFBFBFFRRL -------------------------------------------------------------------------------- /inputs/day08.txt: -------------------------------------------------------------------------------- 1 | acc +40 2 | acc -14 3 | nop +386 4 | jmp +262 5 | acc -4 6 | nop +25 7 | jmp +500 8 | acc +13 9 | acc -1 10 | acc -7 11 | acc +37 12 | jmp +319 13 | acc +46 14 | jmp +429 15 | acc -4 16 | acc -8 17 | jmp +335 18 | acc +12 19 | jmp +78 20 | acc +16 21 | acc -11 22 | nop +137 23 | acc +41 24 | jmp +210 25 | jmp +83 26 | acc +7 27 | jmp +48 28 | nop +374 29 | acc +11 30 | jmp +268 31 | acc +1 32 | acc -17 33 | acc +15 34 | jmp +178 35 | acc +23 36 | jmp -5 37 | jmp +374 38 | acc +8 39 | acc +5 40 | nop +231 41 | jmp +1 42 | jmp -22 43 | acc +44 44 | acc +39 45 | jmp +415 46 | acc +44 47 | acc -8 48 | acc -10 49 | jmp +36 50 | nop +385 51 | acc +6 52 | jmp -37 53 | nop +245 54 | acc +5 55 | jmp +261 56 | acc -3 57 | jmp +23 58 | acc +37 59 | jmp +532 60 | acc -18 61 | acc -8 62 | nop +405 63 | jmp +499 64 | acc -1 65 | acc +3 66 | acc +47 67 | acc +38 68 | jmp +67 69 | jmp -9 70 | acc +16 71 | acc -4 72 | acc +23 73 | acc +6 74 | jmp -14 75 | jmp +229 76 | nop +235 77 | acc +3 78 | acc +17 79 | jmp +521 80 | acc +49 81 | acc -8 82 | acc +10 83 | jmp +103 84 | jmp +75 85 | acc +22 86 | nop +527 87 | acc +36 88 | acc +32 89 | jmp -46 90 | nop +434 91 | jmp +447 92 | jmp +159 93 | acc +37 94 | acc -19 95 | acc +39 96 | jmp +181 97 | jmp +1 98 | jmp +162 99 | jmp +1 100 | acc +0 101 | acc +0 102 | acc +34 103 | jmp +241 104 | acc +42 105 | acc +12 106 | jmp -75 107 | jmp -70 108 | acc +42 109 | acc -4 110 | acc +49 111 | jmp +456 112 | jmp +277 113 | jmp +302 114 | acc +45 115 | acc +19 116 | nop -41 117 | jmp +318 118 | jmp +153 119 | acc +9 120 | nop +323 121 | jmp -113 122 | nop -9 123 | jmp +1 124 | acc +37 125 | acc +12 126 | jmp +448 127 | acc +3 128 | acc +38 129 | jmp -114 130 | acc +7 131 | jmp +180 132 | acc -5 133 | acc -10 134 | jmp +117 135 | jmp +320 136 | acc +9 137 | jmp +330 138 | acc +18 139 | jmp +1 140 | jmp +330 141 | nop +450 142 | acc +10 143 | jmp +22 144 | acc +44 145 | jmp +298 146 | acc +38 147 | nop +433 148 | acc +1 149 | jmp +431 150 | jmp +339 151 | nop +251 152 | jmp -126 153 | nop +191 154 | jmp +294 155 | acc -7 156 | acc +30 157 | acc -15 158 | jmp +400 159 | jmp +441 160 | acc +5 161 | acc +17 162 | nop +35 163 | nop +103 164 | jmp +410 165 | nop -122 166 | acc +35 167 | jmp +73 168 | acc -13 169 | jmp +291 170 | acc -11 171 | jmp +95 172 | acc -12 173 | acc +19 174 | acc -16 175 | acc +34 176 | jmp +140 177 | acc -15 178 | acc +6 179 | acc -4 180 | jmp +190 181 | acc +11 182 | acc +0 183 | acc +19 184 | acc +43 185 | jmp +167 186 | acc +29 187 | nop +371 188 | jmp +1 189 | jmp -36 190 | acc +20 191 | acc +20 192 | acc +26 193 | jmp +374 194 | jmp -76 195 | acc +20 196 | jmp +115 197 | acc +13 198 | acc +25 199 | acc +39 200 | jmp -115 201 | acc -18 202 | nop -64 203 | jmp +133 204 | acc -18 205 | acc +32 206 | nop -198 207 | jmp -157 208 | acc +6 209 | acc +41 210 | nop +36 211 | jmp -136 212 | jmp +1 213 | jmp +41 214 | acc -14 215 | acc -17 216 | acc +1 217 | jmp +280 218 | jmp +1 219 | jmp +72 220 | acc +7 221 | jmp +1 222 | acc -12 223 | acc -8 224 | jmp +291 225 | acc -13 226 | acc +36 227 | acc +0 228 | jmp +97 229 | acc +20 230 | acc +0 231 | acc +12 232 | acc -16 233 | jmp -196 234 | nop +342 235 | jmp -122 236 | acc +21 237 | nop -33 238 | acc +38 239 | jmp +285 240 | acc -9 241 | acc -17 242 | acc -2 243 | acc +25 244 | jmp +232 245 | jmp +146 246 | jmp +312 247 | acc +11 248 | nop -54 249 | nop +351 250 | jmp -46 251 | acc +27 252 | jmp -244 253 | jmp +262 254 | acc +42 255 | acc +5 256 | nop +4 257 | acc +20 258 | jmp +239 259 | jmp -62 260 | nop -147 261 | jmp -169 262 | acc -12 263 | acc +40 264 | acc +29 265 | jmp +178 266 | nop +310 267 | jmp +49 268 | acc -18 269 | acc +5 270 | jmp +297 271 | jmp +244 272 | acc +31 273 | acc +21 274 | acc +47 275 | acc +41 276 | jmp +76 277 | acc +29 278 | acc +22 279 | acc +16 280 | jmp -121 281 | jmp -244 282 | acc +45 283 | acc -9 284 | acc +36 285 | acc +5 286 | jmp +265 287 | acc +13 288 | acc +47 289 | acc -11 290 | jmp +338 291 | acc +0 292 | jmp +85 293 | acc +18 294 | acc +27 295 | jmp +1 296 | acc +43 297 | jmp +227 298 | jmp +276 299 | acc +42 300 | nop +52 301 | acc -15 302 | nop +311 303 | jmp -199 304 | acc +45 305 | jmp +286 306 | acc -8 307 | acc +7 308 | acc +9 309 | acc -18 310 | jmp -273 311 | acc +50 312 | jmp +239 313 | nop +31 314 | acc +16 315 | jmp -162 316 | acc +12 317 | nop -204 318 | acc +27 319 | jmp -166 320 | acc -4 321 | acc +38 322 | acc +50 323 | nop +120 324 | jmp +243 325 | acc +29 326 | jmp -300 327 | acc +0 328 | nop +179 329 | acc -6 330 | jmp -136 331 | nop -305 332 | acc +15 333 | jmp -136 334 | acc -6 335 | jmp +172 336 | jmp +41 337 | acc -7 338 | nop +81 339 | jmp +199 340 | jmp +54 341 | acc +1 342 | acc +25 343 | jmp -283 344 | nop -132 345 | acc +47 346 | jmp +239 347 | acc +45 348 | acc -14 349 | acc +1 350 | acc +0 351 | jmp +10 352 | acc -15 353 | nop -338 354 | nop -257 355 | jmp +1 356 | jmp -218 357 | acc +36 358 | acc +33 359 | acc +28 360 | jmp -230 361 | acc -5 362 | acc -14 363 | jmp +1 364 | jmp -87 365 | acc +48 366 | nop +141 367 | nop +224 368 | acc +42 369 | jmp +22 370 | nop +140 371 | acc +16 372 | jmp +1 373 | acc +16 374 | jmp -92 375 | acc +37 376 | jmp -368 377 | acc +27 378 | jmp +155 379 | acc +11 380 | nop +196 381 | acc +5 382 | jmp -269 383 | nop -92 384 | jmp -276 385 | acc +46 386 | acc +6 387 | acc +34 388 | jmp -258 389 | jmp +2 390 | jmp +80 391 | jmp +36 392 | acc +20 393 | jmp -181 394 | nop -54 395 | acc +48 396 | nop +166 397 | nop +165 398 | jmp -263 399 | acc +47 400 | acc +33 401 | jmp +54 402 | nop -216 403 | acc +37 404 | acc +19 405 | jmp -349 406 | acc +12 407 | nop -156 408 | nop +7 409 | acc -5 410 | jmp -390 411 | acc -10 412 | jmp -315 413 | nop -393 414 | jmp -89 415 | jmp +1 416 | jmp -312 417 | acc +4 418 | jmp -120 419 | acc -2 420 | nop +23 421 | acc +42 422 | acc +28 423 | jmp -205 424 | acc +43 425 | acc +6 426 | jmp -49 427 | acc -13 428 | acc +1 429 | acc +10 430 | acc +19 431 | jmp -394 432 | acc -15 433 | acc +0 434 | jmp -365 435 | acc +23 436 | acc -17 437 | nop +23 438 | acc +0 439 | jmp -37 440 | acc +9 441 | acc +31 442 | jmp -7 443 | jmp -278 444 | nop +147 445 | acc +5 446 | acc +43 447 | jmp -149 448 | nop -65 449 | acc +19 450 | acc +46 451 | jmp +59 452 | acc +29 453 | nop +169 454 | jmp +131 455 | acc +43 456 | acc +50 457 | jmp +10 458 | acc -4 459 | jmp -390 460 | acc +24 461 | jmp -236 462 | acc +10 463 | acc +19 464 | nop -160 465 | acc +32 466 | jmp +162 467 | acc +29 468 | jmp +170 469 | jmp -14 470 | acc +36 471 | jmp -88 472 | acc +2 473 | acc +1 474 | acc +1 475 | jmp -86 476 | nop +48 477 | acc +21 478 | jmp -356 479 | acc +0 480 | nop -321 481 | nop -247 482 | nop +127 483 | jmp -279 484 | jmp +40 485 | acc +23 486 | acc +47 487 | acc +6 488 | jmp -438 489 | acc +26 490 | acc +35 491 | nop +120 492 | acc +2 493 | jmp -58 494 | acc +30 495 | acc +2 496 | jmp +42 497 | acc +8 498 | acc +24 499 | acc +9 500 | acc +19 501 | jmp -351 502 | acc +40 503 | acc +18 504 | acc +43 505 | acc +29 506 | jmp +9 507 | jmp +1 508 | jmp -210 509 | jmp -82 510 | acc +41 511 | acc +45 512 | jmp -28 513 | nop -395 514 | jmp +71 515 | acc +38 516 | acc -13 517 | nop -251 518 | acc -9 519 | jmp -366 520 | acc +34 521 | acc +7 522 | acc -7 523 | jmp -212 524 | acc +6 525 | acc +24 526 | acc +1 527 | acc -11 528 | jmp +94 529 | acc +20 530 | acc -14 531 | acc -5 532 | jmp +81 533 | acc +37 534 | jmp +77 535 | acc -15 536 | nop -486 537 | jmp +39 538 | jmp +1 539 | acc +39 540 | acc +49 541 | jmp -371 542 | acc +5 543 | nop -446 544 | jmp -267 545 | acc +39 546 | jmp +67 547 | acc +35 548 | acc +8 549 | nop -419 550 | jmp -53 551 | acc +20 552 | acc -9 553 | acc +46 554 | acc +30 555 | jmp -136 556 | acc +35 557 | jmp +56 558 | jmp +70 559 | acc +13 560 | acc +48 561 | jmp -290 562 | acc -18 563 | acc +48 564 | acc +50 565 | jmp -225 566 | jmp -226 567 | acc +34 568 | jmp -391 569 | acc +49 570 | nop -324 571 | acc -10 572 | acc +41 573 | jmp -130 574 | jmp +6 575 | jmp -555 576 | acc -17 577 | jmp -433 578 | acc +33 579 | jmp -64 580 | jmp -476 581 | nop -138 582 | nop -556 583 | acc +47 584 | jmp +27 585 | jmp -78 586 | acc -16 587 | acc -4 588 | acc -3 589 | acc +48 590 | jmp -292 591 | acc +43 592 | acc +3 593 | acc +44 594 | jmp +15 595 | acc +49 596 | acc +5 597 | acc +4 598 | acc +27 599 | jmp -491 600 | acc +6 601 | acc +38 602 | acc +31 603 | nop -70 604 | jmp -379 605 | acc +0 606 | acc +2 607 | acc +49 608 | jmp -297 609 | jmp -405 610 | jmp -72 611 | jmp -371 612 | jmp -115 613 | acc +7 614 | acc -15 615 | acc -9 616 | jmp -486 617 | acc +3 618 | acc +16 619 | nop -19 620 | acc +14 621 | jmp -296 622 | jmp -233 623 | acc +40 624 | nop -342 625 | nop -58 626 | acc -9 627 | jmp -316 628 | acc +4 629 | acc +15 630 | acc +14 631 | acc +50 632 | jmp -296 633 | acc -11 634 | acc +14 635 | acc +43 636 | acc +38 637 | jmp -391 638 | acc +43 639 | acc +25 640 | acc -5 641 | acc +27 642 | jmp +1 -------------------------------------------------------------------------------- /inputs/day09.txt: -------------------------------------------------------------------------------- 1 | 9 2 | 1 3 | 39 4 | 30 5 | 43 6 | 2 7 | 41 8 | 50 9 | 36 10 | 21 11 | 8 12 | 37 13 | 16 14 | 13 15 | 18 16 | 4 17 | 40 18 | 33 19 | 25 20 | 11 21 | 47 22 | 10 23 | 38 24 | 29 25 | 14 26 | 53 27 | 3 28 | 49 29 | 6 30 | 31 31 | 5 32 | 12 33 | 15 34 | 56 35 | 43 36 | 57 37 | 7 38 | 8 39 | 26 40 | 9 41 | 13 42 | 16 43 | 19 44 | 22 45 | 17 46 | 39 47 | 11 48 | 10 49 | 21 50 | 24 51 | 20 52 | 14 53 | 18 54 | 63 55 | 23 56 | 25 57 | 27 58 | 28 59 | 30 60 | 33 61 | 15 62 | 29 63 | 45 64 | 32 65 | 26 66 | 31 67 | 34 68 | 35 69 | 36 70 | 53 71 | 62 72 | 60 73 | 37 74 | 41 75 | 38 76 | 47 77 | 39 78 | 68 79 | 40 80 | 46 81 | 42 82 | 43 83 | 44 84 | 51 85 | 48 86 | 91 87 | 71 88 | 67 89 | 57 90 | 115 91 | 75 92 | 69 93 | 72 94 | 73 95 | 76 96 | 85 97 | 77 98 | 78 99 | 79 100 | 114 101 | 95 102 | 143 103 | 82 104 | 84 105 | 120 106 | 86 107 | 92 108 | 99 109 | 105 110 | 123 111 | 124 112 | 126 113 | 142 114 | 129 115 | 145 116 | 152 117 | 159 118 | 148 119 | 149 120 | 219 121 | 361 122 | 157 123 | 161 124 | 163 125 | 166 126 | 176 127 | 206 128 | 234 129 | 178 130 | 304 131 | 410 132 | 324 133 | 204 134 | 228 135 | 247 136 | 253 137 | 330 138 | 271 139 | 423 140 | 293 141 | 297 142 | 306 143 | 481 144 | 487 145 | 434 146 | 323 147 | 391 148 | 327 149 | 329 150 | 342 151 | 354 152 | 499 153 | 382 154 | 475 155 | 432 156 | 451 157 | 457 158 | 497 159 | 550 160 | 500 161 | 774 162 | 564 163 | 568 164 | 665 165 | 590 166 | 603 167 | 1064 168 | 650 169 | 681 170 | 677 171 | 652 172 | 656 173 | 1149 174 | 671 175 | 696 176 | 736 177 | 932 178 | 833 179 | 883 180 | 1140 181 | 997 182 | 954 183 | 1047 184 | 1678 185 | 1068 186 | 1342 187 | 1132 188 | 1662 189 | 1240 190 | 1584 191 | 1253 192 | 1302 193 | 1306 194 | 1329 195 | 1323 196 | 1308 197 | 1327 198 | 2631 199 | 2287 200 | 1432 201 | 2044 202 | 1765 203 | 1716 204 | 2561 205 | 1951 206 | 3259 207 | 2734 208 | 2115 209 | 2200 210 | 2308 211 | 2459 212 | 2372 213 | 3612 214 | 4036 215 | 2555 216 | 2559 217 | 2637 218 | 2614 219 | 5328 220 | 3995 221 | 2635 222 | 2759 223 | 3148 224 | 6151 225 | 3383 226 | 3481 227 | 3667 228 | 4066 229 | 4259 230 | 4315 231 | 8711 232 | 4487 233 | 4423 234 | 4508 235 | 5907 236 | 6454 237 | 8682 238 | 8767 239 | 5114 240 | 9013 241 | 6864 242 | 5251 243 | 17695 244 | 6950 245 | 5394 246 | 7143 247 | 6142 248 | 7642 249 | 15631 250 | 9759 251 | 7796 252 | 13026 253 | 12893 254 | 8802 255 | 8738 256 | 8910 257 | 12857 258 | 8931 259 | 10365 260 | 15910 261 | 12596 262 | 10508 263 | 12064 264 | 13190 265 | 10645 266 | 11536 267 | 11393 268 | 12344 269 | 14880 270 | 26216 271 | 13285 272 | 14944 273 | 22023 274 | 19103 275 | 19439 276 | 16534 277 | 17648 278 | 17540 279 | 17669 280 | 17841 281 | 35510 282 | 20467 283 | 19296 284 | 21010 285 | 24408 286 | 21153 287 | 23737 288 | 22038 289 | 23930 290 | 22181 291 | 22929 292 | 24678 293 | 25629 294 | 34182 295 | 53478 296 | 30825 297 | 36836 298 | 47607 299 | 34203 300 | 38572 301 | 40449 302 | 35188 303 | 35209 304 | 84443 305 | 54755 306 | 39763 307 | 40306 308 | 79433 309 | 55335 310 | 43191 311 | 44967 312 | 44219 313 | 45110 314 | 68897 315 | 75408 316 | 69412 317 | 64441 318 | 56454 319 | 91591 320 | 65028 321 | 67661 322 | 69391 323 | 70397 324 | 72775 325 | 122996 326 | 74951 327 | 123652 328 | 117742 329 | 109247 330 | 82954 331 | 80069 332 | 111789 333 | 203721 334 | 87410 335 | 88158 336 | 182186 337 | 143864 338 | 101564 339 | 125351 340 | 329072 341 | 126851 342 | 124115 343 | 121482 344 | 132689 345 | 134419 346 | 197811 347 | 139788 348 | 143172 349 | 210811 350 | 155020 351 | 157905 352 | 204436 353 | 181633 354 | 168227 355 | 379038 356 | 167479 357 | 175568 358 | 188974 359 | 220099 360 | 280371 361 | 223046 362 | 281871 363 | 293578 364 | 349897 365 | 261270 366 | 245597 367 | 254171 368 | 338855 369 | 290594 370 | 359456 371 | 310651 372 | 328762 373 | 298192 374 | 323247 375 | 416290 376 | 439776 377 | 335706 378 | 436838 379 | 412020 380 | 581303 381 | 343047 382 | 364542 383 | 409073 384 | 624918 385 | 578563 386 | 468643 387 | 698311 388 | 499768 389 | 582933 390 | 536191 391 | 755067 392 | 670461 393 | 621439 394 | 588786 395 | 608843 396 | 626954 397 | 737968 398 | 633898 399 | 848849 400 | 967965 401 | 957145 402 | 752120 403 | 776562 404 | 707589 405 | 931833 406 | 811690 407 | 773615 408 | 908841 409 | 1047206 410 | 968411 411 | 1004834 412 | 1757690 413 | 1088554 414 | 1119124 415 | 1553272 416 | 1482151 417 | 1222684 418 | 1937403 419 | 1707910 420 | 1858896 421 | 1584099 422 | 1341487 423 | 1682456 424 | 1459709 425 | 2020387 426 | 1588252 427 | 1481204 428 | 1484151 429 | 1519279 430 | 1585305 431 | 3072403 432 | 1913675 433 | 2131525 434 | 3772571 435 | 1973245 436 | 3068250 437 | 2207678 438 | 2311238 439 | 3522708 440 | 2703888 441 | 2564171 442 | 3227189 443 | 2801196 444 | 2822691 445 | 2860766 446 | 2825638 447 | 2926792 448 | 4846025 449 | 2940913 450 | 3003430 451 | 4556554 452 | 2965355 453 | 3397826 454 | 3104584 455 | 3498980 456 | 3886920 457 | 4121353 458 | 6813712 459 | 5434867 460 | 4875409 461 | 4911566 462 | 5033316 463 | 5015126 464 | 5365367 465 | 5268059 466 | 5386862 467 | 5623887 468 | 5965350 469 | 6045497 470 | 7620333 471 | 5752430 472 | 8008273 473 | 7950609 474 | 7086708 475 | 8119710 476 | 6502410 477 | 6069939 478 | 6603564 479 | 10663996 480 | 7385900 481 | 9154979 482 | 8996762 483 | 9890535 484 | 9786975 485 | 12995119 486 | 12010847 487 | 15200476 488 | 10380493 489 | 12888392 490 | 12115436 491 | 11432359 492 | 11376317 493 | 11717780 494 | 16382662 495 | 11822369 496 | 12254840 497 | 19501336 498 | 19535472 499 | 12572349 500 | 22778927 501 | 32530591 502 | 20271028 503 | 17979881 504 | 21219334 505 | 30911789 506 | 25110555 507 | 29426007 508 | 21812852 509 | 20167468 510 | 21756810 511 | 22098273 512 | 22202862 513 | 37481217 514 | 41924278 515 | 23491753 516 | 22808676 517 | 41292282 518 | 23540149 519 | 24827189 520 | 32073685 521 | 30234721 522 | 50053566 523 | 30552230 524 | 43090436 525 | 54287401 526 | 38147349 527 | 42369301 528 | 55461098 529 | 44015714 530 | 105514664 531 | 41980320 532 | 44565486 533 | 42265741 534 | 42370330 535 | 43855083 536 | 44301135 537 | 81237785 538 | 67346836 539 | 46300429 540 | 96656702 541 | 85996034 542 | 48367338 543 | 53774870 544 | 109748499 545 | 72922560 546 | 60786951 547 | 68699579 548 | 84739631 549 | 86831227 550 | 91922219 551 | 80127669 552 | 119222989 553 | 84246061 554 | 84350650 555 | 85835403 556 | 189876168 557 | 84636071 558 | 86120824 559 | 97629953 560 | 88156218 561 | 90601564 562 | 94667767 563 | 100075299 564 | 155530806 565 | 102142208 566 | 122474449 567 | 109154289 568 | 138125520 569 | 151388515 570 | 172666630 571 | 145423022 572 | 148827248 573 | 164373730 574 | 189281958 575 | 174952214 576 | 164478319 577 | 186492858 578 | 187977611 579 | 229773672 580 | 178757782 581 | 170756895 582 | 172792289 583 | 174277042 584 | 206784242 585 | 185269331 586 | 334288588 587 | 194743066 588 | 209229588 589 | 296885274 590 | 224616657 591 | 231628738 592 | 247279809 593 | 289514035 594 | 294250270 595 | 316179917 596 | 319700064 597 | 313200978 598 | 328852049 599 | 335235214 600 | 389094976 601 | 337270608 602 | 398893699 603 | 343549184 604 | 397408946 605 | 379986483 606 | 358061620 607 | 359546373 608 | 369020108 609 | 380012397 610 | 394498919 611 | 419359723 612 | 514130692 613 | 478908547 614 | 613950334 615 | 471896466 616 | 521142773 617 | 563459726 618 | 583764305 619 | 607451248 620 | 686913669 621 | 654935278 622 | 642053027 623 | 872192312 624 | 672505822 625 | 973496707 626 | 680819792 627 | 701610804 628 | 1034921761 629 | 717607993 630 | 727081728 631 | 728566481 632 | 1235965548 633 | 749032505 634 | 774511316 635 | 915641692 636 | 891256189 637 | 1608864182 638 | 1264584097 639 | 1085846800 640 | 993039239 641 | 1262386526 642 | 1256270127 643 | 1419218797 644 | 1588147514 645 | 1296988305 646 | 1314558849 647 | 1322872819 648 | 1399587550 649 | 2316713995 650 | 1806897881 651 | 1736532565 652 | 1428692532 653 | 1444689721 654 | 1446174474 655 | 2505065597 656 | 1477598986 657 | 1523543821 658 | 2865134309 659 | 2097384135 660 | 1492208709 661 | 1884295428 662 | 2249309366 663 | 2078886039 664 | 2408719619 665 | 2696575855 666 | 2553258432 667 | 2716207102 668 | 2611547154 669 | 2637431668 670 | 3631272844 671 | 2714146399 672 | 3556485025 673 | 3904282016 674 | 5108871830 675 | 3693999087 676 | 2968233542 677 | 2873382253 678 | 2890864195 679 | 6795146211 680 | 5515568272 681 | 3571094748 682 | 3620927956 683 | 6993167258 684 | 3376504137 685 | 3741518075 686 | 8231775374 687 | 4690433193 688 | 4487605658 689 | 5249834287 690 | 5308123009 691 | 5164805586 692 | 5684440644 693 | 5325693553 694 | 5351578067 695 | 5587528652 696 | 5605010594 697 | 5764246448 698 | 7598281103 699 | 8991352362 700 | 10172046302 701 | 15759574954 702 | 6249886390 703 | 15856486946 704 | 6947598885 705 | 6997432093 706 | 7118022212 707 | 12301290267 708 | 8066937330 709 | 7864109795 710 | 8229123733 711 | 9178038851 712 | 15226555826 713 | 10601412354 714 | 13316771617 715 | 13831183778 716 | 23623684749 717 | 14862479495 718 | 15523624369 719 | 10939106719 720 | 14479010123 721 | 11369257042 722 | 12014132838 723 | 13247318483 724 | 24432596132 725 | 13197485275 726 | 13367908602 727 | 13945030978 728 | 18057128931 729 | 14065621097 730 | 16093233528 731 | 18803216514 732 | 17042148646 733 | 15931047125 734 | 22375524126 735 | 26615227085 736 | 19779451205 737 | 21540519073 738 | 21970669396 739 | 35606140170 740 | 26079753935 741 | 22308363761 742 | 22953239557 743 | 23383389880 744 | 24186425202 745 | 24566742317 746 | 24616575525 747 | 25211618113 748 | 26444803758 749 | 57576809566 750 | 26565393877 751 | 27312939580 752 | 43121902581 753 | 29996668222 754 | 43486952404 755 | 32024280653 756 | 49568466642 757 | 32973195771 758 | 41750120601 759 | 47092390785 760 | 44493758630 761 | 67688644898 762 | 47519981874 763 | 46537411713 764 | 47950132197 765 | 45261603318 766 | 45691753641 767 | 47569815082 768 | 86243879231 769 | 48753167519 770 | 62969863993 771 | 49828193638 772 | 51656421871 773 | 53757743338 774 | 53878333457 775 | 56562062099 776 | 95042522982 777 | 74723316372 778 | 76460148175 779 | 64997476424 780 | 79116671438 781 | 114565943066 782 | 118875809881 783 | 92063573712 784 | 91799015031 785 | 97398008720 786 | 90953356959 787 | 92229165354 788 | 92831418400 789 | 105315229618 790 | 141627208669 791 | 161877291717 792 | 96322982601 793 | 116727607331 794 | 98581361157 795 | 260503018550 796 | 114825670062 797 | 105414165209 798 | 211148652663 799 | 146709751857 800 | 152885044700 801 | 359084379707 802 | 139720792796 803 | 163578837581 804 | 144114147862 805 | 170070028397 806 | 189461582432 807 | 222141772540 808 | 182752371990 809 | 203995526366 810 | 183182522313 811 | 185060583754 812 | 209559025731 813 | 189154401001 814 | 335864152858 815 | 194904343758 816 | 293485704915 817 | 201737147810 818 | 213407031219 819 | 220239835271 820 | 245134958005 821 | 249528313071 822 | 463555733312 823 | 331770335611 824 | 402413357771 825 | 283834940658 826 | 303299630377 827 | 307692985443 828 | 327296670175 829 | 417402557585 830 | 408311374977 831 | 365934894303 832 | 513725540186 833 | 444432656829 834 | 398713426732 835 | 368243106067 836 | 525018553859 837 | 503044730646 838 | 522201013933 839 | 396641491568 840 | 465374793276 841 | 587134571035 842 | 832711539302 843 | 433646866490 844 | 735608045152 845 | 720702187962 846 | 533363253729 847 | 630596300552 848 | 649769834961 849 | 591527926101 850 | 610992615820 851 | 634989655618 852 | 675936091510 853 | 693231564478 854 | 762576385871 855 | 764884597635 856 | 1114037346466 857 | 766956532799 858 | 795354918300 859 | 1198127186855 860 | 1064243167042 861 | 830288358058 862 | 862016284844 863 | 918842505501 864 | 1200982838428 865 | 899021659766 866 | 967010120219 867 | 1025174792591 868 | 1044639482310 869 | 1124891179830 870 | 1163959554281 871 | 1209299345239 872 | 1202520541921 873 | 1245982271438 874 | 1226517581719 875 | 1720575573820 876 | 1974183942874 877 | 1780858790345 878 | 1944017298092 879 | 1557931304171 880 | 1531841130434 881 | 1562311451099 882 | 1597244890857 883 | 1625643276358 884 | 1817864165267 885 | 1887191077435 886 | 1797298478277 887 | 2082802059782 888 | 1866031779985 889 | 1924196452357 890 | 1943661142076 891 | 2981823719548 892 | 2069814274901 893 | 2288850734111 894 | 2327411721751 895 | 2455281616677 896 | 2758358712153 897 | 4301595664625 898 | 2472499853157 899 | 3200701524593 900 | 3089772434605 901 | 3094152581533 902 | 3120242755270 903 | 3129086021291 904 | 4269798331434 905 | 4621613565039 906 | 3809692922061 907 | 3222888167215 908 | 4232511876187 909 | 3615162643544 910 | 3663330258262 911 | 3721494930634 912 | 3790228232342 913 | 6886218425477 914 | 3867857594433 915 | 6282192775218 916 | 4358665009012 917 | 6792416279553 918 | 4616262455862 919 | 4782693338428 920 | 4927781469834 921 | 5601585874448 922 | 5562272287762 923 | 6753102692867 924 | 6210015189875 925 | 6183925016138 926 | 6214395336803 927 | 6249328776561 928 | 6351974188506 929 | 7384825188896 930 | 6838050810759 931 | 7032581089276 932 | 6944383097849 933 | 7278492901806 934 | 7453558490604 935 | 13135547202038 936 | 10039557008903 937 | 7658085826775 938 | 8226522603445 939 | 8484120050295 940 | 8974927464874 941 | 14177241468449 942 | 9544043925696 943 | 9398955794290 944 | 16152058487157 945 | 10490053757596 946 | 13158778434652 947 | 11746197303900 948 | 12393940206013 949 | 12398320352941 950 | 12433253792699 951 | 12463724113364 952 | 14329208286745 953 | 13296357286355 954 | 28550378840098 955 | 21290241229596 956 | 13976964187125 957 | 14397941588453 958 | 14732051392410 959 | 15680081094049 960 | 15884608430220 961 | 49840620069694 962 | 16142205877070 963 | 25696102412853 964 | 17459047515169 965 | 39040432597694 966 | 21862679907654 967 | 24131007186700 968 | 19889009551886 969 | 33343655945389 970 | 22236251061496 971 | 24140137509913 972 | 35773617982106 973 | 33185366838241 974 | 24831574145640 975 | 27694298874808 976 | 85614238051800 977 | 52681386026798 978 | 28976438380404 979 | 50786629901594 980 | 37174849659816 981 | 28374905775578 982 | 31856989103622 983 | 39321727422823 984 | 31564689524269 985 | 32026814307290 986 | 33601253392239 987 | 47583308426694 988 | 57553091516475 989 | 65628067699529 990 | 41751689459540 991 | 56069204650386 992 | 57316374024941 993 | 42125260613382 994 | 90738458354716 995 | 48971711655553 996 | 51834436384721 997 | 53206479921218 998 | 52525873020448 999 | 76496577082639 1000 | 88881063549210 -------------------------------------------------------------------------------- /inputs/day10.txt: -------------------------------------------------------------------------------- 1 | 105 2 | 124 3 | 42 4 | 52 5 | 71 6 | 41 7 | 1 8 | 85 9 | 148 10 | 90 11 | 155 12 | 112 13 | 35 14 | 134 15 | 145 16 | 39 17 | 161 18 | 160 19 | 34 20 | 54 21 | 15 22 | 165 23 | 8 24 | 20 25 | 46 26 | 49 27 | 108 28 | 151 29 | 60 30 | 7 31 | 48 32 | 154 33 | 63 34 | 147 35 | 132 36 | 98 37 | 158 38 | 33 39 | 137 40 | 45 41 | 140 42 | 121 43 | 22 44 | 62 45 | 111 46 | 141 47 | 167 48 | 131 49 | 74 50 | 93 51 | 2 52 | 142 53 | 113 54 | 21 55 | 162 56 | 61 57 | 3 58 | 19 59 | 101 60 | 9 61 | 102 62 | 115 63 | 70 64 | 12 65 | 84 66 | 6 67 | 114 68 | 107 69 | 97 70 | 133 71 | 64 72 | 80 73 | 78 74 | 91 75 | 79 76 | 14 77 | 168 78 | 87 79 | 159 80 | 30 81 | 94 82 | 77 83 | 40 84 | 125 85 | 47 86 | 27 87 | 38 88 | 166 89 | 86 90 | 26 91 | 23 92 | 67 93 | 127 94 | 28 95 | 16 96 | 169 97 | 13 98 | 92 99 | 106 100 | 57 101 | 118 102 | 126 103 | 83 104 | 146 105 | 29 106 | 130 107 | 53 -------------------------------------------------------------------------------- /inputs/day11.txt: -------------------------------------------------------------------------------- 1 | L.LLLLLLLLLL.LLLLLLLLL.LLLLLLLLL.LLL.LL.LLLLLLLLL.LLLLLL.LLLL.LL..LLLL.LLLL.LLL.LL.LLLLLLL 2 | .LLLL.L.LLLLLLL.LLLLLLLLLLLLLLL..LLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLLL.LLLLLLLLLLLLLL 3 | LLLLLLLL.LLL.LLLL.LLLL.LLLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLL.LLLLLLLLL.LLL.LLLL.LLLLLLLLLLLLLL 4 | LLLLL..LL.LL.LLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLL 5 | LLLLL.L.LLLLLLLL.LLLLL.LLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLL.LLLLL.LLLLLLLLLLLLLLLLLLL 6 | LLLLL..L..L.L........L....L.L..LLL...L....L.....L...L..L.....LLL.L..L..LLL...L.LLL...L..L. 7 | LLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLL.LLLLLL.LL.LLLLLL.LLLLLLL.LLLLL.LLLL.LLLLLLLLLLLLLL 8 | LLLLL.LLLLLL.LLLLLLLLLLLLLLLLLL..LLLLLL.L.LLL.LLLLLLLLLLLLLLLLLL..LLLL.LLLL.LLLLLL.LLLLLLL 9 | LLLLL.LLL.LLLLLLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLL.LL.LLLLLLLLLLLLLL 10 | LLLLLLLLLLLLLLLLLLLLLL.LLLLLLLL..LLLLLL.LLLLLLLLLL.LLLLL.LLLLLLLLLLLLL.LLLL.LLLLLL.L.LLLLL 11 | LLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLL.LLL..LL.LL.LLLLLLLLLLLLL.LLLLL.LLLL.LLLLLL.LLLLLLL 12 | LLLLL.LLLLL..LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL..LLLLLL.LLLLL.LLLL.LLLLLLLLLLLLLL 13 | LLL.LLLLLLLL.LLLLLLLLLLLLLLLLLLL.LLLLLL.LLLLLL.LL.LLLLLL.LL.LLLLLLLLLLLLLLL.LLLLLL.LLLLLLL 14 | .L.LL..LL.LLL...L....L..L....LLL...LL.L.L......L.....................LLLL.....L..LLL.L..L. 15 | LLLLLL.LLLLL.LLLLL.LLL.LLLLLLLLL.LLLLLL.LLLLLL.LL.LLL.LL.LLLL.LLLLLLLL.LLLLLLLLLLL.LLLLLLL 16 | LLLLLLLLLLLL..L.LLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLL 17 | LLLLLLLLLLLL.LLL.LLLLL.LLLLLLLLL.L.LLL..LLLLLLLLL.LLL.LL.LLLLLLL.LLLL..LLLL..LLLLLLLLLL.LL 18 | LLLLL.LLLLLL.LL.LLL.LL.LLLLLL.LL.LLLLLL.LLLLLLLLL.LLLLLL.LLLLLL..LLLLL.LLLL.LLLLLLLLLLLLLL 19 | ..L...LLL..L.......L..LL.LLL........L..L..LLL..L.L.LLL..LL....LL.L.L...LLL...LLL..LL.L...L 20 | LLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLL.L.LLLLLLLLLLL.LLLL.LLLLLLLLLLLLLL 21 | LLLLLLLLLLL..LLLL.LLLLLLLLLLLLLL.LLLLLLLLL.LLLLL..LLLLLL.LLLLLLL.LLLLL.LLLL.L.LLLLLLLLLLLL 22 | LLLLL.LLL.LLLLLLLLLLLL.LLLLLL.L..LLLLL..LLLLLLLLL.LLLLLL.LLLLLLL.LLLLL.LLLLLLLLLLL.LLLLLLL 23 | LLLLL.LLLLLLLLL.LLLLLL.LLLLLLLLLLL.LLLLLLLLLLLLLL.LLLLLL.LLL.LLL.LLLLL.LLLL.LLL.LL.LL.LLLL 24 | LLLLL.LLLLLL.LLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLL.L.LLLL.LLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLL 25 | LLLLL.LLLLLL.LLLLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLLLLL.LLLL.LLLLLLL.LLLLL.LLLLLLLLLLLLLL.LLLL 26 | LLLLL.LLLLLL.LLLLLLLL..LLL.LLLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLL.LLLLLLLLLLL.LLLLLLL 27 | LLLLL.LLLLLL..LLLLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLL.LLLLLL.LLLLLLLLLLLLLLLLLL.LLLLLL.LLLLLLL 28 | ..L..L......L.L...L.....L....L..L.L..L.LL.LLLLL....LL...L.L.LL....L..L..L..............LL. 29 | LLLLLLLLLLL..LLLLLLLLL.LL.LLLLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLL. 30 | LLLLLL.LLLLL.LLLLLLLLLLLLL.LLLLL.LLLLLL.LLLLLLLLL.LLLLLLLLLLLL.LLLLLLL.LLLLLLLLLLL.LLLL.LL 31 | LLLLL.LLLLLLLLLLLLLLL..LLLLLLL.L.LLLLLL.LLLLLLLLLLLLLLLLLL.LLLLLL.LLLL..LLL.LLL.LL.LLLLLLL 32 | LLLLL.LLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLL.LLLL.LLLLLL.LLLLLLL 33 | LLLLL.LL.LLL.LLLLLLLLL.LLLLLL.LLLLLLLLL.LLLLLLLLL.L.LLLLLL.LLLLLLLLLLLLLLLL.LLLLLL.LLLLLLL 34 | L.......L...........L..L.....L.L.L.....L...L.....LL...........L..L.....L.....LL......L.... 35 | LLLLL.LLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLL.LLLLLLL 36 | LLLLL.LLLLLL.LLLLLLLLL.LLL.LLLLLLLLLLLL.LL.L.L.LLLLLLLLLL.L.LLLL.LLL.LLLLLLLLLLLLL.LLLLLLL 37 | LLLLL.LLLLLL.LLLLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLL.LLLLLLL.LLLLL.LLLL.LLLLLL.LLLLLLL 38 | LLLL..LLLLLL.LLLLLLLLLLLLLLLLLLL.LLLLLL.LLLLLLLL.LLLLLLL.LLLLLLL.LLLLL.LLLL.LLLLLLLLLLLLLL 39 | LLLLL.LLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLL.LLLL.LLLLLLLLLLL.LLLLLLL.LLLLLLLLLL.LLLLLL.LLLLLLL 40 | .L..L...L.......L....L.....L...........LLLLLL.L...L..L.L....L.LLL...LL......LL.L..L.LL..L. 41 | LLLLL.LLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLLLLLL.LLL.LLLLLLLLLLLLL.LLLL.LLLLLL.LLLLLLL 42 | LLLLL.LLLL.L.LLLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLL.LL.LLLLLL..LLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLL 43 | LLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLL.L.LLL.LLLLLLL.LLLLL 44 | LLLL.LL.LLLL.LLLLLLLLLLLLLLLLLLL.LLLLLL.LLLLLLLLLLLLL.LL.LLLLLLL.LLLLLLLLLL.LLLLLLL.LLLLLL 45 | LLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLLLLL.LLL..L.LLLLLL.LLLLLLL 46 | LLLLLLLLLLLLLLLLLLLL.L.LLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLL..LLLLLLLLLLLLL.LLLL.LLLLLL.LLLLLLL 47 | L.LLL.LLLLLL.LLLLLLLLL.L.LLLLLLL..LLLLL..LLLLLLLLLLLLLLL.LLLL.LL.LLLLL.LLLL.LLLLLL.LLLLLLL 48 | LLLLL.L.LLLL.LLLLLLLLLLLL.LLLLLL.LLLLLL.LLLLLLLLL..LLLLLLLLLLLLL.LLLLL.LL.L.LLLLLL.LL.LLLL 49 | LLLLL.LLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLL.LLLL.LLLLLL.LL.LLLL 50 | L..L.L.LL.LLL..LLL.L.L.......L...L.LL...L..L.L......L....L.....L..L....L....LL.L.......... 51 | LLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLLL.LLLLLL.LLLLLLL 52 | LLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLL.LLLLLL.LLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLL.L.LLLLLLL 53 | LLLLLLLLLLLL.LL.LLLLLL.LLLLL.LLL.LLLLLLLLLL.LLLLLLLLLLLL.LLLL.LL.LLLLL.LLLL.LLLLLL.LLL.LLL 54 | LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLL.LLLLLLLLL.LLL.LLLLLLLLLLLLLLL..LLLL.LLLLLLLLLLLLLL 55 | LLLLL.LLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLL.LLLLLLLLLLLLL.LLLL.LLLLLL..LLLLLL 56 | LLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLLL.L.LLLL.LLLLLL..LLLLL.LLLL.LLLLLLLLL.LLLL 57 | .......L....L....L.L....L.LLLL......L.L............L....L..L..L..L.LLL..L.LLLL.LL..L....L. 58 | LLLLL.LLLLLL.L.LLLLLLL.LLLLLLLLL.LLLLLL..LLLLLLLL.LLLLLL.LL.L.LLLLLLLL.LLLL.LLLLLL.LLLLLLL 59 | LLLLL.LLLLLL..LLLLLLLLLLLLLLLLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLLLLLLL.LLL..LLLLLLLLLLLLLL 60 | LLLLL.LLL.LL.LLLLLLLL.LLLLLLLLLL.LLL.LLLLLLLLLLLL.LLLLLLLLLLLLLL..LLLLLLLLLLLLLLLLLLLLLLLL 61 | L.LLL.LLLLLL.LLLLLLLLL.LLLLLL.LL.LLLL.L.LLLLLLLLL.LLL.LLLLLLLLLL.LLLLL.LLL.LLLLLLLLLLLLLL. 62 | LLLLLLL.LLLL.LLLLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLLL.LL.LLL.LLLLLLL.LLLL.LLLLLLLLLLLL.LLLLLLL 63 | LLLLL.LLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLLLLLLL.LLL.LLLL.LLLLL.LLLL 64 | LL...L..LL........L...LL....L.LL..L.........LL..L...L..L.L...L.L.LL..L.L....LL....LL.....L 65 | LLLLL.LLLLLL.LLLLLLLL..LLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.L.LLLLLLLLLLLL 66 | LLLLL.LLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLLLLLLL.LLLL.LL 67 | LLLLL.LLLLLL.LLLLLLLLL.LLLLL.LLL.LLLL.L.LLLLLLLLLLL.LLLL.LLLLLLL.L.LLL.LLLLLLLLLLL.LLLLLLL 68 | LL.LL.LLLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLL.LL.LLLLLL.LLLLLL.LLLLLLLLLLLLLLL.LL.LLLLLL.LLL.LLL 69 | LLLLLLLLLLLL.LLLLLLLLL.LL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLL.LLL.LLLLLL.LLLLLLL 70 | LLL.L.L.LLLL.LLLLLLLLLLLLLLLLLLL.L.LLLLLLLLLLLLLL.LLLLLL.LLLLLLLLLLLLL..LLL.LLLLLL.LLL.LLL 71 | L.LL..L.L.L...L......L...L.......L.L.LL.....L.........L....L.......L.LL....L..L.L...L....L 72 | LLLLL.LLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLLLLLLL..LLLLLLLLLLLLLL.LLLL.LLLLLLLLLLLLLLL 73 | LLLLL..LLLLL.LLLLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLL.LLL.LLL.LLLLLLLLLL.LLLLLL.LLLLLLL 74 | LLLLLLLLLLLL.LLLLLLLLL.LLLL.LLLL.LLLLLL.LLLLLLLLL.LLLL.L.LLLLLLL.L.LLL.LLLL.LLLLLL.LLL.LLL 75 | LLLLLLLLLLLL.LLLL.LLLLLLLLLLLLL..LLLLLLLLLLLLLLLL.LLLLLL.LLLLLLL.LLLLL.LLLL.LLLLLL.LLLLLLL 76 | LLLLL.LLLLL..LLLLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLL.L.LLLLLLLLLLLLLLLL.LLLLLL.LLLLLLL 77 | LLLLL.LLLLLL.LLLLLL.LL.LLLLLLLLLLLLLLLL..LLLLLLLL.LLLLLLL.LL.LLLLLLLLL.LLLL.LLL.LLLLLLLLLL 78 | LLLLL.LLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLL.LLLLL.LLL.LLLLLL.LLLLLL..LLLLL.LLLL.L.LLLL.LLLLLL. 79 | LLLLL.LLLLLLLLLLLLL..L.LLLLLLLLL.LLLLLL.LLL.LLLLL.LLLLLL.LLLLLLL..LLLL.LLLLLLLLLLL.LLLLLLL 80 | LLLLL.LLLLLL.LLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLL.LLL.LLL.LLLLLLLLLL.LLLLLLLLLLLLLL 81 | .LL...L...........LL...LLL.L.L.L.L...L.L.....LLLLLL..........L.L.L.L.L...L.L.L.L........L. 82 | LLLLLLLLLLLL.LLLLLLLLL..LLLLLLLL.L.LLLLLLLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLLL.LLLLL..LLLLLLL 83 | L.LLL.LLLLLL.LLLLLLLLL.LLL.LLLLL.LLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLLLLLLL.LLLLLLLLLLL.LLLLLL. 84 | LLL.LLLLLLLL.LL.LLLLLL.L.LLLLLLL.LLLLLLLLLL.LLLLLLLLLLLL.LLLLLLL.LLLLL.LLLL.LLLLLLLLLLLLLL 85 | LLLLLLLLL.L.LLLLLLLLLL.L.LLLLLLL.LLLL.L.LLLLLLLLLLLLLLLLLLLLL.LL.LLLLLLLLLL.LLLL.LLLLLLLLL 86 | LLLLL.LLLLLLL.LLLLLLL..LLLL.LLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLL.LLLL.L.LLLLLLLLLLL. 87 | LLLLL.LLLLLLLLLLLLL.LLL.LLLLLLLLLLLLLLLLLLLLLLLLL.LLL.LL.LLLLLLL.LLLLLLLLLL.LLLLLL.LLLLLLL 88 | .LLLL.LLLLLL.LLLLLLLLLLLLLLL.LLL.LLLLLL.LLLLLLL.L.LLLLLLLLLLLLLL.LLLL..L.L..LLLLLL.LLLLLLL 89 | LLLLL.LLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL.L.LLLLLL.LLLLLLLLLLLLL.LLLL.LLLLLL.LLLLLLL 90 | LLLLL.LLLLLL..LLLLLLLL.LLLL.LLL.LLLLLLL.LLLLLLLLL.LL.LLL.LLLLLLLLLLLLL.LLLLLLLLLLL.LLLLLL. 91 | LLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLL.LLLLLLL.LLLLL.LLLL.LLLLLL..LLLLLL 92 | LLLLL.LLLLLL.LLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLL..LLLLL.LLLLLL.LLLLLLLLLLLL.LLLLLLLLLLLLL 93 | L.LLL.LLLLLL.LLLLLLLLL.LLLLLLLLL.L.LLLLLLLLLLLLLLLLLL.LL.LLLLLLLLLLLLLL.LL..LLLLLL.LLLLLLL -------------------------------------------------------------------------------- /inputs/day12.txt: -------------------------------------------------------------------------------- 1 | F92 2 | R180 3 | S1 4 | F64 5 | R90 6 | S1 7 | E1 8 | F11 9 | N4 10 | R180 11 | S3 12 | E3 13 | F55 14 | R90 15 | N1 16 | E4 17 | L180 18 | F9 19 | N3 20 | R90 21 | W4 22 | N4 23 | F36 24 | L90 25 | F50 26 | E3 27 | F9 28 | E5 29 | S1 30 | W2 31 | E4 32 | R180 33 | N3 34 | F18 35 | N2 36 | S5 37 | W1 38 | F41 39 | E3 40 | N4 41 | F66 42 | R270 43 | F22 44 | N5 45 | E4 46 | N1 47 | L90 48 | W1 49 | N1 50 | R90 51 | F87 52 | E1 53 | N4 54 | E1 55 | L90 56 | E5 57 | L180 58 | F84 59 | S5 60 | F65 61 | N2 62 | W1 63 | F65 64 | N3 65 | L90 66 | R90 67 | E1 68 | L180 69 | S1 70 | F60 71 | E3 72 | L90 73 | F22 74 | E5 75 | F32 76 | S1 77 | L90 78 | E2 79 | S2 80 | W5 81 | N2 82 | E5 83 | F60 84 | L180 85 | W3 86 | F49 87 | S5 88 | F84 89 | N5 90 | F78 91 | W5 92 | S3 93 | L90 94 | S3 95 | F83 96 | L90 97 | E1 98 | L90 99 | E1 100 | F99 101 | W1 102 | L90 103 | W2 104 | L90 105 | S1 106 | R180 107 | F8 108 | E2 109 | R180 110 | N2 111 | F66 112 | N5 113 | L90 114 | E1 115 | F76 116 | W3 117 | F23 118 | F79 119 | N3 120 | E1 121 | R90 122 | N5 123 | F33 124 | N2 125 | L180 126 | F97 127 | R90 128 | L90 129 | S5 130 | F99 131 | W5 132 | L90 133 | F47 134 | L90 135 | E4 136 | F99 137 | S4 138 | R90 139 | E2 140 | S2 141 | L90 142 | F33 143 | E2 144 | F71 145 | R90 146 | N1 147 | N2 148 | W3 149 | L90 150 | W4 151 | S1 152 | R90 153 | F27 154 | L270 155 | W5 156 | F49 157 | W3 158 | F41 159 | L90 160 | F23 161 | L90 162 | S1 163 | F11 164 | L90 165 | W3 166 | N1 167 | W4 168 | L90 169 | N4 170 | W2 171 | L90 172 | S3 173 | W4 174 | L180 175 | W4 176 | R180 177 | W4 178 | F49 179 | E3 180 | S2 181 | F64 182 | S4 183 | F61 184 | E3 185 | L180 186 | W1 187 | N2 188 | W2 189 | F64 190 | R90 191 | S4 192 | E5 193 | N1 194 | L270 195 | E3 196 | F22 197 | E2 198 | R90 199 | S5 200 | F57 201 | N2 202 | F78 203 | L270 204 | W1 205 | N4 206 | L90 207 | S4 208 | F71 209 | S2 210 | L90 211 | E1 212 | L180 213 | F4 214 | N1 215 | W4 216 | L90 217 | N5 218 | F98 219 | N3 220 | L90 221 | W2 222 | L180 223 | F54 224 | W1 225 | R90 226 | W3 227 | F67 228 | L90 229 | W2 230 | R180 231 | F79 232 | N4 233 | F30 234 | L90 235 | N4 236 | R180 237 | L90 238 | S5 239 | F7 240 | N2 241 | F26 242 | S5 243 | F43 244 | E3 245 | N3 246 | L180 247 | F57 248 | W4 249 | L90 250 | E5 251 | F100 252 | S2 253 | F86 254 | L180 255 | W3 256 | S5 257 | W1 258 | S3 259 | L180 260 | S2 261 | S5 262 | W4 263 | L90 264 | F73 265 | R90 266 | F14 267 | E2 268 | F99 269 | R90 270 | R90 271 | E5 272 | N1 273 | R90 274 | N1 275 | N4 276 | R180 277 | S4 278 | L90 279 | F98 280 | W2 281 | L90 282 | F100 283 | R180 284 | W4 285 | F92 286 | E1 287 | L180 288 | S3 289 | F94 290 | E4 291 | N5 292 | R90 293 | S3 294 | W4 295 | F86 296 | S5 297 | R90 298 | E2 299 | F6 300 | E2 301 | F75 302 | N1 303 | L90 304 | W4 305 | F2 306 | E1 307 | N4 308 | E1 309 | L90 310 | W4 311 | F17 312 | N2 313 | R90 314 | E5 315 | R90 316 | N1 317 | W1 318 | R180 319 | W4 320 | R180 321 | F97 322 | E5 323 | N2 324 | L90 325 | F27 326 | N1 327 | W5 328 | R90 329 | N1 330 | F98 331 | R90 332 | N2 333 | F12 334 | W5 335 | S1 336 | F86 337 | N3 338 | W3 339 | F71 340 | L180 341 | W1 342 | R90 343 | W3 344 | S4 345 | E2 346 | S5 347 | W3 348 | R90 349 | E4 350 | R90 351 | W1 352 | N3 353 | F11 354 | W4 355 | E4 356 | F67 357 | E2 358 | F15 359 | W5 360 | N4 361 | W1 362 | R90 363 | L90 364 | W4 365 | F16 366 | N4 367 | F87 368 | L180 369 | F73 370 | L180 371 | E5 372 | R90 373 | F96 374 | N5 375 | W1 376 | F28 377 | R90 378 | W5 379 | S3 380 | S3 381 | E5 382 | R180 383 | E4 384 | F4 385 | L90 386 | E3 387 | E4 388 | S5 389 | W3 390 | L180 391 | F57 392 | R90 393 | N2 394 | F78 395 | N2 396 | L90 397 | S1 398 | R90 399 | W4 400 | S1 401 | L90 402 | N5 403 | F60 404 | R90 405 | S4 406 | F42 407 | R90 408 | W2 409 | F31 410 | R180 411 | N2 412 | S2 413 | F91 414 | S4 415 | R90 416 | N2 417 | L180 418 | N1 419 | E4 420 | F72 421 | E3 422 | E3 423 | N2 424 | L90 425 | N1 426 | L90 427 | F83 428 | S1 429 | R90 430 | N5 431 | E4 432 | F53 433 | N3 434 | E5 435 | S3 436 | E4 437 | F93 438 | W2 439 | F53 440 | L90 441 | E2 442 | L90 443 | W2 444 | F96 445 | R90 446 | E3 447 | L90 448 | S5 449 | F31 450 | R90 451 | R90 452 | F98 453 | F91 454 | W2 455 | N3 456 | F69 457 | R90 458 | F51 459 | R90 460 | N1 461 | E2 462 | R90 463 | S1 464 | R180 465 | E5 466 | N5 467 | W5 468 | F34 469 | W1 470 | F60 471 | R90 472 | F53 473 | R90 474 | F62 475 | R90 476 | S4 477 | F95 478 | W5 479 | E2 480 | F84 481 | R90 482 | E2 483 | F54 484 | E2 485 | F5 486 | R90 487 | F32 488 | L90 489 | E2 490 | S2 491 | L180 492 | F31 493 | E2 494 | L90 495 | N5 496 | W2 497 | L90 498 | F53 499 | R90 500 | S1 501 | R90 502 | F49 503 | R90 504 | S3 505 | L90 506 | F76 507 | F31 508 | S1 509 | F13 510 | R90 511 | W1 512 | S1 513 | R90 514 | W2 515 | L180 516 | E2 517 | R90 518 | E2 519 | N1 520 | W1 521 | S1 522 | E1 523 | S4 524 | L90 525 | N2 526 | E2 527 | R90 528 | S4 529 | L90 530 | N5 531 | L90 532 | W4 533 | S2 534 | W1 535 | L90 536 | E4 537 | R90 538 | W2 539 | S1 540 | L90 541 | N5 542 | F63 543 | R90 544 | W1 545 | F20 546 | L90 547 | F86 548 | S4 549 | S4 550 | E2 551 | F92 552 | F90 553 | W4 554 | F94 555 | E1 556 | N5 557 | F30 558 | W3 559 | N3 560 | L180 561 | W5 562 | F52 563 | R270 564 | E5 565 | R90 566 | N4 567 | W4 568 | F10 569 | N1 570 | F16 571 | N1 572 | F31 573 | S4 574 | L90 575 | F81 576 | N1 577 | L90 578 | W2 579 | F84 580 | L90 581 | F79 582 | L90 583 | W5 584 | L90 585 | F90 586 | R90 587 | E2 588 | L90 589 | F25 590 | N5 591 | S1 592 | F12 593 | R90 594 | F34 595 | R90 596 | F4 597 | E4 598 | L90 599 | S1 600 | F70 601 | R90 602 | F22 603 | R90 604 | F67 605 | R90 606 | F40 607 | W1 608 | S3 609 | L180 610 | N2 611 | E4 612 | S4 613 | F98 614 | R180 615 | F16 616 | S2 617 | W4 618 | S1 619 | F70 620 | L90 621 | N3 622 | E3 623 | L270 624 | W4 625 | L90 626 | W5 627 | R180 628 | W5 629 | N4 630 | R90 631 | W4 632 | F5 633 | L270 634 | E3 635 | L90 636 | E5 637 | F50 638 | S3 639 | F51 640 | E1 641 | S5 642 | F95 643 | R90 644 | L90 645 | S2 646 | F75 647 | R90 648 | W2 649 | F70 650 | E2 651 | F52 652 | W4 653 | E1 654 | L180 655 | F72 656 | N2 657 | F5 658 | E2 659 | F94 660 | R180 661 | F7 662 | E3 663 | N2 664 | R90 665 | W1 666 | N4 667 | R90 668 | S1 669 | W4 670 | L270 671 | W1 672 | W1 673 | N2 674 | E1 675 | F31 676 | N1 677 | W4 678 | S5 679 | L90 680 | E1 681 | R180 682 | F50 683 | N1 684 | W2 685 | F66 686 | N2 687 | L90 688 | R90 689 | W1 690 | E5 691 | L90 692 | E2 693 | R180 694 | F63 695 | N4 696 | N3 697 | F87 698 | W4 699 | L90 700 | F85 701 | N3 702 | F93 703 | S2 704 | F95 705 | N5 706 | L180 707 | S3 708 | R90 709 | W5 710 | L180 711 | W1 712 | L90 713 | S4 714 | F68 715 | L180 716 | S4 717 | R180 718 | E2 719 | L180 720 | E3 721 | R180 722 | S5 723 | F88 724 | N1 725 | R90 726 | S3 727 | E5 728 | S5 729 | E1 730 | N5 731 | E2 732 | S1 733 | W5 734 | F62 735 | R90 736 | F39 737 | L180 738 | N3 739 | F42 740 | E4 741 | N5 742 | R90 743 | W5 744 | S2 745 | F43 746 | W4 747 | F94 748 | R90 749 | F85 750 | N5 751 | F7 752 | L180 753 | W4 754 | L180 755 | E4 756 | F44 757 | N2 758 | W2 759 | N3 760 | L180 761 | E3 762 | N1 763 | S2 764 | W4 765 | N5 766 | R180 767 | F78 768 | E5 769 | L90 770 | W4 771 | F77 -------------------------------------------------------------------------------- /inputs/day13.txt: -------------------------------------------------------------------------------- 1 | 1003055 2 | 37,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,41,x,x,x,x,x,x,x,x,x,433,x,x,x,x,x,x,x,23,x,x,x,x,x,x,x,x,17,x,19,x,x,x,x,x,x,x,x,x,29,x,593,x,x,x,x,x,x,x,x,x,x,x,x,13 -------------------------------------------------------------------------------- /inputs/day14.txt: -------------------------------------------------------------------------------- 1 | mask = 00000X110010111111X000100XX01010000X 2 | mem[20690] = 435 3 | mem[54036] = 231 4 | mem[27099] = 118644255 5 | mem[55683] = 22299263 6 | mem[26119] = 2279399 7 | mask = 00X000X0001X111111101X1111XX11X001XX 8 | mem[42072] = 1658073 9 | mem[63234] = 2277 10 | mask = 1001X010011011111110101101X0XX11X010 11 | mem[31090] = 52291 12 | mem[31244] = 377352406 13 | mem[10621] = 18801757 14 | mem[31666] = 5100853 15 | mask = 10X0110X11XX101XX1000011001001010100 16 | mem[18680] = 80608039 17 | mem[13197] = 7957847 18 | mem[17080] = 117501010 19 | mask = 1000110011111X11X1XXXX1X000X010011X1 20 | mem[25308] = 257586 21 | mem[14518] = 62108102 22 | mem[21633] = 1544993 23 | mem[36955] = 1363 24 | mem[45764] = 49755959 25 | mem[40967] = 425 26 | mem[47858] = 611686 27 | mask = 0010111010X0111111011X0110X0101010X1 28 | mem[7451] = 1208 29 | mem[31918] = 769 30 | mem[29313] = 1888678 31 | mem[52254] = 32237487 32 | mask = 00X001001111X11111X010000X0110XX0X11 33 | mem[61531] = 15796066 34 | mem[305] = 130785 35 | mem[25845] = 197912 36 | mem[29251] = 374061 37 | mem[37177] = 17950 38 | mask = 100100X00110111111100110001X1X100X00 39 | mem[40491] = 66538375 40 | mem[42244] = 240009051 41 | mem[18805] = 33518831 42 | mem[17072] = 518835559 43 | mask = XX100100X1101X11010001X11001100XX1XX 44 | mem[16935] = 1124623 45 | mem[45248] = 155461 46 | mem[37224] = 5755511 47 | mask = 00X011101110101X10X1XXX1100X0001000X 48 | mem[6440] = 116801 49 | mem[193] = 7318437 50 | mem[58568] = 8082803 51 | mem[43695] = 909697 52 | mem[29001] = 27290 53 | mem[29210] = 91241 54 | mask = XXX01X001111111111101010000001XX1011 55 | mem[21289] = 354401446 56 | mem[33814] = 1605382 57 | mem[16967] = 242083755 58 | mem[60470] = 22550 59 | mem[16485] = 3945104 60 | mem[37687] = 86474 61 | mem[51031] = 5255 62 | mask = 00100100111101111100100X0X001XX10011 63 | mem[34832] = 191857526 64 | mem[30126] = 180246093 65 | mem[310] = 1895 66 | mem[49300] = 117732 67 | mask = 00000100011011X11X10010XX1XX0X1101XX 68 | mem[54544] = 1368 69 | mem[30126] = 596855 70 | mem[18483] = 124319430 71 | mem[63246] = 95337119 72 | mem[3917] = 1620395 73 | mask = 00XX010001101111X110011X010100X10XX1 74 | mem[31090] = 203896198 75 | mem[36989] = 203 76 | mem[8762] = 372392 77 | mem[59728] = 486751 78 | mask = 00101X00X11X11111X100010XXXX0011011X 79 | mem[59728] = 30591660 80 | mem[43720] = 315507593 81 | mem[39732] = 42157 82 | mem[3440] = 242110717 83 | mem[36955] = 871544 84 | mem[51251] = 2489781 85 | mask = 00X00X0X01111111110000001100100X0011 86 | mem[51149] = 12451455 87 | mem[17566] = 351620601 88 | mem[33842] = 1119118 89 | mem[23677] = 100601411 90 | mem[12826] = 2474316 91 | mask = 00X00100XX1111111110111X1X010X10010X 92 | mem[43163] = 27012 93 | mem[53314] = 2717910 94 | mem[20842] = 239857 95 | mem[43816] = 3173699 96 | mem[11343] = 37315312 97 | mem[37493] = 262038 98 | mem[25824] = 13598271 99 | mask = 00X0X00001101X1X10100000110001110101 100 | mem[39732] = 1402 101 | mem[50014] = 32437274 102 | mem[10770] = 192187204 103 | mask = 000101110110X111111011010X11000000XX 104 | mem[51283] = 2490405 105 | mem[33814] = 471881 106 | mem[15119] = 3807095 107 | mask = 000X00XX0X10111111X0011XX11X10X00010 108 | mem[10405] = 46099021 109 | mem[42308] = 1001 110 | mem[57329] = 2310 111 | mask = 11X10110011XX100XX1010101100010X0000 112 | mem[40240] = 28185370 113 | mem[43296] = 2212 114 | mem[15632] = 3512122 115 | mem[61953] = 2534700 116 | mem[58797] = 258533 117 | mask = 00000X00011X1X11X1X001000010010X1110 118 | mem[13671] = 66116 119 | mem[5234] = 46868488 120 | mem[48068] = 259070 121 | mem[35833] = 1904 122 | mask = XX1101000XX01111X1100XX10X1000011000 123 | mem[58276] = 827 124 | mem[29197] = 6552 125 | mem[21249] = 173 126 | mem[5723] = 4730123 127 | mem[59627] = 3299104 128 | mem[17008] = 74955518 129 | mask = 0X000100111111XX11001000000110X00100 130 | mem[53231] = 909153 131 | mem[28837] = 1739162 132 | mem[21336] = 3932 133 | mem[32899] = 872661 134 | mem[29051] = 228916 135 | mask = 0X1X11000111111X101111100000X10X00XX 136 | mem[23121] = 4940 137 | mem[64259] = 339599819 138 | mem[268] = 2533 139 | mem[5725] = 1430 140 | mem[56946] = 618 141 | mask = 001X1X0001111111101001111001X101XX10 142 | mem[46780] = 339675 143 | mem[57420] = 10161 144 | mem[32105] = 5534 145 | mask = X1000X10011001111110110100X01010X011 146 | mem[47922] = 892051565 147 | mem[50583] = 2962439 148 | mem[43673] = 107 149 | mask = 000001001X11011111101X00XX1111100111 150 | mem[17938] = 29693823 151 | mem[27809] = 17197 152 | mem[62755] = 6590924 153 | mem[26483] = 15837 154 | mem[5245] = 486 155 | mem[8213] = 1239 156 | mask = 0010X0000XX11XX1100010X0X11000101XX1 157 | mem[3842] = 3541 158 | mem[55663] = 76779528 159 | mem[29851] = 2801 160 | mask = XX011X0001111111X1XX0000000001X00010 161 | mem[20066] = 97384 162 | mem[35212] = 10209 163 | mem[15847] = 499740 164 | mem[9349] = 9638367 165 | mask = 001011X00XXX11X111100X1XX00010100X01 166 | mem[52845] = 1056563 167 | mem[30126] = 13918626 168 | mem[17709] = 25538089 169 | mem[1413] = 459461 170 | mem[59577] = 52944410 171 | mask = X1011001X0XX111011100XX010101X01X010 172 | mem[56449] = 144 173 | mem[8753] = 984864 174 | mem[23728] = 173703761 175 | mem[34970] = 28269 176 | mem[32500] = 49931 177 | mask = X0000100111X11111110X10X0101001100X1 178 | mem[64582] = 6646737 179 | mem[37177] = 10 180 | mem[57474] = 313623 181 | mem[17322] = 147838906 182 | mem[28766] = 15110001 183 | mem[49] = 80836580 184 | mask = 001010000X11111X10X0X111X0XX00X100X1 185 | mem[53163] = 15243 186 | mem[61002] = 406400 187 | mem[28930] = 465647779 188 | mask = 0010000X11101111100010X00XX1XX01XX01 189 | mem[1315] = 625209 190 | mem[44187] = 14395 191 | mask = X0010XX0011011111110110X0101XX0X00XX 192 | mem[31859] = 95408 193 | mem[16534] = 121119590 194 | mem[26550] = 8188494 195 | mem[37302] = 407378 196 | mask = 001XX1XXX1111X1110100001X00000111001 197 | mem[37574] = 31364 198 | mem[26443] = 2676291 199 | mem[22192] = 26966115 200 | mask = 001X010X001X011110001101XXX0X101XX11 201 | mem[41368] = 50472035 202 | mem[25252] = 3850 203 | mem[21011] = 7912441 204 | mem[55890] = 2474497 205 | mask = 0010010000X11XX111X0101X100000101000 206 | mem[57489] = 10006848 207 | mem[7880] = 30889 208 | mem[54742] = 14408 209 | mask = 0010100X00X1X11X101000X1X00X001100XX 210 | mem[28474] = 137340532 211 | mem[57910] = 3261 212 | mem[35212] = 974067528 213 | mem[24595] = 15641 214 | mask = 0X0X01X00110X11111X0X001X1011010X101 215 | mem[1515] = 4597 216 | mem[20626] = 483632 217 | mem[50912] = 101611112 218 | mem[62450] = 463312 219 | mask = 00101X000X0111011110X10X10011X100001 220 | mem[5378] = 132014 221 | mem[13345] = 2058543 222 | mem[42684] = 2824 223 | mem[34576] = 6385683 224 | mem[27201] = 2519 225 | mem[9632] = 202081 226 | mask = X0X1010001X011X111100001001X01XX1XX1 227 | mem[1538] = 2389067 228 | mem[4972] = 19131 229 | mem[23129] = 256828081 230 | mem[17188] = 185346747 231 | mem[44295] = 143437003 232 | mem[44830] = 5686 233 | mem[46528] = 4177799 234 | mask = X0010010001X1111110011X011XX11X1X011 235 | mem[7033] = 2748 236 | mem[2431] = 17997007 237 | mem[13924] = 90861 238 | mem[63656] = 497878 239 | mem[61841] = 891 240 | mem[10405] = 6177 241 | mem[55811] = 43078384 242 | mask = X110XX0011111XX1X11001X000000001X000 243 | mem[62283] = 8553774 244 | mem[14788] = 308418 245 | mem[5878] = 2324 246 | mask = 0000010001101111101XX1X00001001101XX 247 | mem[23816] = 69720 248 | mem[29524] = 197631 249 | mask = 10X100100011X111110011010X0X10X10XX1 250 | mem[5288] = 1072 251 | mem[34681] = 1902 252 | mem[47529] = 1012160 253 | mem[42117] = 232642695 254 | mem[7153] = 420427964 255 | mem[23129] = 10261 256 | mem[24545] = 1661292 257 | mask = X1011X010XX0X1X1X010001001001X001111 258 | mem[3984] = 17460969 259 | mem[43208] = 1626 260 | mem[12288] = 3244 261 | mem[1261] = 685777140 262 | mem[35662] = 3875 263 | mem[13197] = 807702837 264 | mem[8450] = 39850899 265 | mask = 001X0X00011X11111000000110010X0XXX1X 266 | mem[35167] = 3384 267 | mem[1969] = 3362919 268 | mem[4732] = 99083530 269 | mem[58162] = 1382314 270 | mask = 10000X10011011X11010000X11X1X0010100 271 | mem[50583] = 4112 272 | mem[4097] = 907 273 | mem[45785] = 1275731 274 | mem[31108] = 7733 275 | mem[50267] = 2625942 276 | mask = X0010X1001X011111110110011000111X0X0 277 | mem[35870] = 1100551 278 | mem[8514] = 8042956 279 | mem[10848] = 96032 280 | mem[44678] = 213384 281 | mem[25743] = 3586812 282 | mem[34074] = 991022 283 | mask = X010X1001111X1111110010X000011000011 284 | mem[61953] = 3703 285 | mem[41415] = 250960289 286 | mem[24262] = 14129393 287 | mask = 000X010XX11011X111100100110X001000X0 288 | mem[51393] = 320156165 289 | mem[27955] = 21751009 290 | mem[61468] = 8941693 291 | mem[24188] = 176466079 292 | mem[10717] = 2950 293 | mask = 0010XX00X11110101000X0110000X101X100 294 | mem[37149] = 18981413 295 | mem[12384] = 479738 296 | mem[17072] = 5196 297 | mem[59325] = 170080 298 | mem[3269] = 86268393 299 | mem[48598] = 18530 300 | mem[11287] = 4082 301 | mask = 0X101100X11X11111X10X0X01000X1110010 302 | mem[47267] = 12410 303 | mem[8609] = 6923289 304 | mem[28364] = 23091829 305 | mem[63780] = 858 306 | mem[21558] = 48929393 307 | mem[46110] = 74033138 308 | mask = 001011X0011111111010X10100X10X000011 309 | mem[30364] = 14013071 310 | mem[23121] = 5777 311 | mem[54108] = 11707710 312 | mask = 0010XX00X11X11111XX010X00X000X010011 313 | mem[29453] = 3480476 314 | mem[7516] = 869816189 315 | mem[57136] = 130673464 316 | mem[8609] = 2000 317 | mem[45543] = 1014823 318 | mem[3249] = 75 319 | mem[14460] = 18422415 320 | mask = 000X011000111X1X111010X0X10X11X10011 321 | mem[14556] = 7853751 322 | mem[29755] = 535169084 323 | mem[24262] = 4027 324 | mem[34051] = 13187123 325 | mask = 000X011X0X1X1111X110000000XX0000X11X 326 | mem[13879] = 2383 327 | mem[57329] = 749 328 | mem[54544] = 3055190 329 | mask = 00110XX00111111X10010001XX1000101000 330 | mem[4852] = 429814346 331 | mem[55439] = 7610 332 | mem[31685] = 811508716 333 | mem[38296] = 185763 334 | mem[16482] = 3668 335 | mem[47529] = 3803 336 | mask = X01011000111111X1011010101101X011X01 337 | mem[58499] = 851439 338 | mem[38516] = 3082 339 | mem[32500] = 364520 340 | mask = 001X110001111X10X000001011X001000101 341 | mem[44653] = 157371860 342 | mem[2226] = 58088617 343 | mem[10098] = 67459 344 | mem[45739] = 3994 345 | mem[4180] = 206930963 346 | mask = 001XX0000XX1111010X00011000001011011 347 | mem[53876] = 843104 348 | mem[56118] = 1019 349 | mem[39503] = 6758 350 | mem[24134] = 9483199 351 | mem[25914] = 26956 352 | mem[10098] = 63837172 353 | mem[40642] = 2366588 354 | mask = 0XX10X1001X1111X1X101010010XX01000X0 355 | mem[16432] = 17158914 356 | mem[29927] = 9292527 357 | mem[57922] = 24395252 358 | mem[48327] = 253 359 | mem[15450] = 496726 360 | mem[57027] = 518857449 361 | mask = 0101XXX0011X11111110X0XX01X010000111 362 | mem[39393] = 570 363 | mem[38893] = 21253926 364 | mask = 0010010X01XX1X1101100000010100110101 365 | mem[64325] = 416581774 366 | mem[26376] = 1666947 367 | mem[6276] = 90042 368 | mask = 0X00001101101111X11X010010XX1X1XX01X 369 | mem[20354] = 2180 370 | mem[50761] = 7237731 371 | mem[54710] = 5718 372 | mem[43883] = 2618938 373 | mem[59235] = 22130448 374 | mem[59325] = 14410783 375 | mask = 00000001X0101X11X110101001X11100X0X1 376 | mem[24262] = 10756242 377 | mem[59282] = 296121 378 | mem[15931] = 49 379 | mem[44067] = 339152264 380 | mem[22192] = 2750756 381 | mem[897] = 639 382 | mask = 001011X011111X1110X01X01X0XX0101X101 383 | mem[21410] = 5056 384 | mem[43472] = 198924166 385 | mem[50343] = 5363196 386 | mem[7486] = 773744 387 | mem[49418] = 77311216 388 | mask = 001X0000011011111X00000X1011X1X01XX0 389 | mem[19633] = 5522082 390 | mem[4682] = 51724569 391 | mem[36252] = 260 392 | mask = 001011X0111X1X1110XX000X100001X100X0 393 | mem[34373] = 803 394 | mem[61841] = 25585959 395 | mem[29051] = 2011 396 | mem[53885] = 4255251 397 | mem[55135] = 49781551 398 | mem[11748] = 5712 399 | mask = 000001000X1011111110X11X0XX11101100X 400 | mem[28073] = 257781932 401 | mem[32292] = 7788 402 | mem[47529] = 21491591 403 | mem[26354] = 3991 404 | mem[46496] = 225777 405 | mem[19054] = 6818 406 | mem[46391] = 1804050 407 | mask = 0X01X1110011111101X011X1X10010011100 408 | mem[8848] = 3301953 409 | mem[21325] = 828483041 410 | mem[35954] = 393891988 411 | mask = 001010XX11X0X11X1010001000001111X1X1 412 | mem[14556] = 48978 413 | mem[17078] = 3023995 414 | mem[41895] = 1263 415 | mem[26354] = 982 416 | mem[47494] = 9997 417 | mem[42458] = 139205796 418 | mask = 01011X0X01XX11X11X10001X010X10001100 419 | mem[30326] = 230268 420 | mem[13671] = 406 421 | mem[13219] = 816366 422 | mask = 00X0111000101101XX10X010X100X0101X01 423 | mem[9172] = 5603 424 | mem[10540] = 399 425 | mem[6994] = 2969 426 | mem[41827] = 157730 427 | mem[57564] = 713362 428 | mem[16823] = 335722 429 | mem[38893] = 724 430 | mask = X1X10110011111X01X101X111101X0X1X000 431 | mem[5336] = 623 432 | mem[31859] = 88241437 433 | mem[7282] = 19257561 434 | mem[37684] = 5467271 435 | mem[50354] = 2120264 436 | mask = 0000X100111X1111X1X001X0000X00110001 437 | mem[61468] = 9124391 438 | mem[35212] = 23096803 439 | mem[9949] = 9454 440 | mem[1331] = 995 441 | mem[39238] = 74423 442 | mask = 00100100111X1111111011X1XX010X1X0010 443 | mem[39294] = 114968517 444 | mem[23155] = 1708 445 | mem[29927] = 7693420 446 | mem[26742] = 2017 447 | mask = 001001001X101111X1X0XX01100X0X0101XX 448 | mem[29056] = 30646 449 | mem[59210] = 113022 450 | mem[43000] = 144138476 451 | mem[35167] = 721 452 | mem[30809] = 507151422 453 | mask = 0001X0100101111010X0100000X0X0100010 454 | mem[34554] = 49221 455 | mem[7437] = 62877 456 | mem[59828] = 184498 457 | mem[45586] = 20089049 458 | mem[48248] = 98197865 459 | mem[44772] = 113026522 460 | mask = 00X0X000111X11111010X10X1011010X0X01 461 | mem[40499] = 11427785 462 | mem[60906] = 496319403 463 | mem[55126] = 270707060 464 | mask = 001XXXX10011X1111000110X0X000XX10001 465 | mem[17938] = 535040 466 | mem[59138] = 250862772 467 | mem[8507] = 41576622 468 | mem[14146] = 1026 469 | mem[32774] = 2975 470 | mem[39952] = 440004 471 | mem[13671] = 2552 472 | mask = 00000100X110111X111001X0X10X0XX100X1 473 | mem[43163] = 1156 474 | mem[35680] = 6039549 475 | mem[15378] = 657 476 | mem[52635] = 15396 477 | mem[25926] = 210 478 | mem[28827] = 206264701 479 | mask = 001X100X001X1111100011X1XX1000100X01 480 | mem[5753] = 1286 481 | mem[6271] = 6375 482 | mem[47122] = 5264524 483 | mask = 0X01100XXX10111X1X100X10000X1000001X 484 | mem[51736] = 2480 485 | mem[16722] = 663122146 486 | mem[18483] = 119830 487 | mem[13423] = 136699070 488 | mem[65442] = 23484946 489 | mem[50742] = 716 490 | mem[14788] = 129808 491 | mask = 100100000X101111111001000101X00X01X0 492 | mem[35279] = 11923915 493 | mem[12886] = 216539704 494 | mem[29197] = 258471 495 | mem[34051] = 24342647 496 | mem[34556] = 219870381 497 | mask = 0010X100011011X11110X1101X010X1001X1 498 | mem[17497] = 684 499 | mem[8762] = 255129 500 | mem[44486] = 49869056 501 | mem[35680] = 210517 502 | mem[18805] = 17289 503 | mask = 001011101X1011111X01111010001000XX01 504 | mem[31918] = 89826257 505 | mem[31090] = 57962 506 | mem[53807] = 2817 507 | mem[12784] = 2137 508 | mem[31369] = 64658 509 | mask = X000X1X0011011111010X0X111XX00X1X100 510 | mem[63989] = 3267 511 | mem[23677] = 2600 512 | mem[42781] = 125518 513 | mem[37480] = 3172 514 | mem[23573] = 8287963 515 | mask = 0010110001111XXX10XX0X1X0X0000010100 516 | mem[1654] = 317418946 517 | mem[46425] = 459126 518 | mem[31666] = 9190945 519 | mem[12079] = 168185843 520 | mem[39256] = 178728 521 | mem[52287] = 59458806 522 | mask = 000001000110111X1010X00000X100110X00 523 | mem[55820] = 2071 524 | mem[33429] = 821261571 525 | mem[16244] = 3215 526 | mask = 100110100110X1111110X01101X1XX10X011 527 | mem[47796] = 98 528 | mem[31040] = 1031334 529 | mem[9622] = 1580517 530 | mask = 00100X001110XX11110000011101X0011001 531 | mem[42781] = 312404 532 | mem[39942] = 123252858 533 | mem[20867] = 1356 534 | mem[14667] = 576 535 | mem[35502] = 298476332 536 | mem[53427] = 365745 537 | mask = 00010X100110111111100010XX00XX000100 538 | mem[53876] = 603517 539 | mem[10405] = 16459102 540 | mem[45543] = 4443 541 | mem[41543] = 1411 542 | mem[62450] = 6470215 543 | mask = 100X110X11111X110X0010000X0X10001X10 544 | mem[5336] = 650575 545 | mem[50124] = 3080229 546 | mem[51618] = 156 547 | mem[42185] = 1366 548 | mask = 00X0X1101110101110XX1011X001001110X0 549 | mem[30736] = 333574460 550 | mem[13675] = 8643742 551 | mem[12826] = 453315 552 | mask = 000X00100X1X1X111XX0101X0X100111000X 553 | mem[54995] = 183737953 554 | mem[63234] = 679 555 | mem[61488] = 337 556 | mask = 0XX11111X0111X1X01001111X00X11001XX1 557 | mem[10621] = 122118726 558 | mem[6109] = 9210 559 | mem[15688] = 184799 560 | mem[25564] = 367237 561 | mask = 00110000011X1111100X000X00XXX1XX1000 562 | mem[17938] = 33020705 563 | mem[2666] = 88651117 564 | mem[21482] = 161753 -------------------------------------------------------------------------------- /inputs/day15.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joelgrus/advent2020/ef4609d0aaf631834d595da79b0d5dccb2bc51fa/inputs/day15.txt -------------------------------------------------------------------------------- /inputs/day16.txt: -------------------------------------------------------------------------------- 1 | departure location: 27-180 or 187-953 2 | departure station: 47-527 or 545-958 3 | departure platform: 36-566 or 572-973 4 | departure track: 37-497 or 505-971 5 | departure date: 47-707 or 719-969 6 | departure time: 36-275 or 290-949 7 | arrival location: 31-855 or 864-955 8 | arrival station: 50-148 or 158-949 9 | arrival platform: 50-441 or 467-965 10 | arrival track: 30-648 or 659-962 11 | class: 26-470 or 481-966 12 | duration: 27-808 or 818-958 13 | price: 49-769 or 784-970 14 | route: 49-796 or 809-964 15 | row: 42-362 or 383-971 16 | seat: 34-877 or 887-952 17 | train: 31-354 or 363-950 18 | type: 39-208 or 231-953 19 | wagon: 47-736 or 746-968 20 | zone: 44-290 or 310-974 21 | 22 | your ticket: 23 | 97,61,53,101,131,163,79,103,67,127,71,109,89,107,83,73,113,59,137,139 24 | 25 | nearby tickets: 26 | 93,566,873,796,908,899,408,393,621,571,546,549,494,631,940,491,561,108,395,258 27 | 609,949,551,408,648,723,627,428,905,665,248,557,630,169,494,583,680,658,677,385 28 | 52,162,200,939,70,636,569,940,187,50,683,612,610,317,918,550,271,917,434,525 29 | 869,266,108,172,338,615,791,824,117,191,623,838,108,174,169,164,207,238,867,569 30 | 495,939,525,545,420,945,657,66,142,147,245,98,262,314,428,524,523,385,610,124 31 | 648,512,273,820,514,83,146,670,911,855,331,637,729,409,240,344,316,201,498,63 32 | 480,854,320,389,509,660,312,678,117,411,99,134,491,854,854,688,336,670,141,334 33 | 925,405,791,599,831,853,208,587,584,271,563,754,822,66,910,186,701,623,633,483 34 | 942,873,424,675,414,667,163,172,413,85,518,830,598,680,371,694,235,238,948,576 35 | 398,627,429,899,942,92,82,172,805,389,523,408,849,335,199,119,581,789,195,520 36 | 749,729,640,134,644,720,75,946,728,91,786,333,267,596,898,379,188,667,623,273 37 | 117,235,948,240,412,178,552,60,289,790,564,240,684,684,505,829,319,793,662,587 38 | 191,680,135,415,661,757,590,829,650,643,634,314,115,167,546,904,666,939,233,522 39 | 576,722,272,492,481,79,864,343,749,244,131,398,382,677,481,407,160,199,424,491 40 | 340,616,602,847,431,607,704,560,678,914,667,748,754,651,627,785,338,316,60,888 41 | 163,62,726,431,902,588,240,678,161,708,71,160,935,432,159,338,122,312,633,418 42 | 892,825,112,144,326,99,257,877,495,54,868,684,342,316,883,672,841,631,790,256 43 | 867,254,169,514,421,184,53,468,932,169,496,526,113,627,441,239,623,60,672,386 44 | 495,471,831,557,846,251,491,921,915,395,438,595,681,76,597,845,103,573,638,108 45 | 634,876,705,69,670,484,608,203,896,753,196,252,304,913,769,613,238,147,118,419 46 | 168,345,410,401,491,95,588,160,898,51,352,640,328,325,56,519,628,168,568,827 47 | 870,894,707,98,57,701,329,692,594,140,948,927,902,682,489,707,616,355,912,90 48 | 469,202,470,147,787,91,406,69,52,750,419,548,137,315,660,249,929,509,9,892 49 | 441,63,550,88,433,893,619,891,659,690,261,699,786,546,358,174,346,820,259,395 50 | 348,672,467,641,687,254,433,343,644,132,158,332,422,313,131,925,644,13,892,240 51 | 905,547,697,431,384,757,906,491,180,575,761,317,287,176,342,707,385,441,556,609 52 | 683,235,703,899,607,577,7,483,640,341,235,61,551,312,351,420,613,348,760,766 53 | 726,934,247,723,656,51,897,612,337,892,244,423,166,560,661,248,106,267,593,274 54 | 423,838,671,192,637,470,490,261,627,333,590,83,183,95,843,249,870,518,384,525 55 | 75,893,681,527,638,319,321,949,258,925,853,259,508,416,432,311,613,978,393,661 56 | 400,818,549,611,116,390,660,702,241,776,606,69,487,342,435,663,590,57,434,671 57 | 249,941,730,547,604,315,136,202,933,503,758,105,566,267,164,208,704,936,510,618 58 | 435,831,581,162,138,827,564,336,846,563,243,597,698,352,399,662,699,555,717,263 59 | 438,85,833,764,926,866,188,839,191,259,875,110,220,334,667,254,908,263,594,852 60 | 319,61,527,343,143,684,232,672,146,140,338,61,205,991,271,832,137,394,129,252 61 | 698,487,489,118,902,701,700,347,630,264,56,405,238,696,607,857,919,638,554,177 62 | 565,933,763,206,201,525,561,925,57,854,519,639,195,606,55,235,415,469,782,764 63 | 139,614,244,164,648,200,722,429,113,75,842,892,384,837,718,840,343,399,315,795 64 | 393,54,63,410,101,244,697,875,580,439,354,764,390,931,171,901,423,22,627,165 65 | 700,595,126,101,497,250,732,241,602,919,243,592,55,4,133,922,552,937,917,487 66 | 728,144,338,179,341,630,606,59,826,897,553,597,245,314,926,215,235,352,751,490 67 | 387,854,190,172,206,824,513,429,904,768,413,470,704,106,348,244,790,124,356,598 68 | 315,639,676,116,682,552,98,127,72,250,998,903,97,341,927,129,595,423,511,894 69 | 438,919,824,580,178,507,671,627,762,927,828,572,139,192,550,493,597,178,279,820 70 | 589,400,349,178,613,605,239,265,96,676,561,202,358,394,610,334,79,99,494,191 71 | 165,791,416,135,920,830,736,93,55,426,626,791,330,764,117,108,396,999,82,685 72 | 360,903,854,159,627,394,580,628,404,916,661,69,908,518,675,693,836,64,696,646 73 | 198,509,114,525,607,387,405,145,66,208,122,626,88,95,937,501,586,912,241,785 74 | 290,348,643,203,317,552,397,594,82,555,66,516,500,591,522,948,594,921,509,579 75 | 553,254,137,433,427,516,95,173,411,206,243,829,166,934,683,275,919,571,347,549 76 | 667,87,385,193,672,315,692,599,513,191,525,319,571,75,619,434,122,110,598,733 77 | 68,392,731,823,833,874,8,432,693,415,927,344,693,593,167,439,686,163,249,947 78 | 934,67,240,895,401,670,327,327,482,901,348,199,324,919,133,781,55,854,682,52 79 | 412,496,832,914,102,896,191,167,481,319,867,665,978,747,553,143,790,719,582,790 80 | 788,876,844,574,988,419,699,137,835,331,680,385,139,490,248,488,321,689,233,554 81 | 517,534,179,490,415,750,595,614,194,352,598,666,873,635,749,491,62,630,135,623 82 | 842,241,10,583,617,624,903,516,419,624,178,608,929,818,690,411,579,786,496,726 83 | 77,432,401,125,147,730,842,441,502,249,431,146,68,106,626,103,869,346,258,99 84 | 106,148,820,842,904,357,330,113,160,707,399,339,487,632,925,249,562,272,667,311 85 | 415,820,75,68,415,834,202,933,521,578,416,73,894,108,401,357,794,318,167,341 86 | 492,923,605,792,248,641,497,913,631,694,722,598,103,795,392,579,191,98,472,73 87 | 936,260,206,167,110,895,395,484,930,491,50,751,802,526,665,721,677,508,662,489 88 | 911,911,676,52,521,430,358,512,251,75,90,663,732,160,435,876,548,113,675,347 89 | 193,687,353,941,893,189,73,118,439,507,429,184,328,764,761,507,751,696,845,724 90 | 787,760,752,66,517,265,662,346,644,56,562,110,638,480,421,207,258,318,64,399 91 | 626,639,705,978,525,84,265,889,516,905,587,525,762,586,338,167,694,108,262,764 92 | 727,699,126,731,161,613,678,316,68,595,425,658,94,850,77,525,636,258,789,648 93 | 840,338,631,144,142,759,63,107,766,681,909,389,703,470,858,948,249,618,722,165 94 | 68,329,735,175,414,81,932,251,331,238,192,474,233,431,515,945,513,558,747,639 95 | 191,158,314,840,705,793,895,119,570,102,246,520,831,870,85,577,843,158,488,676 96 | 721,764,995,135,607,753,413,107,766,136,751,823,124,487,190,943,231,575,142,341 97 | 419,354,315,852,84,363,350,146,832,387,328,866,825,314,126,412,575,313,686,702 98 | 430,526,511,846,593,431,681,512,727,949,550,407,481,325,583,310,911,737,640,510 99 | 630,495,933,997,620,111,628,122,700,272,572,628,392,174,137,909,122,692,207,766 100 | 84,97,758,334,648,672,722,516,912,846,849,77,709,908,929,937,747,114,753,404 101 | 636,383,252,723,786,687,786,685,690,916,917,250,827,643,800,648,195,232,623,198 102 | 74,92,658,938,496,265,907,193,635,492,636,833,925,483,423,240,821,313,178,942 103 | 768,344,557,64,22,849,386,554,637,313,88,723,350,176,233,597,618,76,849,79 104 | 413,345,226,248,637,490,579,194,315,944,899,939,763,637,614,701,432,505,602,260 105 | 585,648,248,663,389,394,870,692,332,88,89,704,88,197,15,260,597,395,922,933 106 | 74,76,944,516,789,440,601,315,686,208,727,283,197,647,140,600,902,847,481,795 107 | 494,419,272,250,612,259,835,932,86,679,434,172,633,420,774,705,82,597,917,126 108 | 556,184,116,411,900,845,247,107,854,109,392,76,706,921,115,619,397,234,900,866 109 | 241,256,591,566,203,68,733,700,874,521,145,470,427,641,137,467,553,608,651,416 110 | 826,785,527,638,767,691,419,11,604,926,129,96,899,191,187,137,252,832,176,822 111 | 410,385,854,702,934,752,766,669,123,987,625,120,187,344,339,914,592,247,662,77 112 | 77,396,751,621,599,521,227,912,682,728,269,619,338,758,905,96,433,605,918,589 113 | 115,673,673,619,663,138,322,604,566,901,656,628,572,794,933,89,697,719,728,241 114 | 5,198,735,344,316,138,747,867,58,195,388,159,487,430,235,908,343,762,175,593 115 | 243,818,77,892,85,555,523,554,932,758,864,591,833,201,640,476,557,626,665,272 116 | 735,870,316,163,921,755,406,317,356,916,269,488,685,85,598,938,195,258,702,324 117 | 893,98,520,751,341,564,189,262,261,372,648,164,508,75,72,205,704,432,851,133 118 | 85,651,747,719,86,384,440,524,236,71,848,403,231,845,60,340,551,687,180,827 119 | 696,704,518,514,61,661,688,349,339,437,95,235,898,50,738,332,596,896,844,872 120 | 15,388,555,118,747,521,126,585,668,695,190,927,757,61,56,837,935,895,467,260 121 | 484,546,796,976,831,829,168,871,399,440,627,919,493,405,661,687,913,706,764,768 122 | 325,686,164,470,146,139,140,896,852,326,910,246,929,891,248,796,746,385,696,361 123 | 638,56,588,887,791,663,99,790,622,942,476,746,747,625,60,398,927,721,496,275 124 | 86,742,705,640,659,128,172,176,874,310,548,67,606,106,169,134,546,823,267,825 125 | 613,933,872,756,334,518,507,630,338,736,468,633,726,78,72,202,412,224,701,696 126 | 683,132,689,874,916,245,146,431,246,606,414,735,986,761,934,640,941,439,250,165 127 | 118,134,123,98,598,345,478,927,436,931,769,876,834,68,104,912,892,647,200,674 128 | 399,417,836,729,87,581,773,852,98,928,906,352,88,927,346,429,106,736,753,913 129 | 121,731,79,434,941,641,236,672,599,105,943,441,103,731,567,769,173,116,731,187 130 | 526,636,244,511,92,558,510,612,897,644,730,745,100,823,580,52,854,141,384,122 131 | 591,607,201,204,610,96,402,652,734,426,496,263,552,704,235,433,588,198,126,896 132 | 59,854,902,175,165,111,428,869,587,92,932,129,884,636,204,349,694,525,90,547 133 | 849,623,107,107,327,81,238,425,636,441,666,373,841,830,117,906,142,165,769,109 134 | 314,507,81,106,749,733,144,208,84,93,140,405,623,751,341,913,918,371,180,907 135 | 842,936,178,506,746,739,931,929,467,579,59,249,440,753,314,672,702,58,577,632 136 | 391,161,421,796,946,640,752,930,409,266,67,528,795,941,586,906,208,556,905,506 137 | 851,489,52,162,111,616,763,846,948,471,910,247,642,514,646,904,749,115,53,822 138 | 488,623,558,898,110,599,401,904,512,333,492,431,668,389,174,658,161,837,792,842 139 | 290,366,846,81,735,627,73,639,635,140,272,332,267,823,912,607,659,331,260,908 140 | 560,242,626,758,179,70,57,831,143,61,143,103,96,849,314,173,274,597,5,945 141 | 593,135,512,354,786,469,896,112,165,188,63,728,659,128,845,436,191,108,113,478 142 | 252,441,506,412,53,251,69,731,324,832,576,777,638,648,588,513,416,58,820,676 143 | 771,730,722,606,603,92,481,169,135,348,76,139,589,894,78,424,333,111,929,325 144 | 428,619,67,603,725,605,67,593,412,112,661,198,148,579,211,407,332,505,666,114 145 | 105,843,764,235,174,827,511,784,920,243,104,423,326,916,941,280,487,901,677,790 146 | 424,392,414,674,929,489,836,423,907,408,121,607,113,163,934,535,177,253,485,407 147 | 748,189,843,396,629,818,345,677,601,174,85,240,912,195,108,570,849,245,707,427 148 | 604,559,638,424,514,255,720,668,341,469,548,418,791,754,60,879,922,706,628,432 149 | 760,840,661,340,247,584,320,92,720,743,938,752,73,256,606,97,87,489,125,618 150 | 100,140,679,273,92,676,99,641,259,945,785,848,472,946,332,912,268,706,676,126 151 | 923,126,435,752,108,282,576,95,790,138,933,61,205,682,482,240,338,315,270,618 152 | 920,917,177,120,201,534,107,828,766,796,179,275,61,118,506,628,470,735,669,725 153 | 58,993,325,647,945,935,346,62,238,113,497,135,432,59,83,677,483,275,561,610 154 | 609,416,496,492,52,401,428,621,565,390,999,234,572,907,344,131,78,618,135,333 155 | 583,493,671,618,706,328,122,488,795,387,830,391,608,343,494,547,631,135,210,935 156 | 158,343,507,254,629,251,719,255,923,546,671,557,928,842,448,106,139,765,546,90 157 | 866,906,72,945,497,930,527,198,768,427,423,594,834,353,769,843,770,830,930,252 158 | 525,262,927,664,255,568,825,606,620,678,616,481,850,91,852,930,645,875,203,726 159 | 257,526,129,386,691,13,330,769,833,665,849,270,766,100,264,521,602,343,892,924 160 | 403,176,794,687,903,431,511,506,588,486,256,139,605,666,502,467,161,61,920,706 161 | 842,761,399,870,171,337,724,72,234,253,243,935,158,931,538,267,421,789,697,684 162 | 744,643,754,413,850,486,587,346,160,487,425,437,576,606,310,894,117,434,870,751 163 | 423,608,313,68,849,323,403,238,275,603,839,712,916,125,619,231,867,330,622,621 164 | 368,251,828,79,843,913,406,664,391,324,415,51,830,148,253,77,176,131,333,506 165 | 233,417,98,432,66,595,98,935,489,843,343,670,785,841,424,445,590,731,600,645 166 | 938,436,329,918,944,646,660,607,130,598,253,82,406,395,488,814,322,833,872,572 167 | 354,273,196,316,735,614,663,706,589,876,125,502,430,61,128,747,518,902,575,57 168 | 824,788,167,433,579,423,314,788,229,518,125,102,945,78,594,170,172,663,527,493 169 | 102,413,930,129,516,555,484,327,385,114,662,213,766,206,623,159,59,86,752,666 170 | 173,648,520,321,328,582,524,938,413,332,925,74,330,514,722,715,919,759,511,907 171 | 588,594,171,83,525,412,260,888,235,440,347,517,117,920,176,754,726,421,639,775 172 | 827,722,509,422,54,455,932,761,64,757,315,562,86,836,846,565,430,785,545,434 173 | 51,315,629,916,84,611,331,97,626,255,352,194,894,247,337,755,259,868,988,526 174 | 127,146,330,733,168,128,926,165,924,889,390,914,929,820,824,60,784,781,870,397 175 | 319,241,553,693,475,107,493,693,207,700,946,481,104,855,160,86,830,564,769,188 176 | 671,196,926,169,338,690,761,125,75,767,729,521,405,919,472,141,918,580,424,558 177 | 255,487,268,199,898,679,869,395,948,790,62,361,341,438,866,564,866,330,323,625 178 | 832,97,190,207,603,825,434,484,347,765,776,749,788,313,792,236,402,600,429,870 179 | 706,58,565,84,148,819,629,791,18,235,889,331,868,505,934,606,336,72,914,560 180 | 399,610,722,837,401,915,767,727,441,983,898,622,785,494,896,690,678,645,244,83 181 | 867,335,266,620,821,340,831,898,897,558,730,243,655,199,562,610,794,689,672,352 182 | 550,586,21,949,86,484,624,168,426,764,139,315,595,274,930,203,833,319,205,613 183 | 408,638,700,904,346,930,428,897,320,87,767,429,107,416,273,197,272,693,618,741 184 | 839,88,552,582,686,124,894,236,612,54,737,134,945,660,853,431,659,911,140,496 185 | 103,626,394,59,62,431,332,70,602,623,600,333,350,509,395,144,51,611,543,315 186 | 354,196,578,698,564,934,317,561,853,262,919,594,943,101,278,874,318,324,732,706 187 | 587,225,908,386,403,870,595,677,661,506,141,830,127,265,663,584,321,705,395,256 188 | 248,909,923,389,274,563,51,165,142,229,732,201,412,584,704,864,584,414,485,328 189 | 604,252,413,891,405,132,892,432,699,754,208,121,177,788,693,721,853,488,737,118 190 | 242,659,789,877,662,240,501,237,482,193,761,314,393,834,785,903,432,786,246,66 191 | 900,669,129,596,486,547,523,628,711,515,592,555,606,163,117,158,628,397,172,551 192 | 849,280,412,693,640,582,581,928,62,849,582,689,68,241,114,931,496,56,334,189 193 | 693,855,831,788,731,395,441,920,438,283,430,317,925,490,719,90,79,316,256,481 194 | 939,734,523,62,887,595,273,124,582,927,127,395,591,409,727,292,755,836,747,134 195 | 895,569,767,487,723,729,482,386,730,891,54,606,599,257,899,572,512,923,409,148 196 | 749,502,551,824,666,339,769,663,233,602,343,682,316,327,824,387,252,512,247,64 197 | 520,351,875,12,79,518,101,140,106,794,142,95,920,107,96,401,615,159,564,828 198 | 645,352,391,54,251,95,208,686,439,651,236,118,384,271,832,588,753,254,682,762 199 | 835,949,387,614,96,219,399,680,441,513,232,412,254,427,208,925,838,128,589,576 200 | 129,319,615,601,928,94,819,919,729,759,164,625,791,683,877,481,215,425,333,189 201 | 432,65,627,121,692,579,197,418,557,614,850,117,870,318,305,671,612,145,759,238 202 | 789,355,126,511,158,923,264,853,765,557,275,141,195,237,109,272,914,422,242,180 203 | 267,581,835,722,481,875,350,233,475,93,90,250,325,623,683,698,837,695,128,402 204 | 920,130,664,268,606,16,313,261,269,545,435,685,102,828,618,140,829,492,231,403 205 | 707,866,752,237,546,526,563,351,901,315,254,414,682,124,233,926,635,414,61,377 206 | 551,310,733,891,785,343,207,202,241,468,846,616,533,527,791,328,839,851,207,387 207 | 728,581,614,723,353,196,622,787,723,827,660,71,430,337,572,755,650,234,684,168 208 | 652,788,929,72,193,203,423,751,140,324,893,903,935,519,164,556,896,855,907,257 209 | 438,931,556,891,234,655,164,429,614,202,597,337,703,387,89,170,727,208,429,110 210 | 575,70,469,54,127,430,583,111,877,167,916,705,794,168,519,737,648,493,662,746 211 | 581,71,338,843,898,320,580,505,421,676,367,887,736,690,525,621,575,67,316,63 212 | 418,761,668,343,831,522,602,847,163,402,828,239,167,86,527,523,235,697,3,517 213 | 65,732,910,894,603,591,101,870,542,691,256,312,916,180,86,829,855,788,159,907 214 | 692,202,942,581,561,524,410,876,776,70,825,118,833,82,611,345,389,838,203,829 215 | 616,805,706,327,827,107,179,583,840,633,89,396,175,584,939,397,172,793,392,581 216 | 90,244,275,793,926,163,790,865,147,758,421,640,611,71,512,81,576,84,324,502 217 | 419,199,545,166,438,499,873,687,855,930,401,120,843,616,704,171,59,526,385,748 218 | 690,146,482,143,82,204,627,313,904,720,73,1,551,496,590,339,395,686,663,429 219 | 79,853,109,993,938,237,405,336,346,179,566,865,133,664,629,132,785,604,54,256 220 | 896,196,779,646,260,485,624,562,415,89,75,131,848,900,928,326,468,914,200,789 221 | 79,100,400,265,621,769,750,527,394,439,895,787,418,510,635,842,376,108,508,178 222 | 484,178,411,128,931,720,749,66,416,359,584,614,844,684,746,722,126,594,696,333 223 | 507,659,190,338,271,310,372,232,671,91,486,93,179,686,873,664,468,347,202,347 224 | 676,411,894,897,747,431,874,927,455,846,874,521,133,599,721,148,522,940,142,97 225 | 867,617,111,692,854,846,986,195,512,752,894,924,172,384,350,92,204,565,269,516 226 | 823,412,126,387,696,493,140,720,201,734,665,874,179,3,887,601,132,248,662,392 227 | 100,435,671,118,77,795,547,828,188,674,161,915,727,562,243,839,23,791,581,338 228 | 187,269,874,694,582,71,330,198,936,176,936,611,133,80,946,134,5,697,756,486 229 | 344,758,429,666,592,140,740,580,437,937,105,387,572,549,241,269,249,825,164,639 230 | 413,429,142,353,163,519,762,611,435,619,87,930,249,641,514,421,125,478,835,668 231 | 137,753,616,158,251,110,701,162,392,865,641,570,638,241,331,936,558,732,124,253 232 | 125,403,593,928,665,521,599,829,874,679,83,388,188,949,758,806,730,574,180,103 233 | 290,146,835,119,753,710,727,664,80,81,242,91,125,135,526,75,83,573,204,894 234 | 223,86,69,71,644,561,90,719,525,208,77,194,896,733,522,581,195,558,267,180 235 | 525,106,78,164,698,774,290,894,340,272,482,232,427,584,398,424,270,245,104,485 236 | 92,242,324,468,232,477,686,839,101,616,557,202,406,491,922,103,930,706,419,193 237 | 763,402,256,894,55,521,124,66,639,111,386,439,584,985,911,942,238,389,919,135 238 | 929,935,791,681,686,996,317,417,636,874,635,573,331,74,388,899,831,648,581,619 239 | 327,259,65,440,273,948,675,326,167,52,331,250,17,696,162,121,583,829,524,675 240 | 705,783,423,481,919,483,257,735,102,86,333,197,417,736,486,840,641,326,424,733 241 | 575,788,486,387,846,830,874,660,905,62,250,405,198,825,649,145,553,523,685,108 242 | 509,688,506,107,762,800,247,688,900,388,256,688,159,431,121,942,758,100,324,573 243 | 352,669,490,159,178,145,416,494,693,559,679,606,704,927,994,391,612,483,637,756 244 | 606,723,398,894,497,301,253,127,429,123,493,140,81,424,349,114,677,620,519,948 245 | 829,510,606,111,233,56,386,913,722,343,490,837,783,432,912,50,558,111,434,88 246 | 924,520,750,515,556,323,161,786,182,623,189,841,924,603,349,347,69,707,833,98 247 | 506,715,550,58,905,496,486,148,931,599,313,695,319,247,165,485,945,587,606,834 248 | 70,496,174,392,948,833,935,942,146,144,165,554,466,891,117,488,74,102,467,582 249 | 321,696,206,273,770,99,705,604,75,257,243,514,751,851,246,169,265,414,728,263 250 | 322,123,827,203,386,176,121,82,406,584,247,766,679,311,184,916,824,83,618,484 251 | 336,846,56,160,177,84,914,489,70,877,320,581,133,73,139,411,136,345,406,656 252 | 270,160,50,135,918,354,107,338,368,146,752,723,115,728,518,89,695,576,833,925 253 | 719,236,147,919,263,755,640,392,758,564,687,441,23,241,691,648,353,823,946,54 254 | 689,103,320,481,248,915,695,405,738,550,943,335,406,719,561,424,317,269,92,926 255 | 254,604,427,166,345,915,550,852,102,497,750,315,734,99,752,590,191,561,275,225 256 | 490,666,672,925,170,986,52,71,158,342,167,633,141,290,313,419,731,665,949,784 257 | 685,865,62,426,421,173,711,196,871,725,514,890,676,399,244,676,587,925,580,314 258 | 845,115,327,340,236,103,130,749,580,337,209,867,81,74,427,914,426,591,312,137 259 | 563,581,476,586,120,590,440,412,835,834,95,169,428,818,841,135,726,517,731,556 260 | 848,2,267,96,81,354,121,667,417,758,128,613,193,388,140,926,614,82,266,238 261 | 391,903,518,257,387,701,208,630,628,731,402,273,910,625,948,105,133,547,368,707 262 | 432,517,64,394,67,429,899,888,677,603,114,691,919,61,329,663,476,645,677,387 263 | 103,389,944,470,873,397,167,423,168,75,700,487,738,707,208,819,793,73,88,317 -------------------------------------------------------------------------------- /inputs/day17.txt: -------------------------------------------------------------------------------- 1 | ##..#.#. 2 | #####.## 3 | #######. 4 | #..#..#. 5 | #.#...## 6 | ..#....# 7 | ....#..# 8 | ..##.#.. -------------------------------------------------------------------------------- /inputs/day19.txt: -------------------------------------------------------------------------------- 1 | 3: 97 29 | 2 104 2 | 45: 97 10 | 2 73 3 | 114: 44 97 | 90 2 4 | 78: 2 95 | 97 32 5 | 7: 97 64 | 2 119 6 | 118: 97 81 | 2 58 7 | 64: 97 29 | 2 14 8 | 106: 53 121 9 | 4: 2 103 | 97 55 10 | 54: 2 53 | 97 44 11 | 58: 33 97 | 130 2 12 | 91: 104 97 13 | 102: 104 97 | 83 2 14 | 128: 2 59 | 97 3 15 | 79: 98 2 | 124 97 16 | 117: 2 65 | 97 92 17 | 1: 75 2 | 115 97 18 | 40: 2 96 | 97 119 19 | 8: 42 20 | 92: 102 97 | 57 2 21 | 97: "a" 22 | 93: 2 66 | 97 103 23 | 36: 2 104 | 97 32 24 | 2: "b" 25 | 108: 43 2 | 68 97 26 | 46: 44 2 | 90 97 27 | 31: 97 5 | 2 132 28 | 110: 14 2 | 90 97 29 | 61: 38 2 | 9 97 30 | 10: 63 2 | 34 97 31 | 32: 2 2 | 97 121 32 | 11: 42 31 33 | 103: 121 121 34 | 131: 75 97 | 60 2 35 | 74: 2 112 | 97 47 36 | 20: 93 2 | 69 97 37 | 53: 97 2 | 97 97 38 | 23: 125 121 39 | 9: 97 66 | 2 25 40 | 101: 83 97 | 95 2 41 | 35: 25 2 | 104 97 42 | 76: 97 55 | 2 104 43 | 125: 83 2 | 32 97 44 | 22: 59 97 | 76 2 45 | 127: 6 97 | 55 2 46 | 126: 97 119 | 2 17 47 | 113: 59 97 | 35 2 48 | 81: 46 2 | 72 97 49 | 104: 2 2 | 97 2 50 | 100: 25 2 | 95 97 51 | 95: 97 2 52 | 132: 97 27 | 2 45 53 | 107: 97 90 | 2 32 54 | 34: 98 97 | 50 2 55 | 33: 2 95 | 97 83 56 | 119: 32 97 | 66 2 57 | 90: 2 2 | 97 97 58 | 77: 126 2 | 22 97 59 | 6: 2 97 60 | 14: 97 2 | 2 121 61 | 94: 2 110 | 97 129 62 | 21: 56 97 | 105 2 63 | 65: 2 96 | 97 98 64 | 122: 2 71 | 97 86 65 | 87: 101 97 | 91 2 66 | 15: 107 97 | 120 2 67 | 120: 103 2 | 66 97 68 | 56: 128 2 | 20 97 69 | 129: 2 66 | 97 83 70 | 41: 97 48 | 2 122 71 | 13: 39 97 | 26 2 72 | 30: 97 88 | 2 54 73 | 84: 55 97 | 53 2 74 | 86: 84 2 | 59 97 75 | 96: 55 2 | 104 97 76 | 83: 97 121 | 2 97 77 | 50: 53 97 | 95 2 78 | 19: 2 70 | 97 78 79 | 121: 2 | 97 80 | 57: 53 2 | 83 97 81 | 37: 6 97 | 6 2 82 | 68: 97 53 | 2 83 83 | 112: 97 23 | 2 19 84 | 66: 2 97 | 2 2 85 | 49: 97 90 | 2 103 86 | 80: 2 97 | 97 97 87 | 85: 83 97 | 55 2 88 | 12: 2 35 | 97 51 89 | 116: 97 67 | 2 77 90 | 123: 4 2 | 85 97 91 | 82: 21 2 | 111 97 92 | 105: 30 97 | 87 2 93 | 72: 25 97 | 95 2 94 | 115: 104 2 | 29 97 95 | 63: 97 37 | 2 36 96 | 42: 24 2 | 82 97 97 | 0: 8 11 98 | 70: 2 80 | 97 25 99 | 5: 2 74 | 97 116 100 | 52: 16 97 | 94 2 101 | 62: 35 97 | 114 2 102 | 18: 123 2 | 61 97 103 | 25: 97 97 104 | 88: 83 97 | 66 2 105 | 124: 2 6 | 97 80 106 | 89: 114 97 | 100 2 107 | 44: 97 2 | 2 97 108 | 71: 49 97 | 106 2 109 | 38: 2 104 | 97 90 110 | 75: 53 2 | 104 97 111 | 98: 53 2 | 25 97 112 | 69: 97 95 | 2 95 113 | 73: 2 1 | 97 7 114 | 24: 41 97 | 109 2 115 | 48: 2 40 | 97 113 116 | 39: 103 2 | 104 97 117 | 67: 2 15 | 97 62 118 | 55: 2 2 119 | 47: 2 79 | 97 108 120 | 51: 6 2 | 95 97 121 | 17: 95 2 | 90 97 122 | 59: 53 97 | 66 2 123 | 28: 2 12 | 97 131 124 | 27: 2 52 | 97 28 125 | 29: 97 97 | 2 121 126 | 16: 4 2 | 127 97 127 | 109: 2 117 | 97 18 128 | 43: 104 97 | 6 2 129 | 99: 97 89 | 2 13 130 | 130: 83 121 131 | 111: 99 2 | 118 97 132 | 60: 97 44 | 2 25 133 | 26: 121 44 134 | 135 | abbbbababababbaabbbbbbab 136 | bababababaabbbaaaabaabaaaaabaabaaabbbbab 137 | baaaabbbabbbbababbbbaabababaaababbaaaabbbbabbbbb 138 | abbababaaabbabbaabaaaaaaaaaabaabaaabaabb 139 | aabbaababaabbabbaaabaababaaaabab 140 | baabaaaaabbabaabaaabaaabbaaabbabbaaabbbbbabbbaba 141 | babaabaaabaabaababaabbab 142 | bbbbbababbbaaaababaaaaabbaabaaba 143 | bbaabaaaaaaabbabbababaabbabbaaaa 144 | aabbababaaaabababbbbaabbaaabbaba 145 | bbaaababbbbaababbbbabababbaaabaaaaababba 146 | bbbbababaabbbabaabbaabbaaaaabbbabbbbbbbbbaaaabaabbbaaababbaaaaababbbabbabbabaaab 147 | bbbabbbabbaaabaaabaababbbaabaabaaabbbbba 148 | abbbbbabbaabbbbbbaaaabbbbaaaaabb 149 | aabbababbabbababbbbbaaabaababbaabbaabbaa 150 | bbbbbabaaabbaaaaabaaabbbabbaaaba 151 | baaabbbbbaabbaaabbbaabaaaaaabbbbaabaaaab 152 | bbabbbaaaabaabbaabbbabab 153 | bbbbbabbbabbbababbabaabaabbbbaab 154 | aaaabbabbbababbabbaabaaaaabbbaaaabbabbababbbaabbbbbbaaaa 155 | bbaabbabbaaabbabababbbbbbbbbabbbaabaaaaaabbababbbbbaaaba 156 | bbbaabbbaaabbaabbbbbbaaa 157 | bbabbabbbababbbbababbbaa 158 | baabbbabaabaaabaabbbbbbbaaabbaaaabbababa 159 | aabbaabaabaabbbabbbbabaaabbabbbbabbabaabbbabbbaababbbbba 160 | aaabababbbbaaabbbaaaaaabaaaaabaabaabababbbbabaaaabaaaaabbbbbbbba 161 | babaaabaaabbbabaabaaabbbababbabbbabbabaaaaabbaba 162 | aabbaaaabbbbbabbbbaaabbbaabaabbbbbaaabbbabaabbbbbbbababaabbaaabbabbaaaba 163 | aaaabababbaabaaaaaaaaaba 164 | babbbbaababaaaabbbabbbabaaababaaabababaaaaabbaababaaaaba 165 | abbbabaababababbabbaaaab 166 | babaabbbbabababaabaaaabbbababababbaaaabbaabbabba 167 | bbabbababbbababbabbaaabb 168 | bbabababbbbababbbbbbaaaa 169 | bbaaababaaaababbbabbbaba 170 | aabbbabababbababbababaaaababbaabbbabbaabaabbabbbbaaaaabb 171 | bbbbbababbaabbababaabbbbababbbaabbbabbba 172 | abbbbaabbbaaababaaababaaababbbbbbbaaaaaabbbaababaabababb 173 | baaaaabbbaabaaabbbbbbaaaaabbaabaaabbaaaabbbbbbbbbbaaaaabbabbbababbabbbba 174 | abaabbbaaabaabbbbaaabbababaabbab 175 | abbbbababbbbaaababbbbbabbababbaaababbabaabbaabbb 176 | babbababaabbbaaabaaabbabbbbaabaabaaaabbbabaabbaaabbbbbba 177 | babbabaabaababbabbaabbbbbaabaaabbaabaabbbbaaabbaaabababb 178 | babaaaaababbbaaabbabbabb 179 | baabaaabbbbababbbabababbabbabaabbbaabababbbbbbabaabaaaab 180 | aaaaabbbaababaababbbbababbbabbaaabbbabbbabbaaabbababaabbbaaabbaaaaaabbaa 181 | bababaaaabbbbbbbababbbababbbbbaabaabbaab 182 | baaabbbbaaaaabbabbababaaabbabbab 183 | aaaaabbbaabbbaaabaaaaaabbabbbbbb 184 | aababbaabbbabbaaabbbbabbaaaabbbb 185 | aabbababbbbbbaabbaaaaaaaabbbbaabbbabaabb 186 | bbbbbaabbbbbabaaabbbbbaa 187 | babababaabaaaaaabbaaabbaaaaabbbaabbbbbababaaababbbabaaabbaabbabb 188 | bababababbaaabbbababaabb 189 | bbabaababbaaaaabbabbbaaabbbaaaababaaaaaaaabbbbab 190 | bbabbbabbbbbabaabbbabaaa 191 | aaabbbaabbaaaaabbbabbabababababbabbababb 192 | aabbaaaabaabaabbbbbbaabaaaaabaaabaabbaab 193 | aaaabbbabbbbaaababbabbab 194 | abbaaaaabaabbbaaaaabbbbbbbababaabbbbaabbabbbababbaaaabaa 195 | aaaabbbababababbbaaababaabbabbbabbabbbbb 196 | baaaaaabbaababbbabbaabaa 197 | aaaabbbaabaaabbbbaaaabbababaaabaaaabbaaabbababaa 198 | bbaaaaabbabbaabbbabbbaba 199 | aaaabbbababababbababbaababaabaabaaabbaab 200 | baaaaaababaaabbabbabbaabaaaabbbb 201 | bbbbaaabaaabaabaaabababaabbabaabbbbaaabb 202 | aaabbababbbbaabbbbaababbaaababba 203 | aabaabaaaaaababbbabbaaaabaaaaabaabbabaaabbabaaabaaabbbababaaabaa 204 | aabaaabbabbabbbaaaabbbab 205 | bbaaaaaabaabaaaababbaaaaaabaababbbbbbabbbabbbaaabbbabbbbbabbbaab 206 | bbbbabaabbabbaaabaaaaaaabbbaaaabaaaabbababbaabbbbbabaabaaaabbbbaaaababaa 207 | aaababaabaababbabbaabbbbbbbabaabaaaabaaabaaabbabaaaabaab 208 | ababababbbbbbabaababbbabbbbaaabbabbababaaaabbbba 209 | babbbbabbaabaababbabbbaabbbaabbbbaabbaab 210 | aabaaababbbbaaabbabaabbaababaababbbabaab 211 | aabaaabbbbaabbbbbbbaabbababbabaabbaaabaa 212 | abbbbbbbaabbbaabbbabbbabbababbaabbababbb 213 | aabababababaaaaabbbababbbaabbbba 214 | aaaababbabaaaabbaabaabbaaaabaaaa 215 | bbbbbabbababbaaaabbbbbabbaabaababbbbbaaa 216 | aabbaaaababbbaaaaaaabbaa 217 | aaaaaaabaabaaabbabbaaaaa 218 | babaaababbaaabbabaabbbbbbaaaababbbaabaab 219 | abbabbbaaaababbbababbbabaabaababbbababab 220 | baabbbaabbabbbabaabbbaaabbaaaabbbbaaabaaabbaabbb 221 | babaabaaaaababababbbbabbbabaabaaaabaaabaababababbbaabbbabbaaaaaababaaaab 222 | aabaaabbaababbaaabbbbbaa 223 | aaababaaaaaaabbabbbbbbba 224 | ababbbabbabaabbabbabbbbababbaabbaabababb 225 | baabaaabbaaaaaabababbaababaaabaaabbbbbbbbaabababbbbabbba 226 | bbababbababbababbbaabbbbbbbababbabbaaabbbbbbaabbaababbba 227 | ababbaaaaaabbbaaababbbaa 228 | ababbaabababbaabbaabbaba 229 | aaaaabbabbabbbabbbaaabbbababababaaababbabababbabaaabbbabbbaaaaba 230 | aabaabaaabbbbabbababbaababaabaaabaababab 231 | bbabbaaaaabbbabababababbababbbaaabbbaaaababbbabbbbbbbbabaababaaa 232 | aabaaabbbbbbababaaabaaaaaababbaaabaaabaaaabaabaabababaabbbbaaaaabbbabaaa 233 | aaabaabaabaabbbabbbbabba 234 | aaabbbaabaabbbabbbababbb 235 | bbbbbaababbbbaabbbabbaabbbbaaaaa 236 | baaaabbbbbabbbababaaaaababbbabab 237 | bbaaaaabbaabaabbaabbaaaaabaaabaaaaababbbabaababa 238 | babaabbaabaaabbabaababbaababaaaa 239 | abbbaababaaabbababbbbaabaaababbbbbbbbbab 240 | abbbbbbbbbaaabbbaabbabaa 241 | baababbabaaababaababbabababbbbabaababbbaaaabaabbabbaaabb 242 | bbababaabbaabbbbbabaabaababbabba 243 | bbbaabaaababababbaabaaba 244 | aaabaaaaaaaaabaabbabaaabbbaabbab 245 | aaaaabbaababbabababaabaabbbaaaaa 246 | ababbabaaaaaaaaabaabbbaaaaaaaaabaaaaaaaababbaaaa 247 | aabaabababbaababaababbabbaabbaabbbaaaabbababbabbbaaabbba 248 | babaaaaababbaabbbbbbabaabaaababababbbabbaabbaaab 249 | bbabbbabbbbaaaabaaaabbaaabbaabaabaaaabaa 250 | baababbabbabbbaabaabbaab 251 | babaabbbabaabbbaabaaabaaabaaabab 252 | abaababbbababbbaaaaaabbababaaabbbaaabbbb 253 | aaaababbaabaabbabbaaaaaa 254 | baabbbbaabababababbbbaaababbaaaabbbbaaababaabbaaaaabbbbbaabbabbbbbaaaaaa 255 | bbbbaaabbabbbaaaaabbbbba 256 | aaabbbaaaabababaababbaabbbbabaaa 257 | baabbbbbbaabaabbbababbaabbbabbabaabbbbab 258 | baaababbaabaaabbbbbaaaaaaabbabbaaaaabaab 259 | ababbabbabbbbbbbabababbaaaabababbaaabbaa 260 | baaabbbababaabbbbaaaaabb 261 | bbaabbbbababaabaaaaaaaba 262 | aabbbabbbbabbbabbbbbabba 263 | abbabbbbaabaaabaaabaabab 264 | aaaaaaaaaaabaababbaaaabbaabbbaabbbbabbaabbabbabbababbbaabbaababbaaaaaaba 265 | abaabbbbaabbbabbabbbbabaabbabbab 266 | bbaabbabbbabbbbaabbbbaabababbbbaaaaaabbabbabbbbb 267 | bababaaabaabbbbbbbaabbbaaaabbbab 268 | abbbabaabaabaabbbaabbababbbababababbbabb 269 | ababaabababababaababbbabbababaabbabbbaababababbb 270 | baabbbbbabaabbbbabbbabab 271 | ababbabbbabababbbbabbaaaaabbabbb 272 | baabbabbbbaabaaabbabbaabbbabaabb 273 | babababbbabaabbaabbbbbba 274 | abaaaaabbbababaaaabaabbbaaaabaab 275 | baaaaaabbabbababbaababbbbaabbabbaabbbbab 276 | abbbabaabbaaababaabbbaabaababaabbababbabaababbba 277 | bbabababaabbbbaaaabaabaaabaababbaabaaaaababbbbabbbaaaaabbabababaaabababababbaabb 278 | aaababaaababababbbbbbababaabbabbabbbbabababbbaba 279 | aabaabbbaaaaaabbbbbaababbabbbbba 280 | bbabbbabbbaaabbbabaabbbababbababbbbaaabaaaaaabaabaaabaabaabbbbaaabbbabab 281 | bbaabbbbbbaabbbbbaaababaaababbabbaaaabba 282 | ababbbbbabbbbaabaabaabbaabaabbab 283 | bbabbbaaaabbbaabbbababbaaaabbbba 284 | baabbbbbababbabababbbaababbabbbaaaaaaaba 285 | abbabbbaaabbbaaabbabaabababbabaaabbaaaaaaaaabaabbbabbbbb 286 | aaabaaabbaabaabbbaababaabababbbbaabaaaab 287 | baabbbaabaabaabbaababaabbbaaabba 288 | abaaabbbbbbbabaababaabaaababbbbaaababbaaaabbbabaabaaaabababbbbbbabbaabab 289 | abaaaabbaaaaaaabbbbbabaaababbabbabaaabaabbaabbba 290 | bbaabbabbbbaabaabbaabbaa 291 | abbbbababaabbbaabbbbbabaababbbaabbbbbaaa 292 | babaaaaabbbbbbbbbbbbbababbbaabaabaaaaaabbbabaaabaabbabaa 293 | bbaaababbabaabbabaabbbbbbababaabaabababbbabbbbba 294 | baaaaaababbabaabaaaababaababbaabaaaaabab 295 | aabaaaaabababaababaaababaaaabbabaabaaabaabbababbbaaabaaabaababaa 296 | babababbababababaaababbb 297 | aaabaaabbbababaaaabaabbabaaabbbabaaaabab 298 | abbabbbaaaabbbaabbaaaabbbabbbabbabaabbaa 299 | bbbbbabbabaaabaabbababaabaabbabbbabbaabbbbbbabbbabbaaaaa 300 | bbbbbabaaabbbabaababbbbbabaabbbbbbaaaabbbbbaabbbabaaabab 301 | bbabababbababaabababbbbbbbbaaabbabbaabbb 302 | aaaaaabbbbbaababbbaaabaabbbaaaaa 303 | aaababbabbabbbaababbabbaabbabaabaaabaababbbabbabbbbbbbbbaabaaaab 304 | abbbbbbbbaaabababaaaaaabbbabbabb 305 | babaabaabaaabababaabbabbbabaabaabbbaabaabbabbbaabbbabaaa 306 | bbaabbabbbabaaabaaaaaabbbbabaaab 307 | baaababbababbaaaabbbbbba 308 | baaababbaaaabaaaaababbaabaabbbbbabaaaaababbaabaaaabbbbaaaaabaaaa 309 | aabaabbbbababaaababbabaabaabbaaabbaaabbbbbbbbbbbabbababb 310 | aabbbaaababaabbabaabaaaaaabaaabbbabbaaabbababbbbabaababb 311 | baaabbabbaaaabaaaabaaababbbbabaaaaabaaba 312 | ababbaabbaabbbabbabbababaaaabbbbaabbabba 313 | abaabbbbbababaaabaababab 314 | baabaaaaabaaabbbaabbaabbaaabbbbb 315 | bbbbbbaaaaabbaababbabbabbbbbbbaa 316 | abaaabaabaabbbbbbabababbbabbbaaaabaabbbaabbbabbbaabaaaaa 317 | bababbaabaaabbababaababb 318 | bbbabaabbababbaabbbabbaababbbbbbbbbbbbab 319 | bbbbbbbbaabaabbaaaabaaabbbaaabbbbbabbbbb 320 | abbabbbabbbbbaabbbaaabbbbaabbbaaabaabbbbbabbabbb 321 | baaabaaababaaaaaaabbbabbbaabbaaababbbbbbbaaaabba 322 | abaaabbaabaabbbabbaaabbbabaaabbbaababaaa 323 | aaaaabbbaabaabbabaabbbbbbbaabbaa 324 | aaaabbbaabbbbabaabbabaaaaaabaabb 325 | aaabaaabaaabaaabbaabbaaababbbbabbabaaaab 326 | aabaaabaaabababaabaaabaaababbaaa 327 | bbbabbaabbabaababaaabbbabbbbaabb 328 | bbaabbbbbaaabaaaaaaaabbaaaabbbbb 329 | abbbabbaababbbbbbbbabaaa 330 | bbbababbababbbabaabaabba 331 | babbbaaababaabbbbbababababbbabaaabbbbaaa 332 | abaaaaabbaaaaaabbabbabbb 333 | ababaababbbbbabaaababbab 334 | abbbabbbaaaaaaababbbaaaa 335 | babaaaaabbaaabbbabbabbbbaabbaaaaabaabbabaaabbabb 336 | babbaabbbbbbabaaabaaabbaabaabaaabababbba 337 | ababbbbbaaabababbbbabbaaabaaaaaa 338 | bbaaaabbbaabbbaababbbbbb 339 | abaabbbaabbbbbbbaaabababbbbbababaaaabbaa 340 | abaaabaaabbabbbbbabbababbabbbaabaaaaaabaaaaaabaabaababab 341 | abaabaabbaaabbbbbbbbbabbaaabababbbaabaaaaaaaabab 342 | aaabbbaabaabbbbbbabaabbabbbbaabb 343 | bababaaabaabbbaabbaaabbababbbaabbbbabaababaabbaababaaaab 344 | aaabaabaaababababbabbbbb 345 | bbbababbaabbbaaaaabbbaabbababbba 346 | baabbbaaabbabbbbbbbbabaaabbbbaabbababbbb 347 | baabaaaaaaabababaaabbbab 348 | babababbaabbbabaabbbbaaa 349 | babaaababbaabbbbbababaaaabbbaababbaaabaa 350 | aabbbabbbabbababaaaabababbbaabba 351 | aabbbaaabbabaabbbbbbabbabbbbbbaaaababaaaabbbaaabbaabbabaabbbabaaababaaaa 352 | ababaabaaaaababbbaaaaaba 353 | bbabbbbaababaababbabbaabbbabbaaaaaaaaaababbbbbbabbabaaababbbbaaabbabbbbb 354 | bbaabbabbaaabaaaaaabbbaabaababbbbaababbabababbababaabaaa 355 | bbbbbaabbababaabbbabbaabbbababaabababbab 356 | baaabbabaababbaaaaabbbaabbbbbaabbabbbaaaabbaaaabaabbbbaa 357 | aababababababbaaabaaaaababbabaabaaaabbbaabaaabaaabbaababbbbabbbbbbbaaaaababbbbab 358 | aaabababaabaaabbaabaaabbaaabbabbaabbaaab 359 | baaabaaabbbbbbbbaaaaaaba 360 | abbbabbbbbbbaababbbabaaa 361 | babababbbbbbbabbaabaabbababbbbba 362 | aaaaabbaaabbbaababaaabbbaabbbbab 363 | bbbaaaaaabbabababaabbbaaaaaabbaaaababbbaaaaabababbabaaaaaaaaababbbbbbaabbbabaaab 364 | aabaabbabababbbaabbaabbbbbabaabbbbabaabb 365 | aaaaaaababbbabbbbababaaababababbaabbbaaabbbabbba 366 | babbabaababbaabbbaabaaaabbaaaaababaaabaabaabbaab 367 | abbbbbbbabbbbabbaabbbaaaabbbbbaa 368 | bbaaaabbbaaabbbbbbbbabbb 369 | aaababaababaabbbababbabbabaabbbabaabbaaabbbbbaaa 370 | bbbababbbaabbaaabbabaaaababbbaaabbabbaba 371 | abbabbbbbbbbbaabaabbaabaababbbaa 372 | baababbabaaaaaaaaabbbbaa 373 | baaabbabaabbbbbbaaaabbabbbbaaabb 374 | bababbaabaabbaaabaabbabbabababbb 375 | bbbbbababbbabbaabaababab 376 | aaaabbababbabbbabbbbbbbbaaabbaab 377 | bbababbaaababbaabbbbbbbbaaaaaababaaaaaba 378 | ababbababaabbabbaaabaaaa 379 | bbabbbaaaaaabbabaaaaaaabbbabaababbbbbbaababbbaba 380 | aaaaabaaababbbaabbbbabba 381 | ababbbbaaabbbbbbbaaaabbbbbaaabbbbbbbbbaa 382 | babbaaaaabbbabbbaabbbababaaaaabaaaabaababababbab 383 | baabaaabbabababbbbbaabbabbbbbbabbbbbbbaa 384 | bbabbabaaaaababbaabaabaaaabbabbabbaaaaaa 385 | aabbbababaabbabbbabaaabaabbaaababbbbaabb 386 | aabbbaabaabaabaaaaaababbbbbababa 387 | abaaaaaaabababbbaaabbaabaaabaabb 388 | abbbbabbaaaaabbbababbabbbabbbaaaabaabbbbabaabbbabbbaaaba 389 | aabbbaaaaaabbbaaaaaaabbbbababaabbbaababaaaabbaaaababaabb 390 | aaababaaababbaaaabbbabaaabbababb 391 | baaabbbabaaaaaababbbabbbbbbbababbbaabaabbabbabbababbbbabbbabaaab 392 | bbabbabaaabbababbaabbbabaabbabab 393 | abaabbbabbbbabaabbbaabba 394 | babaabbbababaababaabbbbbaababbba 395 | abaabbbbabbbabaabbababbb 396 | baaabaaaaaaabaaabbbbbaabaaaabbbb 397 | bbaaabaaababbaabbbaaababaaaabbbbabbaaabaaaaaababbabaaaaa 398 | babbabaaaabbababaabbbaaaabaabbbbbbbaabab 399 | bbabaabaaababaababaababb 400 | aabbaaaabaabbbaabaaababaabbbbbabbbabbabaaaabaabb 401 | baabbbabbaabaabbabaabaabbaabbbbbabababaa 402 | abaabbbaabbaabbaaaabbbbababaaabb 403 | bbbbaaabbbbbbabaaaaabaaabbbabbab 404 | ababbbbaabbbabaabababbbabbababbaaaabaaabaaabaaaabbaaababaaaabbaabbbbaaaa 405 | bbaabbababababbaaabbabbb 406 | babaaababbaaaabbaabbbbab 407 | bbabbbaabaabbabbaabbaaaaaabbbaabaaabbbab 408 | abaabbbbabaaaabbaabbababaaaababaabaabbbabbaababbbbbaaaba 409 | abbbbaabbbaaababbbabbbaaaaaaabaabababaaababbaabb 410 | aabbbabbaaabaaabaabbabba 411 | ababbabbababbaababbbbabaabbbaaab 412 | ababbbbaabaaaaabaabbaaab 413 | babbbaababababbaaaabaaabbaabaaaabbaabaaabbaaabbaaabaabababbaaaba 414 | bbbbbbbbbaabbbababbaabba 415 | aabbababbaabaaaaababbbaa 416 | aabbbbbbababaabaaabaaabbbbabbabaaaaaababaaabbbba 417 | aabaabbaaabaabaabbbaabaaaaaabbbb 418 | abaaaabbbbbbaaabaaaaabaa 419 | baaabbbbbabbabaaababbbaa 420 | baaababaababaaababbaaabbabaabbba 421 | ababaababbabbbabababbababbaababb 422 | baaaaabbbaaababbbabaaaabbabbbababaaababbaaaababbbbaaababbaabababaababaab 423 | baabaaaabaaababbbbabbbabababbabababbabba 424 | aabbbabbababbabbaabbaaaaaabbbbaa 425 | aaaaaaabbbbbaaaabbbabbabbaabababbbaaaaba 426 | aabbbbbbaaaabbbabbbabaaa 427 | aaaabaaaabbbbbbbbbaabbaa 428 | baaaabbbabbbbabbbbbababa 429 | ababaabaaabbaaaaabaabaabbbbbaabb 430 | babaabbbbabbababbbbbabaaaabbaaabbbbaababaabbaaabbbabaabb 431 | baabbbbbbbabbbbabaabbbba 432 | aaababaaababaababbaaababbbababbaabbbbbabbbbaabbabbbbbbab 433 | baaababbbbaabbbbbbaabaaabbbaabbb 434 | baabaabbaaaaabbabaaabbababbaabbb 435 | bbabaaaabbbababbaabbbababaaabbabbbaabbabaababbabbaaaabab 436 | baabaaaabaaabbabbabbabaabbabbbababbbbbababaabaababbbaaaababaabab 437 | abaaabbabaaabaabbbaaaabababbbbaabaaaabba 438 | aaaaaabaaabaaabbaaabbaaaaabbbaabaabbaaaaaaababaa 439 | bbbbabaaaababbaabaaabbaa 440 | ababababbaaaaaaaaaaaaabb 441 | aabbaabaaaabbaababaaaabaabaabbabaaaaabaabbbabbba 442 | aaaababababbababababbbaa 443 | abaaaaaababbbaabaaababbaababbaabbabbabababbbabbabbabbaab 444 | bbabaabaabbbabaabaaabaaababaabbbabaaaabababbaabaaabbabaa 445 | baabaaaabababaaabbbababa 446 | aaaababaabbabaababaaabab 447 | baaaaaaaaabbbabababbabba 448 | abaababbbabbbaaaaaaaabbbbaaabababaababaaabbbbabaabbbaaaaabbaaaababbaaabb 449 | ababbabbaabaabbbababbabaaabaabab 450 | aaaaaaabbbabaaaababaabbaabbababa 451 | bbbabaabbbbbabaaaaaaaaabbbbaabaabbabaaabaabbaaab 452 | ababbabbaabaaabaababababaaaabbbb 453 | aaabaaabaabaabaaaabaaabaaabaabab 454 | abaaabbbaabbbbbbaaaaabaa 455 | bbababababaabbbbbbbbbbbbababaaabaaabbaba 456 | babbabaababababbabbbbbbbbaabbabbaaabbaab 457 | aaabbbbabbbbbbbababaababbabbaaaaaaababbb 458 | bbaaababbbaaabbbababbabbbbbbbbbbaabbabba 459 | babaaabaaabbbabbaaaabbabbaaabaab 460 | babaaaaaaabaabbbabaaabab 461 | baaabbbbababbbbbbabbbaabbabaaaab 462 | abababbbababbaaabbaaabababababaaaabaaabb 463 | babaabbbababaabaabaabbbb 464 | baabbaaaaaabbbaaaabababaaabbbaabbbbaabbababbbbab 465 | bbababaaabaaaaabbabbbaaaaaababbb 466 | bababbaababababbbbbbaabb 467 | babbbaaababbbaaababababababbaaabbbaabaab 468 | aaaabbbabbaaabbbbaabbbbbbbaabaaabaaabaab 469 | baaaabbbababbaaaaabbbabbbabbbabbbabbbbab 470 | bbabbbabaaaaabbbbabaabbbabbabbaa 471 | abbbbaababaababbbaaabababbbbaabababaaaaabbabbbaaaaaabbaaabbbbaab 472 | ababbbbabbabbbaaaabbbaaababaabaabaababbaaaaabbbbaaaabbbbbabaaaab 473 | bababababaaababaababbabbabaabbaaaaabaabb 474 | bbaaaabbabbabbbabbaabaaaaaaaabbbaaaabbababbabbabbabbbabaabbbaaabaabaaaab 475 | bbaaabbbbaaaabbbbabaaaaaabbbaabb 476 | babaabbaaaabbbaaaaabaaababbbabbaabbbbbabaaabbababbaaaababbbaaaaa 477 | ababbabbbaabbbaabaaaabaa 478 | aabaaabaaaaaaaaabbbbbaaa 479 | baabaaabbabaabbbababbabbbababbab 480 | abaaabbaaaaaabbabbaababa 481 | babbabaabaaaabbbbababbab 482 | aaabbbaaaabbbabbababbaaababababbabbbaabbabaababb 483 | aabaaabaaabbbabaabbaaabb 484 | abaaaabbbaaabbbaababbbbabaababab 485 | bbababaabbbbaaabaabbbabbabbbaababbabaaab 486 | abababbabbabbabbaabbabaabbaabbaa 487 | abaaabbbababbbabbbaababa 488 | ababbbabababbabaaaaabbbaabbababa 489 | baababbabaababaabbaaaaaa 490 | bbbbbaabaaababababaabaaa 491 | babbaabbaabbbaaaabbbabbaabbabaaabbabbabaaaaaaaaababbbbaaaabaabab 492 | aabababaababaabababbbaaabbaabaaabaaaabab 493 | bbabaabababababbbabbbaba 494 | aaababbbaabaabaabbaaaabbbbabaaabbbaababb 495 | baaaabbbbababaabbabababaaabbbbbbaaabaaaa 496 | abbbbabbaabbbabbabababaa 497 | aabbbaaabbbababbbbaaaabaabbbaabb 498 | ababbbabaababababaaaabab 499 | bbaaabbabbabbbaaabbbaaaa 500 | bbaabbbbabaaabbaabababbb 501 | abbbaababbaabaaaaabbaaaaaaaaabaa 502 | baabbabbabaaaaabaaabaaaa 503 | aaabababababbbbabbbbbabaabababaa 504 | aaaaabbbaabaaabbbbbabaabaaaabbaa 505 | aaaaabbbababbbabbababbba 506 | ababbbabababbaabbbaaaaabbbbbbbaa 507 | bbbaaaabaababaabbaababbaabababaa 508 | baaaaaabbbbaaaababbabbaa 509 | baabbabbbbababaaabbabaababbbabbaabaaaaababababbb 510 | abaaaaabbbbaaaababbabbaa 511 | abbabaabbaabbbaaaabbaabbaabaabaaaaababbabaabbabababaabaabbbbbbbbbaaaaabbababbbba 512 | aaabaaabbbbabaabbaababaaabbbbbabbaaaaaaaaababaaaaaababbabaaabbaa 513 | aaaaaaabbaabbaaababbbaababaabaaababbbbaa 514 | bababababbbbbabbaabababbbaaabaaaaaaaaaaaaabbbaaa 515 | babababaaaaabaaabbaaabaa 516 | abbbbabbbababbaababbbaabbababbbb 517 | bbabbbabaabaaabaabbabbbbabbaaaaabbbabbba 518 | aabbaaaabaaabaaaabbbbabaaaaaaaba 519 | baabbbbbbaaabaabababaabaababaaaaaabbaaaabbbbaabbabbabbaa 520 | bbaaaabbbbaaabbabaaabaab 521 | bbbbbababaabbaaabbbbbaba 522 | bbabbababaabbabbaaaababbbbbbbabaaaaaabaa 523 | aaabababaabaabbbabbbabbaaaababaabbbabaaabbabbbbbabaaabab 524 | bbbabbaababbababaaaaaaba 525 | bbbbbababbabbaabbbbaaaba 526 | aabaabbbbbabaaaabbaaababababababbabaaaab 527 | baaabbbabbbababbabababaa 528 | bbaaababbabaaaaaabababbb 529 | bbabbaababbbabbaaaababbb 530 | bbabbbbaabababbababaaaab -------------------------------------------------------------------------------- /inputs/day21.txt: -------------------------------------------------------------------------------- 1 | gjqt bxfbb dcqtc xbbcnx bsjqq zzjt svzg gnrpml pmm shh vmhqr fgngbms tbmn djdgk mlmf snxvqf fnks cqkrlq zchcj vfvtj rdffqv mkrf xgftsb xrmxxvn txrjf vqxtr rxqd sqsmc qjcn spmsczc vqjct fhcpkt lvn vcpk mlxh xfhbfvp vrxp zjptr shltgt vmftt mhbxmfq jzs bgclkbpr lcpkxl lnjrvsz lhpgn nd xvn rfqqg mnjlf hhst vs fxbx jpfq ptjhk pnm vdgj dcj nvfkp zhtq xqvz hvllxq rdfr qxfzc jcb vtrf jxh pqxx vtrqn xntpv dcxncsm vjqr bfncxv frbq hkhkjm khpdjv ldgs nkff bdvkpj vgbz cbmvcj (contains peanuts) 2 | rszfj qblrk lnjrvsz qfffx shh ttrjb bdvkpj lmfr jpb rgx jxxgtl qxfzc mlxh vrxp jxh fhcpkt rdfr spmsczc gnrpml xrmxxvn jncbh hvllxq vspsdz zbjjnvn qtz jpfq nd khpdjv xgftsb pbpgl xhqh vdgj qjkng lrlgmm nvfkp pxjhvr bxfbb ffgkmhh lpgvh nhqljxg xcx dltgm snxvqf ljgmg vmhqr gnvg vmftt vqxtr (contains peanuts, nuts, dairy) 3 | xrmxxvn cqkrlq mlmf gnrpml dcqkt rdfr jxxgtl xgftsb bksvfq vs kpmnz pxjhvr rfmvh jpb vmhqr szztlx vdgj lkbnjx lpxc qjcn qjkng ctbjc qblrk fxbx rpsnkz xrqrlb ldgs jxh lpgvh mlxh shh zbjjnvn hqmkj lnjrvsz vqxtr zjptr qfffx rlqgq qvtfr frbq txrjf vmftt bdvkpj dcqtc vfvtj lxcxp jncbh vrxp xcx gknhqs knhvxg hfkxc nvfkp tbmn vspsdz ltrzm jndzl prdtb tpgtm qxfzc nktph jpfq pnm kjhdl vgldq qslbqf djdgk xntpv ttrjb qmzn thgljm znrb nd gjqt (contains eggs) 4 | qjcn rmhh dcj hvllxq czn ffgkmhh rdfr mlmf rfmvh jncbh qdtfkcls vgldq gnrpml snxvqf shh rbcp bgclkbpr rzddk qfnhsjj dlr cmzz xqvz jxh fnks lhpgn vmhqr ntqss tzkf nktph mnjlf frbq txrjf qxfzc pkmbb qtz dltgm bsjqq qblrk lmfr xrmxxvn cbmvcj vdgj rlqgq kfttq tdmfz ttrjb bxfbb tbmn qvtfr vjqr pnm rszfj lvn fhcpkt xbbcnx sqsmc nd nxs xcx qgvhn rxvc (contains nuts, sesame, wheat) 5 | zqrg tbmn kjhdl vqjct vtrqn xqvz dclkt vqxtr zdrptcx bgfc ffgkmhh rfmvh nktph vrjh lhpgn vdgj kdxs rdffqv jpb lmfr nd jxxgtl tdmfz bsjqq jpfq qslbqf rfqqg gjqt shltgt gksqg jzs ljgmg vxcdsr dcj cqkrlq jxh gckzr qgvhn zzjt xrmxxvn vcpk mltp lcpkxl gnrpml bfncxv dcqkt cpcxj spmsczc rzddk qjcn rdfr gknhqs qxfzc qvtfr gbxsxs pgkm txrjf vs tppnl bkls svzg pxctl ptjhk khpdjv zhtq qfnhsjj tdvzl jcb lxcxp xhqh qblrk pqxx bxfbb lpxc dcqtc (contains fish, wheat) 6 | xrmxxvn pxjhvr vjqr bvvkd gnrpml jndzl bcpks vqjct dcqkt vgbz rdfr hrxjrg lmfr gjqt sqsmc xfhbfvp qgvhn rxvc hfkxc mfqrl mlxh rgx ljgmg fnks szztlx lpgvh tzkf jxh rszfj rxqd qxfzc qjkng skzxjnc vmftt dclkt vmhqr bsjqq zhtq vfvtj jncbh vspsdz qtz mrffh plpl rfmvh gknhqs (contains dairy) 7 | vfvtj dvd svzg dbvqq fhcpkt lkbnjx rfmvh vqjct gbxsxs gckzr mhbxmfq gnrpml pbpgl mltp qslbqf jvcjhg sqsmc hqmkj jzs mrffh rdfr gnvg tbmn xcx vmhqr czn nd bsjqq bgclkbpr rpsnkz lxcxp rxvc vqxtr fgngbms ntqss xfhbfvp tkg khpdjv vs jrr dclkt cddpfxx hvllxq xrmxxvn rgx lpgvh mlmf flr ctbjc bkls rrtlfh cpcxj xqvz zhtq tpgtm jxh vjqr pxjgxr bxfbb shrnc zdrptcx dcxncsm jpfq gxlzr mnjlf (contains wheat, soy) 8 | pkmbb qkggr plpl tpgtm mkrf hrxjrg szztlx mfqrl qgvhn rzddk gbxsxs fgngbms xcx xhqh rxvc rpsnkz lkbnjx zjptr cqkrlq spmsczc nvfkp pnm rblnlnk nktph khpdjv bqt shrnc mzdlxl dclkt jvcjhg jxxgtl vcpk vtrf vdgj lmfr rmhh rfmvh gnrpml bxfbb hhst xrmxxvn tzkf jpfq dcqkt bvvkd fxbk vs rdfr gknhqs nkff hfkxc djmfxp pbpgl jcb shltgt tlrpk hvllxq rbcp qxfzc zchcj dltgm gpg cbmvcj mlmf dbvqq dcxncsm shh vqjct vmhqr ltrzm nnsnh qmzn tkg fnks vjqr tdmfz vgldq (contains sesame, dairy, peanuts) 9 | rdffqv mrffh thgljm dcxncsm qkggr qblrk dcqtc bgclkbpr nxs tppnl hkhkjm gpg tpgtm xfhbfvp nktph bqt qslbqf ldgs jxxgtl qfnhsjj jxh lkbnjx xrmxxvn qxfzc khpdjv dcj knhvxg pxjhvr djmfxp gksqg vmftt sqsmc jncbh hfkxc fnks gnrpml pxjgxr zhtq txrjf mhbxmfq rgx lhpgn vspsdz vqjct svzg qfffx frbq lrlgmm nkff zhxvv vqxtr ptjhk bdvkpj vgldq nhqljxg xrqrlb cmzz dltgm rpsnkz bfncxv flr fgngbms tkg fxbk cqkrlq qgvhn qdtfkcls rdfr rfmvh xcx gnvg snxvqf kpmnz tdmfz mltp (contains wheat, nuts) 10 | hkhkjm rfmvh dbvqq fxbx bgfc gbxsxs vmhqr lkbnjx hvllxq pbpgl rxqd frbq vjqr bxfbb ffgkmhh ctbjc xqvz bdvkpj mlmf rmhh lhpgn rzddk cpcxj jpfq vfvtj rpsnkz dltgm vgbz bpkh svzg gnrpml fxbk vrjh czn vrxp vspsdz gckzr szztlx shrnc hrxjrg lmfr pxctl bcpks xvn nd ldgs ldpkn xfhbfvp mfqrl qgvhn khpdjv pnm xrmxxvn nktph mnjlf mrffh rdfr rblnlnk kdxs sqsmc gpg prdtb mhbxmfq bgclkbpr gjqt kpmnz ttrjb vgldq pkmbb shltgt dlr tdmfz nhqljxg zhxvv zhtq jxh thgljm gnvg dvd fsfhp vs rlqgq (contains peanuts) 11 | djdgk jpb vmhqr tbmn vgldq vtrqn lrlgmm lhpgn rlqgq rblnlnk xntpv mrffh dltgm zchcj xrqrlb kfttq rxvc rdfr qmzn qblrk gxlzr fxbx bxfbb lxcxp xrmxxvn qfffx khpdjv plpl tdmfz qslbqf pxjhvr lpxc pbpgl mkrf gksqg vqxtr zhtq jzs dlr dbvqq bcpks cddpfxx hkhkjm gnrpml qtz rzddk mnjlf qgvhn bpkh hhnxvg jxh pgkm pkmbb frbq pmm dcxncsm vs jpfq nhqljxg xfhbfvp cqkrlq mhbxmfq qjkng qxfzc rrtlfh qvtfr djmfxp zhxvv jndzl xbbcnx (contains eggs, soy) 12 | rxvc fgngbms jxh plpl qxfzc vtrqn qjcn lkbnjx mlxh ntqss xvn nnsnh tbmn gxlzr rdfr dcqtc xfhbfvp dlr txrjf gnrpml rfmvh vdgj rdffqv ldgs jpfq rmhh gpg hhnxvg dclkt vxcdsr vmhqr cddpfxx vspsdz jndzl qgvhn zchcj ldpkn sqsmc zqrg mlmf bgclkbpr rxqd lmfr rgx nxs snxvqf nhqljxg dvd jxxgtl qtz tlrpk nvfkp qjkng fxbx qkggr xrmxxvn (contains sesame, nuts) 13 | xrmxxvn jndzl szztlx cpcxj rfmvh rzddk vmhqr sqsmc xhqh zhxvv hqmkj rdfr zzjt xntpv tzkf tdvzl jpfq nd gckzr lpgvh bfncxv lnjrvsz fnks jxh ffnq jxxgtl gxlzr ttrjb shh spmsczc ldpkn hvllxq fhcpkt gnrpml mfqrl dltgm hhnxvg qdtfkcls dbvqq kjhdl thgljm czn vqjct knhvxg dvd rpsnkz rxvc khpdjv vgbz kpmnz lkbnjx (contains nuts, dairy) 14 | fsfhp thgljm jxxgtl xfhbfvp rdfr ldpkn vrxp tpgtm hfkxc rblnlnk jpb rlqgq qxfzc djmfxp dbvqq mhbxmfq gckzr lnjrvsz pgkm bpkh gnrpml vmftt vmhqr rzddk rfmvh pkmbb tzkf tdvzl qvtfr ffgkmhh xgftsb bkls hkhkjm vfvtj skzxjnc mlmf rmhh rdffqv qtz knhvxg vtrqn qblrk ptjhk dcxncsm ntqss fgngbms jvcjhg svzg mzdlxl rrtlfh lkbnjx sqsmc bvvkd xntpv lxcxp mrffh jxh frbq khpdjv nkff fxbk jndzl gksqg hvllxq bgclkbpr qfnhsjj kjhdl jrr nvfkp dvd mfqrl qkggr mnjlf nd bcpks hhnxvg nnsnh vrjh xhqh qmzn (contains wheat, dairy, eggs) 15 | rblnlnk spmsczc tlrpk nxs xntpv hhst mzdlxl lxcxp qkggr dbvqq gnrpml sqsmc bpkh rdfr knhvxg skzxjnc mfqrl rpsnkz lpgvh rlqgq nd tkg hkhkjm bxfbb zchcj zzjt nvfkp dcqkt vfvtj dltgm xrmxxvn vmhqr xbbcnx rszfj lkbnjx mlxh khpdjv fxbk jncbh bcpks qvtfr rfmvh vqxtr rgx pgkm rmhh fnks jcb vgbz cqkrlq lmfr zjptr cpcxj djmfxp kdxs hrxjrg dvd vtrqn kjhdl kfttq qxfzc bkls dlr qfffx xhqh qslbqf flr ptjhk fgngbms gckzr shh (contains soy, eggs, nuts) 16 | bfncxv snxvqf hfkxc prdtb khpdjv pxctl dcj plpl xhqh lmfr tlrpk ptjhk vgbz ffnq mkrf hkhkjm lxcxp gxlzr zhtq dclkt qblrk vspsdz pnm zchcj rfmvh tbmn rxqd rrtlfh hvllxq nktph qfffx rmhh bdvkpj nhqljxg vxcdsr mzdlxl gksqg gbxsxs xqvz vgldq vmhqr mnjlf gnrpml xrmxxvn txrjf ljgmg bkls lrlgmm jndzl rpsnkz jxh thgljm djdgk qxfzc shh dcqkt ntqss (contains fish, nuts, peanuts) 17 | tpgtm qgvhn pnm vmftt rszfj bkls hhnxvg mlxh gksqg ttrjb ljgmg rxqd pxjgxr djmfxp sqsmc tbmn qdtfkcls dcj jvcjhg mlmf czn qxfzc snxvqf hhst vqxtr mkrf fxbk zchcj gnrpml nhqljxg nvfkp tdmfz nnsnh nd shltgt xrmxxvn vtrf bsjqq lvn gknhqs dcqtc qblrk dlr zhxvv jzs shrnc svzg rfmvh dclkt bksvfq rbcp cddpfxx jcb vmhqr jxh dbvqq bgclkbpr skzxjnc rdfr (contains soy) 18 | flr vtrqn mkrf jcb jxh xcx nvfkp lrlgmm pkmbb dcxncsm rxvc vtrf xqvz rzddk vcpk rdfr vmhqr ldpkn tdmfz fsfhp lpxc dbvqq rfmvh zjptr vqjct gnrpml gckzr gnvg khpdjv mltp mnjlf hqmkj lkbnjx rszfj gbxsxs vgbz pmm gksqg vspsdz qfnhsjj mlxh tbmn shltgt lxcxp pqxx ptjhk mzdlxl dvd tppnl bvvkd ltrzm qxfzc nhqljxg (contains dairy, nuts) 19 | rrtlfh nxs xhqh hkhkjm tbmn jzs dltgm bgfc pnm gjqt cqkrlq zhxvv jrr kjhdl vjqr qslbqf khpdjv ctbjc xcx mzdlxl hfkxc vqxtr jvcjhg qmzn jndzl frbq fxbx shrnc zjptr lpgvh vxcdsr qfnhsjj lkbnjx plpl gnrpml fhcpkt pxctl qvtfr qdtfkcls gbxsxs mfqrl rfmvh fnks dbvqq shltgt vfvtj pmm lmfr vtrqn rdfr ntqss zdrptcx lhpgn nhqljxg xgftsb xrqrlb bfncxv kfttq bkls lcpkxl mrffh xrmxxvn bgclkbpr dcqkt szztlx dclkt vmhqr qxfzc snxvqf dcqtc bqt rblnlnk pxjgxr gpg jncbh xntpv kdxs dvd xvn (contains eggs, fish, nuts) 20 | shh dcxncsm vqxtr vxcdsr gjqt zjptr vqjct xntpv zhxvv bsjqq rbcp snxvqf vmhqr rfqqg khpdjv rblnlnk lmfr fnks lkbnjx mltp shrnc mfqrl jpb skzxjnc dcj ntqss gnrpml rlqgq jzs bpkh vjqr cddpfxx jcb lpxc pgkm xrmxxvn rdfr pkmbb dltgm qjkng zbjjnvn xrqrlb rpsnkz gksqg vtrf jrr gpg knhvxg plpl jvcjhg bgfc vdgj tlrpk znrb vmftt tzkf jxh nd xcx lcpkxl fgngbms vspsdz mhbxmfq bxfbb qxfzc thgljm (contains wheat, peanuts) 21 | bvvkd bfncxv qfnhsjj vqxtr lrlgmm rbcp rfmvh tdvzl spmsczc lxcxp lhpgn dcxncsm qdtfkcls rdfr nvfkp vs kpmnz jxh rpsnkz pxctl gckzr zhtq ltrzm qslbqf khpdjv vtrf tlrpk vmhqr rzddk qtz rfqqg hqmkj mzdlxl vxcdsr sqsmc qxfzc bksvfq zjptr qfffx bsjqq bkls fxbx dcqtc hfkxc vcpk qblrk fgngbms jndzl pkmbb lpgvh qjcn fxbk ttrjb zdrptcx lpxc lcpkxl gbxsxs bdvkpj jncbh xvn xfhbfvp gnvg pnm lmfr bqt kjhdl hvllxq xrmxxvn (contains eggs, sesame) 22 | jpb jxh tbmn spmsczc vmhqr zchcj xhqh jvcjhg zhxvv qmzn xntpv vfvtj knhvxg dcxncsm mlmf nvfkp djmfxp sqsmc rdfr bsjqq tdvzl rbcp tpgtm xcx dbvqq ptjhk cqkrlq cbmvcj flr shrnc qslbqf tkg rfmvh ffnq gnrpml lpxc rxvc ltrzm qfffx qxfzc rxqd gksqg khpdjv ttrjb (contains sesame, wheat, dairy) 23 | kpmnz zdrptcx vfvtj rlqgq gbxsxs djdgk rdfr ptjhk nkff gksqg rfqqg tbmn dlr mfqrl qxfzc nxs djmfxp vmhqr dcqtc lhpgn skzxjnc pxjgxr kfttq lmfr fxbk svzg szztlx vqxtr dltgm snxvqf gnrpml kdxs ctbjc ltrzm pkmbb xfhbfvp xrqrlb nktph fsfhp ntqss rfmvh pnm tdmfz nhqljxg vcpk vrxp thgljm xrmxxvn lkbnjx hqmkj flr rxvc nvfkp khpdjv qvtfr vqjct bcpks qdtfkcls vgbz vtrqn (contains sesame) 24 | dclkt zchcj khpdjv rzddk bcpks jzs dlr qdtfkcls pbpgl pnm sqsmc vs nhqljxg xrmxxvn qtz tdmfz nnsnh snxvqf gnrpml qfffx pxjhvr jcb cddpfxx gksqg rdffqv mnjlf rrtlfh gknhqs rfmvh vspsdz zhtq tkg qjkng gbxsxs jxh mhbxmfq fxbx fsfhp fxbk cbmvcj rfqqg nd dvd vqxtr zzjt spmsczc tdvzl hrxjrg ctbjc vmhqr vcpk hhst qmzn frbq qgvhn tbmn lpxc kpmnz rdfr ffnq znrb bvvkd szztlx zdrptcx (contains nuts) 25 | nxs pbpgl qblrk ldpkn jcb svzg dltgm gxlzr lxcxp dcqkt dclkt jxh khpdjv bgfc ljgmg tdvzl vs qfffx hqmkj hvllxq lrlgmm lpxc ptjhk pxctl prdtb lhpgn pxjhvr spmsczc cqkrlq mltp vjqr rgx qkggr gpg mnjlf nvfkp fsfhp xvn dcj vtrf rlqgq vgldq fhcpkt fxbx dcqtc qjcn kpmnz jpb czn thgljm vxcdsr qdtfkcls ldgs frbq vrxp bcpks qjkng xrmxxvn pgkm fgngbms gknhqs ntqss tkg qxfzc rszfj rxvc qvtfr rzddk rfmvh lcpkxl xqvz gnrpml bpkh bqt rdfr jxxgtl lnjrvsz mlmf (contains eggs, soy) 26 | gjqt vfvtj rgx shltgt dvd tpgtm xqvz bfncxv lmfr fnks ltrzm sqsmc qmzn jncbh hkhkjm lvn pxjgxr jndzl qxfzc rxvc tbmn xgftsb gnrpml pbpgl qtz fxbk nkff szztlx rdffqv txrjf bksvfq rdfr mrffh vspsdz gknhqs jxh vmhqr rfmvh xrmxxvn xntpv dbvqq xbbcnx ntqss mltp nnsnh lhpgn tdmfz mkrf rlqgq lpgvh xhqh zchcj tppnl (contains nuts) 27 | xqvz zzjt gxlzr zdrptcx qdtfkcls qblrk hqmkj qxfzc fnks hfkxc vmftt rfmvh pxjgxr rblnlnk gnrpml xcx rxvc mnjlf vrxp bqt fhcpkt dcqkt pbpgl dcxncsm bgclkbpr vmhqr xrmxxvn rdfr tlrpk khpdjv rgx kpmnz mkrf gckzr mrffh fxbx jzs (contains nuts) 28 | pnm mlmf jxh zhtq lmfr hfkxc fxbx bvvkd zhxvv qmzn qxfzc gjqt vdgj lpxc bpkh sqsmc lrlgmm vfvtj vjqr rzddk vmhqr qjkng spmsczc dltgm tkg cpcxj rblnlnk mlxh svzg mnjlf vxcdsr gnrpml khpdjv qblrk rdffqv bsjqq rmhh rgx mhbxmfq bgfc rszfj qslbqf lhpgn pxjgxr lpgvh shh xrmxxvn gckzr kdxs tpgtm snxvqf kjhdl dcxncsm hrxjrg pgkm jzs vspsdz czn djmfxp xrqrlb rfmvh ctbjc lvn jpfq xfhbfvp zdrptcx qdtfkcls bxfbb nvfkp qvtfr pxjhvr (contains fish, wheat) 29 | mrffh prdtb vqxtr pqxx hrxjrg vgbz vmhqr jxh kfttq znrb rfmvh bkls pgkm bdvkpj qxfzc ldgs lnjrvsz pkmbb dcxncsm lpxc jpb shh pxjhvr qmzn lmfr skzxjnc lrlgmm vtrf mlmf bgclkbpr khpdjv gnrpml fnks zqrg ffnq bksvfq ntqss vqjct cmzz gknhqs tpgtm dcqkt vcpk knhvxg hqmkj hkhkjm snxvqf mfqrl tppnl jndzl bcpks dclkt rdfr bqt mltp frbq xvn djmfxp tdmfz bgfc jrr gckzr rbcp qjkng fhcpkt mhbxmfq ldpkn qfffx czn fgngbms jcb (contains fish, soy, dairy) 30 | zjptr rfmvh xntpv lxcxp znrb djdgk lpxc pgkm khpdjv fsfhp rmhh hfkxc pbpgl hhnxvg gknhqs qfffx gjqt nktph vgbz gksqg zbjjnvn cmzz qgvhn fxbk bdvkpj lkbnjx vjqr rrtlfh zchcj vcpk vrjh qblrk gbxsxs fxbx rdfr xhqh bcpks bsjqq pkmbb tdvzl hkhkjm xrqrlb dcqkt qslbqf jvcjhg zhxvv rgx thgljm mlxh bksvfq zqrg rxqd dbvqq bgfc ljgmg pxjgxr dcj shh mlmf xcx dcqtc ffnq rbcp vdgj dvd jncbh gpg tkg qfnhsjj jpfq pxctl qxfzc xrmxxvn jzs gnrpml vmhqr fnks tppnl ldpkn (contains peanuts) 31 | szztlx tdvzl rszfj jxxgtl nd pxjgxr gpg bgfc mfqrl qxfzc fhcpkt ltrzm bpkh jpb dcxncsm ldgs jxh pbpgl sqsmc lhpgn zdrptcx rfqqg bgclkbpr tdmfz bvvkd xgftsb hfkxc vrxp lvn rfmvh cbmvcj ljgmg rxqd gnrpml xbbcnx fgngbms qslbqf vqjct rbcp pxctl cmzz dcj zbjjnvn bcpks dclkt cpcxj mhbxmfq vcpk rxvc mzdlxl qgvhn gckzr fnks rdfr snxvqf qvtfr bfncxv vqxtr rlqgq kjhdl lmfr xrmxxvn dvd mkrf khpdjv mlxh gnvg hhnxvg flr vrjh lnjrvsz kfttq (contains nuts, peanuts, sesame) 32 | vxcdsr pmm dcj vmftt bgfc rxqd ttrjb nxs xrmxxvn kfttq qslbqf djmfxp dlr bgclkbpr cbmvcj xntpv bpkh gjqt shh kdxs xcx gckzr hvllxq rblnlnk jncbh jxh khpdjv flr dctqb cpcxj lcpkxl qxfzc zjptr xvn vtrf gknhqs qjkng kjhdl rfmvh tdvzl gnrpml nnsnh zchcj pxctl vrxp lxcxp fnks czn qvtfr gbxsxs bxfbb djdgk ffnq rdfr bsjqq pqxx jpb vqjct plpl (contains fish, soy) 33 | qmzn rfmvh rfqqg hvllxq lcpkxl dcqkt mlmf vtrqn kdxs gckzr rlqgq shrnc jncbh zzjt lpgvh rdfr frbq tdmfz vs vqxtr zhtq nktph ffgkmhh vqjct rrtlfh xcx vdgj zhxvv cmzz thgljm jpfq kpmnz gnrpml xrmxxvn vmhqr fhcpkt rpsnkz pgkm ntqss txrjf fnks nnsnh hqmkj tpgtm vgbz ctbjc xqvz lxcxp qvtfr qxfzc zqrg khpdjv lrlgmm jrr cbmvcj ldpkn rbcp vjqr (contains soy) 34 | rlqgq rblnlnk bxfbb xcx bkls mlxh ljgmg zbjjnvn mkrf ffgkmhh svzg cmzz dcqkt qslbqf mlmf vgbz prdtb tlrpk nnsnh qfffx lpgvh txrjf cqkrlq bqt tdmfz rfmvh rdffqv jrr jzs fhcpkt fsfhp qxfzc vmhqr shrnc bsjqq ldpkn lcpkxl vjqr vqjct jndzl skzxjnc bvvkd pgkm bdvkpj gnrpml bcpks rdfr bksvfq qtz gjqt qkggr dlr pxctl xrmxxvn kjhdl jxh (contains nuts) 35 | gjqt vtrf vrjh djmfxp rdfr hhst mnjlf vrxp pmm rdffqv bcpks ctbjc lpgvh vxcdsr qfnhsjj jncbh xqvz dctqb kjhdl nnsnh gnrpml zjptr hvllxq cmzz lmfr qxfzc nd vmhqr ptjhk hrxjrg qfffx lnjrvsz cddpfxx ljgmg xfhbfvp qkggr hhnxvg tdmfz qgvhn khpdjv plpl jxxgtl rlqgq dbvqq szztlx nvfkp mhbxmfq knhvxg cpcxj rpsnkz mzdlxl jxh bfncxv xrmxxvn jpfq mlxh nkff vtrqn fhcpkt bsjqq prdtb jzs flr (contains soy, eggs) 36 | rzddk mnjlf djmfxp bxfbb vrjh xrmxxvn gnrpml rfqqg mlxh dcxncsm xvn czn hhst jpfq qxfzc vqjct vdgj lnjrvsz mrffh rszfj vrxp rdfr shh cbmvcj frbq shrnc xcx khpdjv djdgk dctqb hvllxq ntqss dltgm shltgt spmsczc nktph tppnl bksvfq gknhqs mzdlxl tpgtm hrxjrg ldgs nxs pkmbb xqvz vfvtj rfmvh hfkxc sqsmc knhvxg lmfr tzkf jxh tkg vcpk rbcp nkff nhqljxg hkhkjm xhqh lvn pbpgl mltp qblrk pgkm (contains peanuts) 37 | cmzz qfnhsjj kdxs gpg ldgs vxcdsr znrb qdtfkcls dctqb svzg gbxsxs jxh kjhdl vtrqn ffgkmhh mnjlf nnsnh pqxx zdrptcx bxfbb lnjrvsz xrmxxvn rpsnkz dcqkt dcj cpcxj rfmvh qgvhn bqt pgkm ptjhk jpfq jzs rmhh fhcpkt qxfzc nktph qmzn mlmf qblrk nxs nkff xbbcnx djmfxp gnrpml mzdlxl bksvfq tlrpk thgljm rgx vrxp rdfr dcqtc mlxh vqjct nhqljxg ctbjc lhpgn xhqh ldpkn pbpgl fnks jvcjhg bvvkd vmhqr jrr nvfkp hvllxq (contains eggs, peanuts) 38 | xhqh cbmvcj hhnxvg dcqtc khpdjv vmhqr nvfkp flr gpg ntqss rxqd bgclkbpr bsjqq mrffh thgljm jpb gjqt lnjrvsz txrjf lpgvh rdfr vfvtj bgfc bksvfq gnvg rdffqv fhcpkt pbpgl gckzr jxh tlrpk xrmxxvn ltrzm jndzl czn ctbjc qvtfr bdvkpj gnrpml pgkm vgbz qxfzc bqt tpgtm szztlx ffgkmhh dcqkt qtz qmzn zqrg rblnlnk mfqrl plpl mltp hkhkjm vgldq pqxx zjptr rmhh xbbcnx qkggr djmfxp (contains dairy, soy) 39 | rfqqg pbpgl vqjct lhpgn khpdjv cddpfxx gnvg xgftsb mltp xntpv kdxs sqsmc gjqt fhcpkt vmhqr nd pnm mnjlf mlmf szztlx fxbk qjkng snxvqf hvllxq xcx frbq bkls skzxjnc gnrpml zhtq ffgkmhh svzg ntqss xrmxxvn vtrqn qxfzc fgngbms rdfr rfmvh dcqkt hrxjrg thgljm gksqg (contains fish, sesame) 40 | vtrf tkg xrmxxvn tzkf rlqgq lnjrvsz bxfbb vcpk rgx pnm nd rfmvh lhpgn vxcdsr fhcpkt qtz lcpkxl jxh nkff gnrpml vrjh rdfr vdgj jvcjhg jcb fxbk rbcp gjqt bfncxv dclkt ffgkmhh zhtq gksqg sqsmc vmhqr mhbxmfq knhvxg ttrjb qblrk bkls gknhqs zzjt zjptr pkmbb gpg lkbnjx mkrf xhqh vgldq rxvc ptjhk skzxjnc czn lrlgmm ltrzm mfqrl qjkng rszfj bgclkbpr bqt jndzl hkhkjm bdvkpj pxjhvr rxqd mlmf vtrqn lmfr bcpks mrffh qvtfr shltgt cpcxj djmfxp ctbjc hhnxvg pbpgl zhxvv kfttq pqxx xbbcnx nhqljxg nxs znrb dcxncsm qxfzc vmftt jxxgtl xfhbfvp (contains wheat) 41 | mkrf znrb pkmbb kpmnz gckzr mnjlf pxjgxr fsfhp shrnc jncbh txrjf nktph rdfr gxlzr xqvz kjhdl gjqt dltgm qxfzc plpl vgbz xgftsb qfffx fxbk rpsnkz frbq rbcp cddpfxx prdtb jxh vjqr tdvzl bcpks dcxncsm vspsdz gknhqs tkg qkggr gnvg rxvc khpdjv rfqqg qvtfr dbvqq hvllxq ltrzm xntpv bpkh gnrpml kfttq lcpkxl rfmvh xrmxxvn vxcdsr cmzz rmhh ptjhk ljgmg (contains soy) 42 | gxlzr qxfzc ltrzm jxh hhst qgvhn bgfc rzddk rfmvh tppnl vmhqr lvn vqjct rdfr lhpgn gjqt xgftsb cqkrlq vdgj lnjrvsz vgldq qjcn rszfj qfffx pxjhvr gnrpml ttrjb xrmxxvn lcpkxl djdgk dctqb ldgs rxqd qfnhsjj zqrg qmzn vtrqn bdvkpj pkmbb mfqrl pnm bfncxv mzdlxl zzjt dclkt xrqrlb shrnc ffnq mrffh shh knhvxg hfkxc pxctl mnjlf djmfxp fgngbms znrb fxbx tzkf cmzz svzg vcpk rblnlnk (contains sesame, dairy) 43 | xrmxxvn rdfr czn zhxvv gnrpml qfffx lxcxp lrlgmm pqxx txrjf khpdjv vdgj pgkm mltp vtrf cqkrlq kdxs vmhqr xntpv rrtlfh tzkf qxfzc tkg dltgm vgbz bgclkbpr bdvkpj qkggr qslbqf jrr pkmbb ltrzm rfmvh fxbx ptjhk ldpkn tlrpk bvvkd hfkxc nvfkp (contains sesame, fish, nuts) 44 | skzxjnc lkbnjx mlmf lpgvh rpsnkz thgljm dlr vmhqr tzkf tppnl jpfq pgkm rdfr mlxh vjqr qmzn rblnlnk vqxtr dcj bqt gckzr ljgmg nd czn tdvzl rfmvh gnrpml gbxsxs hhst xbbcnx pkmbb jxh lrlgmm rgx ldpkn djmfxp qxfzc tkg bcpks jzs zzjt kdxs qkggr tpgtm vspsdz zbjjnvn bdvkpj xrmxxvn qvtfr bfncxv mhbxmfq mnjlf dbvqq rmhh gxlzr (contains eggs, sesame) 45 | gksqg qxfzc lxcxp kfttq dvd frbq vtrqn cbmvcj qvtfr tbmn rmhh vcpk rrtlfh qgvhn khpdjv jxh lhpgn gpg rpsnkz vfvtj ntqss zqrg bksvfq zzjt kdxs cqkrlq jzs thgljm shh hhnxvg dcqtc zchcj sqsmc dclkt bqt fgngbms vmhqr tpgtm nhqljxg bkls jxxgtl tppnl bpkh kpmnz vjqr bdvkpj flr ffnq skzxjnc xcx ptjhk zbjjnvn hkhkjm bxfbb jncbh lmfr nvfkp lkbnjx dcxncsm rdffqv rdfr pkmbb vqjct rlqgq mrffh jvcjhg jcb nkff rfmvh rzddk vrxp vspsdz cpcxj pnm gnrpml mlmf vtrf ltrzm rxvc fhcpkt xbbcnx (contains fish) -------------------------------------------------------------------------------- /inputs/day22.txt: -------------------------------------------------------------------------------- 1 | Player 1: 2 | 21 3 | 48 4 | 44 5 | 31 6 | 29 7 | 5 8 | 23 9 | 11 10 | 12 11 | 27 12 | 49 13 | 22 14 | 18 15 | 7 16 | 15 17 | 20 18 | 2 19 | 45 20 | 14 21 | 17 22 | 40 23 | 35 24 | 6 25 | 24 26 | 41 27 | 28 | Player 2: 29 | 47 30 | 1 31 | 10 32 | 16 33 | 28 34 | 37 35 | 8 36 | 26 37 | 46 38 | 25 39 | 3 40 | 9 41 | 34 42 | 50 43 | 32 44 | 36 45 | 43 46 | 4 47 | 42 48 | 33 49 | 19 50 | 13 51 | 38 52 | 39 53 | 30 -------------------------------------------------------------------------------- /inputs/day23.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joelgrus/advent2020/ef4609d0aaf631834d595da79b0d5dccb2bc51fa/inputs/day23.txt -------------------------------------------------------------------------------- /inputs/day25.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joelgrus/advent2020/ef4609d0aaf631834d595da79b0d5dccb2bc51fa/inputs/day25.txt -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [tool.poetry] 2 | name = "advent2020" 3 | version = "0.1.0" 4 | description = "" 5 | authors = ["Joel Grus "] 6 | 7 | [tool.poetry.dependencies] 8 | python = "^3.8" 9 | pandas = "^1.1.4" 10 | numpy = "^1.19.4" 11 | pdbpp = "^0.10.2" 12 | ipython = "^7.19.0" 13 | black = "^20.8b1" 14 | flake8 = "^3.8.4" 15 | isort = "^5.6.4" 16 | mypy = "^0.790" 17 | 18 | [tool.poetry.dev-dependencies] 19 | pytest = "^5.2" 20 | 21 | [build-system] 22 | requires = ["poetry>=0.12"] 23 | build-backend = "poetry.masonry.api" 24 | -------------------------------------------------------------------------------- /tests/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joelgrus/advent2020/ef4609d0aaf631834d595da79b0d5dccb2bc51fa/tests/__init__.py --------------------------------------------------------------------------------