├── 2020 ├── 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 ├── day15.py ├── day16.py ├── day17.py ├── day18.py ├── day19.py ├── day20.py ├── day21.py ├── day22.py ├── day23.py ├── day24.py ├── day25.py └── input_files │ ├── day01 │ ├── day02 │ ├── day03 │ ├── day04 │ ├── day05 │ ├── day06 │ ├── day07 │ ├── day08 │ ├── day09 │ ├── day10 │ ├── day11 │ ├── day12 │ ├── day13 │ ├── day14 │ ├── day15 │ ├── day16 │ ├── day17 │ ├── day18 │ ├── day19 │ ├── day20 │ ├── day21 │ ├── day22 │ ├── day23 │ ├── day24 │ └── day25 ├── 2021 ├── 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 ├── day15.py ├── day16.py ├── day17.py ├── day18.py ├── day19.py ├── day20.py ├── day21.py ├── day22.py ├── day23.py ├── day24.py ├── day25.py └── input_files │ ├── day01 │ ├── day02 │ ├── day03 │ ├── day04 │ ├── day05 │ ├── day06 │ ├── day07 │ ├── day08 │ ├── day09 │ ├── day10 │ ├── day11 │ ├── day12 │ ├── day13 │ ├── day14 │ ├── day15 │ ├── day16 │ ├── day17 │ ├── day18 │ ├── day19 │ ├── day20 │ ├── day21 │ ├── day22 │ ├── day23 │ ├── day24 │ └── day25 ├── 2022 ├── 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 └── input_files │ ├── day01 │ ├── day02 │ ├── day03 │ ├── day04 │ ├── day05 │ ├── day06 │ ├── day07 │ ├── day08 │ ├── day09 │ ├── day10 │ ├── day11 │ ├── day12 │ ├── day13 │ └── day14 ├── 2024 ├── day01.py ├── day02.py ├── day03.py ├── day04.py ├── day05.py ├── day06.py ├── day07.py └── input_files │ ├── day01 │ ├── day02 │ ├── day03 │ ├── day04 │ ├── day05 │ ├── day06 │ └── day07 └── README.md /2020/day01.py: -------------------------------------------------------------------------------- 1 | with open('input_files/day01') as f: 2 | data = {int(x) for x in f} 3 | 4 | for x in data: 5 | if 2020 - x in data: 6 | print(x * (2020 - x)) 7 | break 8 | 9 | list_data = list(data) 10 | for i in range(len(data) - 2): 11 | for j in range(len(data) - 1): 12 | if 2020 - list_data[i] - list_data[j] in data: 13 | print(list_data[i] * list_data[j] * (2020 - list_data[i] - list_data[j])) 14 | break 15 | else: 16 | continue 17 | break 18 | -------------------------------------------------------------------------------- /2020/day02.py: -------------------------------------------------------------------------------- 1 | import re 2 | 3 | 4 | with open('input_files/day02') as f: 5 | data = re.findall(r'(\d+)-(\d+) (\w): (\w+)', f.read()) 6 | data = [(int(fr), int(to), c, word) for fr, to, c, word in data] 7 | 8 | print(sum(fr <= word.count(c) <= to for fr, to, c, word in data)) 9 | 10 | print(sum((word[fr-1] == c) != (word[to - 1] == c) for fr, to, c, word in data)) 11 | -------------------------------------------------------------------------------- /2020/day03.py: -------------------------------------------------------------------------------- 1 | with open('input_files/day03') as f: 2 | data = f.read().split() 3 | 4 | width = len(data[0]) 5 | print(sum(data[i][(i * 3) % width] == '#' for i in range(len(data)))) 6 | 7 | prod = 1 8 | for xd, yd in [(1, 1), (3, 1), (5, 1), (7, 1), (1, 2)]: 9 | prod *= sum(data[i * yd][(i * xd) % width] == '#' for i in range(len(data) // yd)) 10 | print(prod) 11 | -------------------------------------------------------------------------------- /2020/day04.py: -------------------------------------------------------------------------------- 1 | import re 2 | 3 | 4 | with open('input_files/day04') as f: 5 | data = f.read().split('\n\n') 6 | data = [dict(entry.split(':') for entry in item.split()) for item in data] 7 | 8 | keys = {'byr', 'iyr', 'eyr', 'hgt', 'hcl', 'ecl', 'pid'} 9 | print(sum(not keys - pport.keys() for pport in data)) 10 | 11 | valid_pports = 0 12 | for pport in data: 13 | valid_pports += \ 14 | not keys - pport.keys() and \ 15 | all((1920 <= int(pport['byr']) <= 2002, 16 | 2010 <= int(pport['iyr']) <= 2020, 17 | 2020 <= int(pport['eyr']) <= 2030, 18 | (pport['hgt'].endswith('cm') and 150 <= int(pport['hgt'][:-2]) <= 193) or 19 | (pport['hgt'].endswith('in') and 59 <= int(pport['hgt'][:-2]) <= 76), 20 | re.match(r'^#[\da-f]{6}$', pport['hcl']), 21 | pport['ecl'] in ['amb', 'blu', 'brn', 'gry', 'grn', 'hzl', 'oth'], 22 | re.match(r'^\d{9}$', pport['pid']))) 23 | print(valid_pports) 24 | -------------------------------------------------------------------------------- /2020/day05.py: -------------------------------------------------------------------------------- 1 | import re 2 | 3 | 4 | with open('input_files/day05') as f: 5 | data = f.read() 6 | data = re.sub(r'[FL]', '0', data) 7 | data = re.sub(r'[BR]', '1', data) 8 | data = data.split() 9 | data = {int(x, 2) for x in data} 10 | 11 | print(m := max(data)) 12 | 13 | print(next(x for x in range(m) if x not in data and x - 1 in data)) 14 | -------------------------------------------------------------------------------- /2020/day06.py: -------------------------------------------------------------------------------- 1 | from functools import reduce 2 | 3 | 4 | with open('input_files/day06') as f: 5 | data = f.read().split('\n\n') 6 | 7 | print(sum(len(set(group.replace('\n', ''))) for group in data)) 8 | 9 | count = 0 10 | for group in data: 11 | answers = (set(ans) for ans in group.split()) 12 | count += len(reduce((lambda x, y: x & y), answers)) 13 | print(count) 14 | -------------------------------------------------------------------------------- /2020/day07.py: -------------------------------------------------------------------------------- 1 | import re 2 | from collections import defaultdict 3 | 4 | 5 | with open('input_files/day07') as f: 6 | data = f.read().split('\n') 7 | 8 | forward_edges = {} 9 | backward_edges = defaultdict(set) 10 | for line in data: 11 | colour = re.match(r'(.+) bags contain', line).group(1) 12 | containees = re.findall(r'(\d+) (.+?) bag', line) 13 | containees = [(int(x), word) for x, word in containees] 14 | 15 | forward_edges[colour] = containees 16 | for _, containee in containees: 17 | backward_edges[containee].add(colour) 18 | 19 | gold_bags = set() 20 | bags = set(backward_edges['shiny gold']) 21 | while bags: 22 | bag = bags.pop() 23 | gold_bags.add(bag) 24 | bags |= backward_edges[bag] 25 | print(len(gold_bags)) 26 | 27 | n_bags = 0 28 | bags = list(forward_edges['shiny gold']) 29 | while bags: 30 | bag = bags.pop() 31 | n_bags += bag[0] 32 | bags += [(bag[0] * x, colour) for x, colour in forward_edges[bag[1]]] 33 | print(n_bags) 34 | -------------------------------------------------------------------------------- /2020/day08.py: -------------------------------------------------------------------------------- 1 | import re 2 | 3 | 4 | def run(): 5 | accumulator = 0 6 | visited = set() 7 | i = 0 8 | while i not in visited and i < len(data): 9 | visited.add(i) 10 | instr, val = data[i] 11 | if instr == 'acc': 12 | accumulator += val 13 | if instr == 'jmp': 14 | i += val - 1 15 | i += 1 16 | return accumulator, i >= len(data) 17 | 18 | 19 | with open('input_files/day08') as f: 20 | data = re.findall(r'(.+?) ([+-]\d+)', f.read()) 21 | data = [(instr, int(val)) for instr, val in data] 22 | 23 | print(run()[0]) 24 | 25 | for i in (idx for idx in range(len(data)) if data[idx][0] in ('nop', 'jmp')): 26 | instr, val = data[i] 27 | data[i] = 'nop' if instr == 'jmp' else 'jmp', val 28 | 29 | acc, finished = run() 30 | if finished: 31 | print(acc) 32 | break 33 | 34 | data[i] = instr, val 35 | -------------------------------------------------------------------------------- /2020/day09.py: -------------------------------------------------------------------------------- 1 | with open('input_files/day09') as f: 2 | data = [int(x) for x in f] 3 | 4 | for i in range(25, len(data)): 5 | nums = set(data[i-25: i]) 6 | if all(data[i] - x not in nums for x in nums): 7 | print(data[i]) 8 | break 9 | 10 | idx = i 11 | for i in range(idx): 12 | for j in range(i+2, idx): 13 | values = data[i:j] 14 | if sum(values) == data[idx]: 15 | print(min(values) + max(values)) 16 | break 17 | else: 18 | continue 19 | break 20 | -------------------------------------------------------------------------------- /2020/day10.py: -------------------------------------------------------------------------------- 1 | from collections import Counter 2 | from operator import sub 3 | 4 | 5 | with open('input_files/day10') as f: 6 | data = [0] + sorted(int(x) for x in f) 7 | data.append(data[-1] + 3) 8 | 9 | diffs = map(sub, data[1:], data) 10 | count = Counter(diffs) 11 | print(count[1] * count[3]) 12 | 13 | paths = [0] * (len(data) - 1) + [1] 14 | for i in range(len(data) - 2, -1, -1): 15 | for j in range(i + 1, i + 4): 16 | if j < len(data) and data[j] - 3 <= data[i]: 17 | paths[i] += paths[j] 18 | print(paths[0]) 19 | -------------------------------------------------------------------------------- /2020/day11.py: -------------------------------------------------------------------------------- 1 | def step_cell(neighbours): 2 | for i in range(1, height - 1): 3 | for j in range(1, width - 1): 4 | if data[i][j] != '.': 5 | n = neighbours(i, j) 6 | if vals[i][j] == 0 and n == 0: 7 | temp[i][j] = 1 8 | if vals[i][j] == 1 and n >= 5: 9 | temp[i][j] = 0 10 | 11 | 12 | with open('input_files/day11') as f: 13 | data = [['.'] + list(line) + ['.'] for line in f.read().split()] 14 | 15 | width = len(data[0]) 16 | data = [['.'] * width] + data + [['.'] * width] 17 | height = len(data) 18 | 19 | 20 | vals = [[0] * width for _ in range(height)] 21 | while True: 22 | temp = [list(line) for line in vals] 23 | 24 | row_sum = [[sum(x) for x in zip(vals[i], vals[i][1:], vals[i][2:])] for i in range(height)] 25 | col_sum = [[sum(x) for x in zip(row_sum[i - 1], row_sum[i], row_sum[i + 1])] for i in range(1, height - 1)] 26 | 27 | step_cell(lambda i, j: col_sum[i - 1][j - 1]) 28 | if temp == vals: 29 | break 30 | vals = temp 31 | 32 | print(sum(x for line in vals for x in line)) 33 | 34 | edges = [[[] for _ in range(width)] for _ in range(height)] 35 | for i in range(1, height - 1): 36 | for j in range(1, width - 1): 37 | for xd, yd in (-1, -1), (-1, 0), (-1, 1), (0, -1), (0, 1), (1, -1), (1, 0), (1, 1): 38 | y, x = i + yd, j + xd 39 | while 0 <= y < height and 0 <= x < width: 40 | if data[y][x] != '.': 41 | edges[i][j].append((y, x)) 42 | break 43 | y, x = y + yd, x + xd 44 | 45 | vals = [[0] * width for _ in data] 46 | while True: 47 | temp = [list(line) for line in vals] 48 | step_cell(lambda i, j: sum(vals[y][x] for y, x in edges[i][j])) 49 | if temp == vals: 50 | break 51 | vals = temp 52 | 53 | print(sum(x for line in vals for x in line)) 54 | -------------------------------------------------------------------------------- /2020/day12.py: -------------------------------------------------------------------------------- 1 | import re 2 | 3 | with open('input_files/day12') as f: 4 | data = re.findall(r'(\w)(\d+)', f.read()) 5 | data = [(instr, int(val)) for instr, val in data] 6 | 7 | angle = 0 8 | angles = {0: 'E', 90: 'N', 180: 'W', 270: 'S'} 9 | pos = {'E': 0, 'N': 0, 'W': 0, 'S': 0} 10 | for instr, val in data: 11 | if instr == 'R': 12 | val = -val 13 | if instr in 'LR': 14 | angle = (angle + val) % 360 15 | else: 16 | if instr == 'F': 17 | instr = angles[angle] 18 | pos[instr] += val 19 | 20 | print(abs(pos['E'] - pos['W']) + abs(pos['N'] - pos['S'])) 21 | 22 | x, y = 0, 0 23 | wx, wy = 10, 1 24 | deltas = {'E': (1, 0), 'N': (0, 1), 'W': (-1, 0), 'S': (0, -1)} 25 | sin = {0: 0, 90: 1, 180: 0, 270: -1, 360: 0} 26 | for instr, val in data: 27 | if instr == 'R': 28 | val = (-val) % 360 29 | if instr in 'LR': 30 | s, c = sin[val], sin[val + 90] 31 | wx, wy = round(wx * c - wy * s), round(wx * s + wy * c) 32 | elif instr == 'F': 33 | x, y = x + wx * val, y + wy * val 34 | else: 35 | xd, yd = deltas[instr] 36 | wx, wy = wx + xd * val, wy + yd * val 37 | 38 | print(abs(x) + abs(y)) 39 | -------------------------------------------------------------------------------- /2020/day13.py: -------------------------------------------------------------------------------- 1 | from math import prod 2 | 3 | with open('input_files/day13') as f: 4 | arrival, ids = f.read().split() 5 | arrival = int(arrival) 6 | ids = ids.split(',') 7 | times = [(int(x), -i) for i, x in enumerate(ids) if x != 'x'] 8 | 9 | 10 | dep = arrival 11 | while True: 12 | if any(dep % (t := time) == 0 for time, _ in times): 13 | break 14 | dep += 1 15 | 16 | print((dep - arrival) * t) 17 | 18 | 19 | N = prod(time for time, _ in times) 20 | time = 0 21 | for m, bi in times: 22 | Ni = N // m 23 | xi = Ni ** (m - 2) % m 24 | time += bi * Ni * xi 25 | 26 | print(time % N) 27 | -------------------------------------------------------------------------------- /2020/day14.py: -------------------------------------------------------------------------------- 1 | import re 2 | 3 | with open('input_files/day14') as f: 4 | data = re.findall(r'(.+) = (.+)', f.read()) 5 | 6 | mask0s = 0 7 | mask1s = 0 8 | mem = {} 9 | for instr, val in data: 10 | if instr == 'mask': 11 | mask0s = int(val.replace('X', '1'), 2) 12 | mask1s = int(val.replace('X', '0'), 2) 13 | else: 14 | loc = instr[4:-1] 15 | mem[loc] = int(val) & mask0s | mask1s 16 | 17 | print(sum(mem.values())) 18 | 19 | mask = '' 20 | mem = {} 21 | for instr, val in data: 22 | if instr == 'mask': 23 | mask1s = int(val.replace('X', '0'), 2) 24 | mask = val 25 | else: 26 | loc = int(instr[4:-1]) 27 | locs = [loc | mask1s] 28 | idxs = (idx for idx, x in enumerate(reversed(mask)) if x == 'X') 29 | for i in idxs: 30 | temp_locs = [loc & ~(1 << i) for loc in locs] 31 | temp_locs += [loc | (1 << i) for loc in locs] 32 | locs = temp_locs 33 | mem |= {loc: int(val) for loc in locs} 34 | 35 | print(sum(mem.values())) 36 | -------------------------------------------------------------------------------- /2020/day15.py: -------------------------------------------------------------------------------- 1 | from collections import defaultdict 2 | 3 | with open('input_files/day15') as f: 4 | data = f.read().split(',') 5 | data = [int(x) for x in data] 6 | 7 | 8 | def run(finish): 9 | numbers = defaultdict(list) 10 | numbers |= {data[i]: [i + 1] for i in range(len(data))} 11 | 12 | last = data[-1] 13 | for i in range(len(data) + 1, finish + 1): 14 | if len(numbers[last]) > 1: 15 | last = numbers[last][-1] - numbers[last][-2] 16 | else: 17 | last = 0 18 | numbers[last].append(i) 19 | return last 20 | 21 | 22 | print(run(2020)) 23 | print(run(30000000)) 24 | -------------------------------------------------------------------------------- /2020/day16.py: -------------------------------------------------------------------------------- 1 | import re 2 | from math import prod 3 | 4 | with open('input_files/day16') as f: 5 | rules, ticket, others = f.read().split('\n\n') 6 | 7 | rules = re.findall(r'(.+): (\d+)-(\d+) or (\d+)-(\d+)', rules) 8 | rules = [(n, *map(int, vals)) for n, *vals in rules] 9 | 10 | ticket = ticket.split('\n')[1].split(',') 11 | ticket = [int(x) for x in ticket] 12 | 13 | others = others.split('\n')[1:] 14 | others = [tuple(map(int, other.split(','))) for other in others] 15 | 16 | valid_numbers = set() 17 | valid_numbers.update(*(range(r[1], r[2] + 1) for r in rules)) 18 | valid_numbers.update(*(range(r[3], r[4] + 1) for r in rules)) 19 | 20 | total = 0 21 | for other in others: 22 | total += sum(val for val in other if val not in valid_numbers) 23 | 24 | print(total) 25 | 26 | others = [other for other in others if all(val in valid_numbers for val in other)] 27 | 28 | possible_rules = [set(rules) for _ in rules] 29 | for other in others: 30 | for i, val in enumerate(other): 31 | possible_rules[i] = {r for r in possible_rules[i] if r[1] <= val <= r[2] or r[3] <= val <= r[4]} 32 | 33 | rules = {} 34 | while len(rules) < len(ticket): 35 | for i, possible_rule in enumerate(possible_rules): 36 | if len(possible_rule) == 1: 37 | rules[i] = possible_rule.pop() 38 | for other_rules in possible_rules: 39 | other_rules.discard(rules[i]) 40 | 41 | val = prod(ticket[i] for i, rule in rules.items() if 'departure' in rule[0]) 42 | 43 | print(val) 44 | -------------------------------------------------------------------------------- /2020/day17.py: -------------------------------------------------------------------------------- 1 | from itertools import product 2 | from operator import add 3 | 4 | with open('input_files/day17') as f: 5 | data = [list(line) for line in f.read().split('\n')] 6 | 7 | 8 | def run(dims): 9 | deltas = list(product((-1, 0, 1), repeat=dims)) 10 | cells = {} 11 | for i in range(len(data)): 12 | for j in range(len(data[0])): 13 | if data[i][j] == '#': 14 | coord = (i, j) + (0,) * (dims - 2) 15 | cells[coord] = 1 16 | 17 | for i in range(6): 18 | temp = {} 19 | for coord in cells.keys(): 20 | n = sum(cells.get(tuple(map(add, coord, delta)), 0) for delta in deltas) 21 | if n == 3 or n == 4: 22 | temp[coord] = 1 23 | 24 | for neighbour in deltas: 25 | neighbour = tuple(map(add, coord, neighbour)) 26 | if neighbour not in cells: 27 | n = sum(cells.get(tuple(map(add, neighbour, delta)), 0) for delta in deltas) 28 | if n == 3: 29 | temp[neighbour] = 1 30 | cells = temp 31 | return len(cells) 32 | 33 | 34 | print(run(3)) 35 | print(run(4)) 36 | -------------------------------------------------------------------------------- /2020/day18.py: -------------------------------------------------------------------------------- 1 | import re 2 | 3 | with open('input_files/day18') as f: 4 | data = f.read().split('\n') 5 | data = [line.replace(' ', '') for line in data] 6 | 7 | 8 | def evaluate1(expr): 9 | while '(' in expr: 10 | expr = re.sub(r'\(([^()]+)\)', lambda m: str(evaluate1(m.group(1))), expr) 11 | while '+' in expr or '*' in expr: 12 | expr = re.sub(r'^(\d+)\+(\d+)', lambda m: str(int(m.group(1)) + int(m.group(2))), expr) 13 | expr = re.sub(r'^(\d+)\*(\d+)', lambda m: str(int(m.group(1)) * int(m.group(2))), expr) 14 | return int(expr) 15 | 16 | 17 | def evaluate2(expr): 18 | while '(' in expr: 19 | expr = re.sub(r'\(([^()]+)\)', lambda m: str(evaluate2(m.group(1))), expr) 20 | while '+' in expr: 21 | expr = re.sub(r'(\d+)\+(\d+)', lambda m: str(int(m.group(1)) + int(m.group(2))), expr) 22 | while '*' in expr: 23 | expr = re.sub(r'(\d+)\*(\d+)', lambda m: str(int(m.group(1)) * int(m.group(2))), expr) 24 | return int(expr) 25 | 26 | 27 | total = sum(evaluate1(expr) for expr in data) 28 | print(total) 29 | 30 | total = sum(evaluate2(expr) for expr in data) 31 | print(total) 32 | -------------------------------------------------------------------------------- /2020/day19.py: -------------------------------------------------------------------------------- 1 | import re 2 | 3 | with open('input_files/day19') as f: 4 | rule_strings, messages = f.read().split('\n\n') 5 | 6 | rule_strings = dict(rule.split(': ') for rule in rule_strings.splitlines()) 7 | messages = messages.splitlines() 8 | 9 | 10 | def get_expr(n, opt_rules=None): 11 | if opt_rules and n in opt_rules: 12 | return opt_rules[n] 13 | 14 | if m := re.match(r'"(\w)"', rule_strings[n]): 15 | return m.group(1) 16 | 17 | expr = [] 18 | for rule in rule_strings[n].split(' | '): 19 | values = rule.split() 20 | expr.append(''.join(get_expr(v, opt_rules) for v in values)) 21 | expr = '|'.join(expr) 22 | return fr'(?:{expr})' 23 | 24 | 25 | rule0 = get_expr('0') 26 | total = sum(bool(re.fullmatch(rule0, message)) for message in messages) 27 | print(total) 28 | 29 | rule42 = get_expr('42') 30 | rule31 = get_expr('31') 31 | rule8 = fr'(?:{rule42}+)' 32 | rule11 = fr"(?:{'|'.join(f'{rule42}{{{n}}}{rule31}{{{n}}}' for n in range(1, max(map(len, messages)) // 4))})" 33 | opt_rules = {'8': rule8, '11': rule11} 34 | 35 | rule0 = get_expr('0', opt_rules) 36 | total = sum(bool(re.fullmatch(rule0, message)) for message in messages) 37 | print(total) 38 | -------------------------------------------------------------------------------- /2020/day20.py: -------------------------------------------------------------------------------- 1 | import re 2 | from math import prod 3 | 4 | with open('input_files/day20') as f: 5 | tiles = dict(re.findall(r'Tile (\d+):\n([.#\n]+)', f.read())) 6 | tiles = {int(tile_id): [list(line) for line in tile.split()] for tile_id, tile in tiles.items()} 7 | 8 | 9 | def transformations(tile): 10 | transformations = [list(tile), list(reversed(tile))] 11 | transformations += [[list(reversed(line)) for line in t] for t in transformations] 12 | transformations += [list(list(row) for row in zip(*t[::-1])) for t in transformations] 13 | return transformations 14 | 15 | 16 | n = int(len(tiles) ** .5) 17 | row = [tiles.popitem()] 18 | while len(row) < n: 19 | line_len = len(row) 20 | right_edge = [line[-1] for line in row[-1][1]] 21 | for id_, tile in tiles.items(): 22 | for t in transformations(tile): 23 | left_edge = [line[0] for line in t] 24 | if right_edge == left_edge: 25 | row.append((id_, t)) 26 | break 27 | else: 28 | continue 29 | tiles.pop(id_) 30 | break 31 | if line_len == len(row): 32 | row.reverse() 33 | for _, t in row: 34 | for line in t: 35 | line.reverse() 36 | 37 | rows = [row] 38 | while len(rows) < n: 39 | new_row = [] 40 | for _, tile in rows[-1]: 41 | bottom_edge = tile[-1] 42 | for id_, next_tile in tiles.items(): 43 | for t in transformations(next_tile): 44 | top_edge = t[0] 45 | if bottom_edge == top_edge: 46 | new_row.append((id_, t)) 47 | break 48 | else: 49 | continue 50 | tiles.pop(id_) 51 | break 52 | if len(new_row) != n: 53 | rows.reverse() 54 | for row in rows: 55 | for _, t in row: 56 | t.reverse() 57 | else: 58 | rows.append(new_row) 59 | 60 | corner_ids = [rows[0][0][0], rows[0][-1][0], rows[-1][0][0], rows[-1][-1][0]] 61 | print(prod(corner_ids)) 62 | 63 | rows = [[[line[1:-1] for line in tile[1:-1]] for _, tile in row] for row in rows] 64 | rows = [[sum(line, []) for line in zip(*row)] for row in rows] 65 | rows = sum(rows, []) 66 | width = len(rows[0]) 67 | transformed_rows = transformations(rows) 68 | 69 | monster = ' # \n# ## ## ###\n # # # # # # ' 70 | monster_parts = monster.count('#') 71 | monster_height = monster.count('\n') + 1 72 | monster_width = len(monster) // monster_height 73 | monster = monster.replace(' ', r'[.#]') 74 | monster = monster.replace('\n', f'(?:.|\n){{{width - monster_width + 1}}}') 75 | 76 | for map_ in transformed_rows: 77 | map_ = '\n'.join(''.join(row) for row in map_) 78 | substrings = (map_[i:i + width * monster_height + 1] for i in range(len(map_) - width * monster_height + 1)) 79 | monsters = sum(bool(re.match(monster, substring)) for substring in substrings) 80 | if monsters: 81 | print(map_.count('#') - monster_parts * monsters) 82 | break 83 | -------------------------------------------------------------------------------- /2020/day21.py: -------------------------------------------------------------------------------- 1 | import re 2 | from collections import Counter 3 | 4 | with open('input_files/day21') as f: 5 | foods = f.read().splitlines() 6 | 7 | count = Counter() 8 | known = {} 9 | for food in foods: 10 | ingredients, allergens = re.match(r'(.+) \(contains (.+)\)', food).groups() 11 | ingredients = ingredients.split() 12 | count.update(ingredients) 13 | for allergen in allergens.split(', '): 14 | if allergen in known: 15 | known[allergen] &= set(ingredients) 16 | else: 17 | known[allergen] = set(ingredients) 18 | 19 | unsafe_ingredients = set.union(*known.values()) 20 | 21 | print(sum(c for ingredient, c in count.items() if ingredient not in unsafe_ingredients)) 22 | 23 | matched = set() 24 | while len(matched) < len(known): 25 | for allergen, ingredients in known.items(): 26 | if len(ingredients) == 1: 27 | matched.update(ingredients) 28 | else: 29 | known[allergen] -= matched 30 | 31 | print(','.join(ingredient.pop() for _, ingredient in sorted(known.items()))) 32 | -------------------------------------------------------------------------------- /2020/day22.py: -------------------------------------------------------------------------------- 1 | from collections import deque 2 | from itertools import islice 3 | 4 | with open('input_files/day22') as f: 5 | player1, player2 = f.read().split('\n\n') 6 | player1, player2 = player1.split('\n')[1:], player2.split('\n')[1:] 7 | player1, player2 = deque(map(int, player1)), deque(map(int, player2)) 8 | 9 | deck1, deck2 = deque(player1), deque(player2) 10 | 11 | while deck1 and deck2: 12 | card1, card2 = deck1.popleft(), deck2.popleft() 13 | if card1 > card2: 14 | deck1.extend((card1, card2)) 15 | else: 16 | deck2.extend((card2, card1)) 17 | 18 | score = sum(i * val for i, val in enumerate(reversed(deck1 + deck2), start=1)) 19 | print(score) 20 | 21 | 22 | def play(deck1, deck2): 23 | previous_games = set() 24 | 25 | while deck1 and deck2: 26 | if (round := (tuple(deck1), tuple(deck2))) in previous_games: 27 | return deck1, 1 28 | previous_games.add(round) 29 | 30 | card1, card2 = deck1.popleft(), deck2.popleft() 31 | if len(deck1) > card1 and len(deck2) > card2: 32 | _, winner = play(deque(islice(deck1, card1)), deque(islice(deck2, card2))) 33 | else: 34 | winner = 1 if card1 > card2 else 2 35 | 36 | if winner == 1: 37 | deck1.extend((card1, card2)) 38 | else: 39 | deck2.extend((card2, card1)) 40 | 41 | return deck1 + deck2, 1 if deck1 else 2 42 | 43 | 44 | deck1, deck2 = deque(player1), deque(player2) 45 | deck, _ = play(deck1, deck2) 46 | score = sum(i * val for i, val in enumerate(reversed(deck), start=1)) 47 | print(score) 48 | -------------------------------------------------------------------------------- /2020/day23.py: -------------------------------------------------------------------------------- 1 | with open('input_files/day23') as f: 2 | starting_cups = [int(c) for c in f.read()] 3 | 4 | 5 | class Node: 6 | __slots__ = ['val', 'next'] 7 | 8 | def __init__(self, val, next): 9 | self.val = val 10 | self.next = next 11 | 12 | 13 | def run(cups, runs): 14 | hi = max(cups) 15 | nodes = [None] * hi 16 | tail = None 17 | for cup in reversed(cups): 18 | tail = Node(cup, tail) 19 | nodes[tail.val - 1] = tail 20 | nodes[cups[-1] - 1].next = tail 21 | 22 | current = nodes[cups[0] - 1] 23 | 24 | for _ in range(runs): 25 | c1 = current.next 26 | c2 = c1.next 27 | c3 = c2.next 28 | 29 | target = (current.val - 2) % hi 30 | while target in (c1.val - 1, c2.val - 1, c3.val - 1): 31 | target = (target - 1) % hi 32 | target = nodes[target] 33 | 34 | current.next = c3.next 35 | c3.next = target.next 36 | target.next = c1 37 | current = current.next 38 | 39 | current = nodes[0].next 40 | cups = [] 41 | while current.val != 1: 42 | cups.append(current.val) 43 | current = current.next 44 | return cups 45 | 46 | 47 | cups = starting_cups 48 | cups = run(cups, 100) 49 | print(''.join(map(str, cups))) 50 | 51 | cups = starting_cups + list(range(max(starting_cups) + 1, 10 ** 6 + 1)) 52 | cups = run(cups, 10 ** 7) 53 | print(cups[0] * cups[1]) 54 | -------------------------------------------------------------------------------- /2020/day24.py: -------------------------------------------------------------------------------- 1 | from collections import defaultdict 2 | from operator import add 3 | 4 | with open('input_files/day24') as f: 5 | data = f.read() 6 | for direction, val in ('se', '1'), ('sw', '2'), ('nw', '4'), ('ne', '5'), ('e', '0'), ('w', '3'): 7 | data = data.replace(direction, val) 8 | data = data.split('\n') 9 | 10 | deltas = (1, 0), (1, -1), (0, -1), (-1, 0), (-1, 1), (0, 1) 11 | 12 | for i, row in enumerate(data): 13 | x = sum(deltas[c][0] for c in map(int, row)) 14 | y = sum(deltas[c][1] for c in map(int, row)) 15 | data[i] = (x, y) 16 | 17 | tiles = defaultdict(bool) 18 | for row in data: 19 | tiles[row] = not tiles[row] 20 | 21 | print(sum(tiles.values())) 22 | 23 | tiles = set(key for key, val in tiles.items() if val) 24 | for _ in range(100): 25 | temp = set() 26 | for tile in tiles: 27 | n = sum(tuple(map(add, tile, delta)) in tiles for delta in deltas) 28 | if n == 1 or n == 2: 29 | temp.add(tile) 30 | for neighbour in deltas: 31 | neighbour = tuple(map(add, tile, neighbour)) 32 | if neighbour not in tiles: 33 | n = sum(tuple(map(add, neighbour, delta)) in tiles for delta in deltas) 34 | if n == 2: 35 | temp.add(neighbour) 36 | tiles = temp 37 | 38 | print(len(tiles)) 39 | -------------------------------------------------------------------------------- /2020/day25.py: -------------------------------------------------------------------------------- 1 | with open('input_files/day25') as f: 2 | card, door = f.read().split('\n') 3 | card, door = int(card), int(door) 4 | 5 | door_loop = 0 6 | value = 1 7 | while value != door: 8 | value = (value * 7) % 20201227 9 | door_loop += 1 10 | 11 | print(pow(card, door_loop, 20201227)) 12 | -------------------------------------------------------------------------------- /2020/input_files/day01: -------------------------------------------------------------------------------- 1 | 1753 2 | 1976 3 | 1574 4 | 308 5 | 1384 6 | 1191 7 | 1731 8 | 1829 9 | 1658 10 | 1908 11 | 1663 12 | 2001 13 | 1298 14 | 1888 15 | 1134 16 | 1213 17 | 965 18 | 2009 19 | 1071 20 | 1591 21 | 1402 22 | 1184 23 | 1836 24 | 1536 25 | 1038 26 | 1871 27 | 1354 28 | 1149 29 | 1863 30 | 1728 31 | 1896 32 | 1599 33 | 1556 34 | 1222 35 | 1909 36 | 1858 37 | 1754 38 | 1947 39 | 1907 40 | 1656 41 | 1135 42 | 1845 43 | 1504 44 | 1473 45 | 1401 46 | 1700 47 | 1067 48 | 1790 49 | 1783 50 | 1539 51 | 1087 52 | 1614 53 | 1856 54 | 1895 55 | 1564 56 | 1106 57 | 1204 58 | 1492 59 | 1361 60 | 1897 61 | 1977 62 | 1210 63 | 1867 64 | 1797 65 | 1232 66 | 1148 67 | 1520 68 | 1989 69 | 210 70 | 1259 71 | 570 72 | 1512 73 | 1894 74 | 1309 75 | 1154 76 | 1327 77 | 1817 78 | 1875 79 | 1702 80 | 1885 81 | 1664 82 | 1220 83 | 1208 84 | 2000 85 | 1178 86 | 1423 87 | 1454 88 | 1780 89 | 1710 90 | 1362 91 | 1816 92 | 1491 93 | 1363 94 | 1478 95 | 1648 96 | 1163 97 | 1554 98 | 1195 99 | 1500 100 | 1320 101 | 1698 102 | 1636 103 | 1097 104 | 1573 105 | 1846 106 | 1747 107 | 1138 108 | 1083 109 | 1505 110 | 1387 111 | 1900 112 | 1143 113 | 1905 114 | 1826 115 | 1735 116 | 1496 117 | 1687 118 | 1704 119 | 1916 120 | 1991 121 | 1750 122 | 1637 123 | 1742 124 | 691 125 | 1967 126 | 1272 127 | 1657 128 | 1140 129 | 1070 130 | 1985 131 | 1405 132 | 1959 133 | 1218 134 | 1878 135 | 1340 136 | 1722 137 | 2003 138 | 1258 139 | 1726 140 | 1766 141 | 1868 142 | 1714 143 | 1463 144 | 2006 145 | 1537 146 | 1570 147 | 1526 148 | 1578 149 | 1744 150 | 1734 151 | 1325 152 | 196 153 | 1935 154 | 1849 155 | 1424 156 | 1972 157 | 1602 158 | 1859 159 | 1341 160 | 1177 161 | 1901 162 | 1902 163 | 1247 164 | 2004 165 | 1350 166 | 1965 167 | 1407 168 | 836 169 | 1899 170 | 1804 171 | 975 172 | 1510 173 | 1898 174 | 1560 175 | 1777 176 | 1523 177 | 1822 178 | 1830 179 | 1855 180 | 1839 181 | 1482 182 | 1661 183 | 1835 184 | 1343 185 | 1278 186 | 1449 187 | 1136 188 | 1732 189 | 2008 190 | 1686 191 | 1775 192 | 1952 193 | 1444 194 | 1499 195 | 1680 196 | 1752 197 | 1597 198 | 1963 199 | 1117 200 | 776 201 | -------------------------------------------------------------------------------- /2020/input_files/day08: -------------------------------------------------------------------------------- 1 | acc +37 2 | acc -1 3 | nop +512 4 | acc +0 5 | jmp +60 6 | acc -3 7 | nop +317 8 | jmp +130 9 | acc +22 10 | acc +34 11 | jmp +486 12 | acc -18 13 | nop +610 14 | acc -14 15 | nop +274 16 | jmp +439 17 | acc -6 18 | acc -1 19 | acc -4 20 | acc +7 21 | jmp +175 22 | nop +179 23 | jmp +197 24 | jmp +76 25 | acc -1 26 | acc +24 27 | jmp +472 28 | acc +8 29 | acc -15 30 | acc +0 31 | jmp +551 32 | acc +46 33 | acc +27 34 | jmp +1 35 | acc +45 36 | jmp +153 37 | acc +14 38 | jmp +207 39 | jmp +1 40 | jmp +557 41 | nop +424 42 | jmp +571 43 | nop -19 44 | nop +9 45 | acc +2 46 | acc +29 47 | jmp +14 48 | acc -10 49 | acc +43 50 | acc +43 51 | jmp +75 52 | jmp +311 53 | jmp +517 54 | acc -6 55 | acc +13 56 | jmp +140 57 | nop +348 58 | acc +0 59 | jmp +275 60 | jmp +52 61 | jmp +110 62 | acc +11 63 | acc +15 64 | jmp +13 65 | acc +7 66 | jmp +216 67 | jmp +174 68 | nop +24 69 | acc -16 70 | acc +46 71 | acc -17 72 | jmp +519 73 | acc -15 74 | acc +46 75 | acc -4 76 | jmp +309 77 | acc +14 78 | acc +36 79 | acc -15 80 | jmp +244 81 | acc +37 82 | acc +43 83 | jmp +146 84 | jmp +260 85 | jmp +217 86 | acc +39 87 | jmp +454 88 | nop +16 89 | nop +255 90 | acc +31 91 | jmp +13 92 | acc +38 93 | acc +45 94 | acc +24 95 | jmp +534 96 | acc +13 97 | acc +44 98 | acc +34 99 | jmp +286 100 | jmp +1 101 | acc -12 102 | jmp -45 103 | jmp +147 104 | acc -2 105 | acc +24 106 | nop +391 107 | acc +11 108 | jmp +242 109 | acc +1 110 | acc +28 111 | jmp +423 112 | acc +5 113 | jmp +319 114 | acc +45 115 | nop +350 116 | acc +34 117 | acc +7 118 | jmp +47 119 | nop +32 120 | acc +2 121 | acc +0 122 | jmp +252 123 | acc -4 124 | acc +23 125 | jmp +452 126 | acc -5 127 | acc +48 128 | jmp -104 129 | acc +38 130 | jmp +172 131 | acc +7 132 | acc +31 133 | jmp +5 134 | acc +19 135 | acc +12 136 | acc +26 137 | jmp +232 138 | acc -12 139 | nop +121 140 | nop +80 141 | acc +46 142 | jmp +126 143 | jmp +82 144 | nop +69 145 | jmp -128 146 | acc +18 147 | acc +45 148 | acc +14 149 | acc +45 150 | jmp +219 151 | jmp +422 152 | acc +2 153 | acc +40 154 | acc +13 155 | jmp +450 156 | acc +48 157 | jmp +172 158 | acc +19 159 | acc -10 160 | jmp +69 161 | nop +336 162 | nop -6 163 | jmp +265 164 | jmp -136 165 | jmp +350 166 | acc +31 167 | acc +39 168 | nop +389 169 | nop +404 170 | jmp +16 171 | acc +13 172 | nop -41 173 | acc -2 174 | acc -14 175 | jmp +159 176 | jmp -111 177 | acc +40 178 | acc +36 179 | acc -17 180 | jmp -143 181 | acc +36 182 | acc +29 183 | acc +19 184 | acc +0 185 | jmp +159 186 | jmp +279 187 | acc +31 188 | jmp +346 189 | acc +15 190 | nop +173 191 | acc +48 192 | jmp -183 193 | acc +16 194 | acc +31 195 | jmp +418 196 | acc -13 197 | jmp +280 198 | acc +30 199 | nop +229 200 | jmp -139 201 | acc +0 202 | acc +9 203 | jmp +354 204 | acc +12 205 | jmp +310 206 | jmp -129 207 | acc -8 208 | jmp -96 209 | acc -3 210 | acc +1 211 | jmp +51 212 | jmp +303 213 | acc +28 214 | jmp -186 215 | acc +36 216 | acc -10 217 | nop +72 218 | nop +345 219 | jmp +200 220 | acc +6 221 | acc -14 222 | jmp +87 223 | nop +318 224 | jmp +273 225 | nop +309 226 | acc +50 227 | jmp +147 228 | jmp +387 229 | acc +38 230 | nop -169 231 | acc +44 232 | jmp +28 233 | nop +208 234 | nop +43 235 | acc +26 236 | acc -13 237 | jmp -160 238 | jmp +233 239 | acc +22 240 | jmp +357 241 | jmp +374 242 | acc -6 243 | acc +38 244 | jmp +100 245 | jmp -36 246 | acc +38 247 | nop +330 248 | acc +46 249 | jmp -43 250 | acc +34 251 | nop +239 252 | acc +45 253 | acc +15 254 | jmp +48 255 | acc +49 256 | acc +20 257 | acc -5 258 | acc +41 259 | jmp +70 260 | jmp +211 261 | jmp +144 262 | acc +29 263 | acc +36 264 | acc -15 265 | jmp -24 266 | jmp +1 267 | jmp -17 268 | acc -18 269 | acc +27 270 | acc +34 271 | jmp -21 272 | jmp +1 273 | acc +35 274 | acc -5 275 | acc +24 276 | jmp +337 277 | nop -240 278 | jmp +180 279 | acc -1 280 | nop +49 281 | jmp +260 282 | acc +40 283 | acc +42 284 | jmp -165 285 | acc +31 286 | acc +30 287 | nop -234 288 | jmp +27 289 | acc +45 290 | acc +48 291 | acc +44 292 | acc -19 293 | jmp +70 294 | acc +20 295 | acc +18 296 | jmp +219 297 | acc +46 298 | jmp -85 299 | acc +43 300 | acc +21 301 | jmp -4 302 | acc +37 303 | acc +26 304 | acc +16 305 | jmp -257 306 | acc +39 307 | acc +7 308 | jmp -260 309 | acc +42 310 | acc +10 311 | acc +36 312 | acc +47 313 | jmp +2 314 | jmp -249 315 | acc +20 316 | acc -1 317 | acc +21 318 | jmp +74 319 | jmp +31 320 | acc +32 321 | jmp +64 322 | acc +34 323 | jmp -255 324 | acc -8 325 | acc -2 326 | acc +26 327 | jmp -102 328 | jmp +229 329 | acc -14 330 | acc +25 331 | jmp -154 332 | acc -15 333 | jmp -92 334 | nop -37 335 | acc -5 336 | acc +50 337 | acc +43 338 | jmp +73 339 | acc +1 340 | acc -17 341 | acc +19 342 | acc +24 343 | jmp -319 344 | nop -225 345 | jmp -304 346 | acc +49 347 | acc +5 348 | acc -17 349 | jmp +14 350 | acc +42 351 | acc -9 352 | acc -10 353 | acc +45 354 | jmp -125 355 | jmp -46 356 | acc +13 357 | acc +11 358 | nop +199 359 | acc -19 360 | jmp -159 361 | acc +1 362 | jmp +253 363 | acc +7 364 | jmp +233 365 | nop -76 366 | acc +31 367 | acc +44 368 | jmp -18 369 | acc +47 370 | nop +227 371 | jmp +178 372 | nop -22 373 | jmp -44 374 | jmp +24 375 | nop +122 376 | acc +20 377 | acc +43 378 | jmp -81 379 | acc -15 380 | acc +10 381 | acc +40 382 | jmp +108 383 | acc +45 384 | jmp +35 385 | acc +44 386 | jmp +36 387 | nop -2 388 | nop -320 389 | jmp +1 390 | acc +47 391 | jmp -6 392 | acc -16 393 | acc +49 394 | nop +56 395 | jmp +104 396 | acc +40 397 | jmp -159 398 | acc +30 399 | jmp +56 400 | acc +47 401 | acc -6 402 | acc +47 403 | acc +2 404 | jmp -102 405 | acc +45 406 | jmp -262 407 | acc +36 408 | acc +42 409 | acc -17 410 | jmp -90 411 | acc +18 412 | nop +7 413 | acc -14 414 | jmp -194 415 | acc +16 416 | acc +31 417 | acc +26 418 | jmp -257 419 | acc +25 420 | jmp -367 421 | jmp +69 422 | nop -102 423 | acc +47 424 | jmp -356 425 | nop -105 426 | acc +6 427 | jmp -42 428 | acc +40 429 | jmp -368 430 | acc +42 431 | jmp +84 432 | acc +17 433 | acc +14 434 | acc -17 435 | acc -14 436 | jmp -80 437 | acc +42 438 | acc +11 439 | acc -14 440 | jmp -77 441 | acc -12 442 | acc +8 443 | acc -19 444 | jmp -206 445 | acc +6 446 | acc +18 447 | nop +94 448 | acc -2 449 | jmp -330 450 | acc -15 451 | jmp -367 452 | acc -15 453 | acc +40 454 | jmp +143 455 | jmp -178 456 | acc -1 457 | jmp +140 458 | acc +13 459 | acc +47 460 | jmp -271 461 | acc +29 462 | nop -30 463 | nop -344 464 | jmp -251 465 | jmp +98 466 | acc +45 467 | acc -17 468 | acc +5 469 | jmp +1 470 | jmp -299 471 | acc +34 472 | acc +7 473 | acc +7 474 | nop +16 475 | jmp -106 476 | jmp -399 477 | jmp -291 478 | acc -4 479 | acc +26 480 | jmp -376 481 | nop -444 482 | nop +59 483 | acc +27 484 | nop +89 485 | jmp -188 486 | acc +21 487 | nop -246 488 | acc +6 489 | jmp -24 490 | acc +35 491 | jmp +1 492 | jmp -361 493 | acc +48 494 | acc -5 495 | acc +19 496 | jmp +74 497 | jmp -56 498 | jmp +43 499 | acc +50 500 | nop -275 501 | acc +39 502 | acc -11 503 | jmp -258 504 | acc +8 505 | jmp -190 506 | acc +46 507 | jmp +1 508 | nop -188 509 | acc -15 510 | jmp +12 511 | nop -5 512 | nop -444 513 | acc +0 514 | jmp -129 515 | acc -11 516 | acc +28 517 | jmp -452 518 | acc -4 519 | acc +24 520 | nop -176 521 | jmp -56 522 | acc +47 523 | acc +33 524 | jmp -432 525 | jmp -19 526 | acc +32 527 | jmp +1 528 | acc +7 529 | nop -179 530 | jmp -49 531 | nop -66 532 | acc +20 533 | jmp -122 534 | acc +1 535 | acc +10 536 | acc +16 537 | jmp +40 538 | acc +11 539 | acc +6 540 | jmp -454 541 | acc -2 542 | acc +12 543 | nop -228 544 | jmp -165 545 | acc +42 546 | nop -212 547 | acc +49 548 | jmp -286 549 | acc +42 550 | acc +24 551 | acc +38 552 | jmp -440 553 | acc +29 554 | acc +8 555 | acc +21 556 | jmp -288 557 | acc +2 558 | jmp -427 559 | acc +17 560 | acc +45 561 | acc +33 562 | jmp -333 563 | acc +6 564 | jmp -445 565 | nop -283 566 | acc -18 567 | jmp +1 568 | jmp +1 569 | jmp -492 570 | jmp +53 571 | acc +26 572 | jmp -107 573 | nop -377 574 | jmp -155 575 | acc +22 576 | jmp -523 577 | jmp -127 578 | acc +2 579 | nop -168 580 | acc +15 581 | jmp -343 582 | acc +34 583 | acc +0 584 | acc +0 585 | jmp -241 586 | acc +30 587 | acc +40 588 | acc +46 589 | acc -11 590 | jmp -216 591 | acc +31 592 | jmp -86 593 | acc +34 594 | acc -15 595 | nop -4 596 | jmp -74 597 | acc -1 598 | acc +13 599 | acc -2 600 | jmp -119 601 | acc +21 602 | nop -516 603 | acc +24 604 | jmp -580 605 | nop -200 606 | acc +18 607 | jmp -318 608 | acc +0 609 | nop -483 610 | acc +15 611 | acc -9 612 | jmp -30 613 | jmp -462 614 | jmp -476 615 | acc +18 616 | acc -14 617 | jmp -91 618 | acc -6 619 | acc +32 620 | nop -611 621 | acc +8 622 | jmp -613 623 | acc +23 624 | acc +7 625 | acc +30 626 | acc +48 627 | jmp -222 628 | jmp -326 629 | acc +46 630 | nop -108 631 | acc +17 632 | acc -16 633 | jmp +1 -------------------------------------------------------------------------------- /2020/input_files/day10: -------------------------------------------------------------------------------- 1 | 151 2 | 94 3 | 14 4 | 118 5 | 25 6 | 143 7 | 33 8 | 23 9 | 80 10 | 95 11 | 87 12 | 44 13 | 150 14 | 39 15 | 148 16 | 51 17 | 138 18 | 121 19 | 70 20 | 69 21 | 90 22 | 155 23 | 144 24 | 40 25 | 77 26 | 8 27 | 97 28 | 45 29 | 152 30 | 58 31 | 65 32 | 63 33 | 128 34 | 101 35 | 31 36 | 112 37 | 140 38 | 86 39 | 30 40 | 55 41 | 104 42 | 135 43 | 115 44 | 16 45 | 26 46 | 60 47 | 96 48 | 85 49 | 84 50 | 48 51 | 4 52 | 131 53 | 54 54 | 52 55 | 139 56 | 76 57 | 91 58 | 46 59 | 15 60 | 17 61 | 37 62 | 156 63 | 134 64 | 98 65 | 83 66 | 111 67 | 72 68 | 34 69 | 7 70 | 108 71 | 149 72 | 116 73 | 32 74 | 110 75 | 47 76 | 157 77 | 75 78 | 13 79 | 10 80 | 145 81 | 1 82 | 127 83 | 41 84 | 53 85 | 2 86 | 3 87 | 117 88 | 71 89 | 109 90 | 105 91 | 64 92 | 27 93 | 38 94 | 59 95 | 24 96 | 20 97 | 124 98 | 9 99 | 66 -------------------------------------------------------------------------------- /2020/input_files/day11: -------------------------------------------------------------------------------- 1 | LLLLL.LLLLLLLLLLLLLLLLL.LLLLLL.LLLLL.L.LLLLLL.LLLLLL.LLL.LLLLLLLL.LLLLL.L.LLLLLLLLLLLLLLLL.LLLLLLL 2 | LLLLL.LLLLLLLLLLL.LLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLL.LLL.LLLLLLLLLLLLL.L.LLLLLLLLLL.LLLLLL.LLLLLLL 3 | LLLLLLLLLLLLLLL.LLLLLLLLLLLLLL.LLLLL.LLLLL.LLL..LLLLLLLL.LLLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL 4 | LLLLLLLL.LLLLLL.LLLLLLLLLLLLLL.LLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLL.LLLLL.L.LLLLLLLLLLLLLLLL.LLLLL.L 5 | LLLLL.LLLLLLLLL.LLLLLLL.LLLL.L.LLLLL.LLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLL.LLLLLLLLLLLLL.LLLLLLLLLLLLL 6 | L.LLLLLLLLLLLLL.LLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LL.LLLL.LLLLLLLLL.LLLLLL.LLLLLLL 7 | LLLLL.LLLLLLLLL.LLLLLLL.LL.LLLLLLLLL.LLLLLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLL 8 | LLLLLLLLLLLLLLLLLLL.LLL.LLLLLL.L.LLL.LLLLLLLLL.LLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLL.LL.LLLL 9 | LLLLL.LLLLLLLLL.LLLLLLLLLLL.LL.LLLLL.LLLLLL.LL.LLLLLLLL..LLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL 10 | LL.LL.LLL.LLLLLLLLLLLLL.LLLL.L.LLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLL.L.LLLLLLL 11 | ......L....L...L...L.....L........LLL..LL..LL..L.L..LL.L..L.....LL......L.LLL.L..L....LLL.......LL 12 | LLLLL.LLLLLLLL.LLLLLLLL.LLLLL..LLLLL.LLL.LLLL..LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL 13 | LLLLL.LLLLLLLLL.LL.LLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLL.LL..L.L 14 | LLLLL.LLLLLLL...LLLLLLLLLLLLLL.LLLLL.LLLLLLLLL.LLLLLLLLL.LLLLLLL.LLLL.LLLLLLLLLLLLL.LLLLLL.LLLLLLL 15 | LLLLL.LLLLLLLL..LLLLLLL.LLLLL.LL.LLL.LLLLLLLLL.LLL.LLLLL.LLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL 16 | LLLLL.LLLLLLLLL.LLLL.LL.LLLLLLLLLLLL..LLLLLLLL.LLLLLLLLL.LLLLLLLLLLL.LLLL.LL.LLLLLL.LLLLLL.LLLLLLL 17 | LLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLLL.LL.LLLLLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLL.LL.LLLL 18 | L.LL..LLLLLLLLL.LLLLLLL.L.LLLLLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLL..LLLLLLLLL.LLLLLLLLLLLLLL 19 | .L.......L..LL.....L.L.....L..............L.L.L.LL..LL.L.L..LLL.L..LL.............LLL.L......L.LL. 20 | LLLLL.LLLLLLLLL.LLLLLLL.LLLLLLLLLLL.LLLLLLLLLLLLLL.LLLLL.LLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLL 21 | LLLLL.LLLLLLLLL.LLLLLLL.LLLLLL.LLLLL.LL.LLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLL 22 | LLLLL.LLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLLL.L.LLLL.LLLLLLL 23 | LLLLL.LLL.LLLLL.LLLLLLL.LLLLLL..LLLLLLLLLLLLLLLLLLLL.LLL.L.LLLLLLLLLLLLLL.LLLLLLLLLL.LLLLL..L.LLLL 24 | LLLLL.LLLLLLLLL.LLLLLLL.LLLLLLLLLLLL.LLLLLLLLL.LLLLLLL.LLLLLLLLLL..LLLLLL.LLLLLLLLL.LLLLLLL.LL.LL. 25 | LLLLL.LLLLLLLLL.LLLLLLL.LLLLLL.LLLLL.LLLLLLL.L.LL.LLLLL..L..LLL.L.LLLLLLL..LLLLLLLL..LLLLL.LLLLLLL 26 | LLLLL.LLL.LLLLLLLLLLLLL.LLLLLL.LLLLL.LLLLLLLLL.LLLLL.LLL.LLLLL.LL.LL.LLLL.LLLLLL.LL.LLLLLL.LLLLLLL 27 | LLLLL.LLLLLLLLL.LLLLLLL.LLLLL..LLLLLLLLLLLLL.L.LLLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLL.LL.LLLL 28 | LLLLL.LLLLLLLLLLLLLLLLLLLLLLLL.L.LLL.LLLLLL.LL.LLLLLLLLL.LLLLLLLL.LLLLLLL.LLLLLLLLL.LLL.LLLLLLLLLL 29 | ......L.....L...LL.L.L..L...L....L...LLL...LLLLL..L.....L.....L..L......L...L.L.......L..L.LL...L. 30 | LL.LLL.LLLLLLLLLLLLLLLL.LLLLLL.LLLLL.LLLLLLLLLLLLLLLLLLL.LLLLLLLL.LL.LLLL.LLLLLLLLL.LL.LLLLLLLLLLL 31 | LLLLL.LLLLLLLLL.LLLLLLL.LLLLLLLLLLL..LLLLLLLLL..LLLLLLLL.LLLL.LLL..LLLLLLLLLLLLLLLL.LLLL.L.LLLLLLL 32 | LLLLL.LLLLLLLLL.LLLLLLL.LLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLL.LLLLLLLL..LLLLLL.LLLLLL.LLLLLL.LL.LLLLLLL 33 | LLLLL..LL.LLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLL.LLLLLLLL.LLLLLLL.LLLLLLLLLL.LLLL..LLLLLLL 34 | .LLL...LL.....L.L..L.LL..LL......LL.L.L........L.L.....LLLL.L.L.......L......LL.....LLLL....L.L.LL 35 | LLLLL.LLLLLLLLL.LLLLLLL.LLLLLL.LLLLL.LLLLLLLLL.LLLLLLLLL.LLLLLLLL.LL.LLLL.LLLLLLLLLLLLLLLL.LLLLLLL 36 | LLLLL.LLLLLLLLL.LLLLLLL.LLLLL.LLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLL.LLLLLLLLLLLL.LLLL.LLLLLLLLLLLLLL 37 | LLLL..LLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLL.L..LLLLLLL..LLLL.L.LLLLLLLLL.LLLLLL.LLLLLLL 38 | LLLLLLLLLLLL.LL.LLLLLLL.LLLL.L.LLLLLLLLLLLL.LL.LLLLLLLLL.LLLLLLLL.LLLLLLL.LLLLLLLLL..LLLLL.LLLLLLL 39 | LLLLLLLLLLL.LLL.LLLLLLLL.LLLLL.LLLLL.LLLLLLLLLLLLLLLLLLL.LLLL.LLL.LLLLLLLLLLLLLLL.L.LLLLLLLLLLLLLL 40 | .L.L...L...L.....L...LLLLLLL.LL....LL..LLL...L...L.LLL..L.L...L.L.L....L.LL.LLL..L....L..LL..L...L 41 | LLLLLLLLLLL.LL..LLLL..L.LLLLLL.LLLLLLLLLLLL.LL.LLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLL....LLLLLLLLLLL 42 | LLLLLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLL.LL.LLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLL 43 | LLLLL.LLLLLLLLL.LLLLL.LLLLLLLL.LLLL..LLL.LLLLLLLLLLLLLLL.LLLLLL.L.LLLL.LL.LLLL.LLLLLLLLLL..LLLLLLL 44 | LLLLL..LLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLLLLLLL.LLLLL.LLLLLLLLLLLLLL 45 | LLLLL.LLLLLLLLL.LLLL.LLLLLLLLL.LLLLL.LLLLLLLLL.LLLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLL. 46 | LLLLL.LLLLLLLLLLLLL.LLL.LLLLLL..LLLL.LLLLLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLL..LLLL.LLLL.LLLLLL.LLLLLLL 47 | LLLLL.LLLLLLLLL.LLLLLLL.LLLLLL.LLLLL.LLLLLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLL 48 | LLLLLLLLLLLLLLL.LLLLLLL.LLLLLL.LLL.L.LLLLLLLLL..LLLLL.LL..LLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL 49 | L..L.L.LLL.LL.......LL.LL..LL.L...L..LLL........L.LL....LL...LL.L.....LL......L.L.L...L.L.L..L..L. 50 | LLLLL.LLLLLLLLL.LLLLLLL.LLLLL.LLLLLL.LLLL.LLLL.LLLLLLLLLLLLLLLLL..LLLL.LL.LLLLLLLLL.LLLLLL.LLLLLLL 51 | LL.LLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLLL.LLLL.LLLL.LLLLLL.L.LLLLL 52 | LLLLL.LLLLLLL.L.L.L.LLL..LLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLL.LLL.LLLLLLLLLLLLLL.LLLLL 53 | LL....LLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLL 54 | L.LLL.LLLLLLLLL.LL.LL.L.LLLLLL.LLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLL..LLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL 55 | LLLLLLLLLLLLLLL.LLLLLLLLLLLLLL..LLLL.LLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL 56 | LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLL..LLLLLLLLLLLLLL.LLLL.LLLLLLLL..LLLLLLLLLLLLLLL..LLLLLL..L.LLLL 57 | LLLLL.LLL.LL.LL.L.LLLLLLLLLLLLL.LLLLLLLLLLLLLL.LLLL.LLLLLLLLLLLL..LLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLL 58 | ..LL....L.LL...L.......L.L...L.L..LLL....L...L.L..L...L......L...LLL.L.L...L..L.LL...L..L..L.L...L 59 | LLLLL.LLLLLL....LLLLLLL.LLLLLL.LLLLLLLLLLL.LLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLL.LLL..LLLLLL.LLLLLLL 60 | LLLLL..LLLLLLL.LLLLLLLLLLLLLLL.LLLLLL.LL.LLLLLLLLLL.LLLL..LLLLLLLLLLLLL.L.LLLLLLLLLLLLLLLL.LLLL.LL 61 | LLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLL.LLLL.L.LLLLLLL 62 | LLLLL.LLLLLLLLL.L.LLLLL.LLLLLL.LLLLL.LLLLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLLLLLLL.LLLLL..LLLLL.LLLLLLL 63 | LLLL..LLLLLLLLLLLLLLLLL.LLLLLL.LLLLL.LLL.LLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLL.LLLLL.L 64 | LLLLL.LLLLLLLLLLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLL.LLL.LLLLLLLLLLLLL.LLLLLLLLLLLL.L 65 | LLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLLL.LLLLL..LLLLLLLLL.LLLLLL.LLLLLLL 66 | LLLLLLLLLLLLLLLLLLLLLLL.LL.LLL.LLLLL.LLLLLLLLL.LLLL.LLLL.LLLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLL.LLLL.LL 67 | LLLLL.LLLLLLLLL.LLLLLLL..LLLLL.LLLLLLLL.LLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLLL.LLLLLLLLL.L.LLLL.LLLL.LL 68 | .L.....L.LL.......L.L..L.L...LLL.L.LL..LLL..L.L....L........L..L.L...L....L...L.LL..L.....L..LL..L 69 | LLLLL.LLLLLLLLL.LLLLLLL.LLLL.LLL.LLLLLLLLLLLLL.LLLLLLLLL.LL.LLLLL.LLLLLLL.LLLLLL.LLLLLLLLL.LLLLLLL 70 | LLLLLLLLLLLLLLL.LL.LLLL.LLLLLL.LLLLL.LL.LLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLLLLL.LLLLL.LLLLLL.LLLLLLL 71 | LLLLL.LLLL..LLL.LLLLLLL.LL.LLLLLLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLLL.LLLLLL..LL.LLL 72 | LLLLL.LLLLLLLLLLLLLLLLLLLLLL.L.LLLLLL.L.LLLLLLLLLLL.LLLL.LL.LLLLLLLLLLLLL.LLLLLLLLLLLLLLL..LLLLLLL 73 | LLLLL.L.LLLLLL..LLLLL.L.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLLL..LLLLLLLL.LLLLLL..LLLLLLLLLLLLLLLLLLLLLLLL 74 | LL.LL.LLLLLLLL.LLLLLLL.LLL.LLL...LLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLL.LLLLLLLLLLLL.LL.L.LLLLLL.LLLLLLL 75 | LLLLL.LLLLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLL.LLLLLLLLLLLL.LLLLLLL.LLLLLL.LL.LLLLLL.LL.LLLL 76 | LLLLL.LLLLLLLLL.LLLLLLL.LLLLL..LLLLL.LLL.LLLLLLLLL.LLLLL.LLLLLL.L.LLLLLLL.LLLLLL.LL.LLLLL.LLLLLLLL 77 | LLLLL.LLL.LLLLL.LLLLLLLLLL.LLL.LLLLL.LLLLLLLLLLLLL.LLLLLLLLLLL..LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL 78 | ........LL..LLL.....L.L...LLL...L.........L.L...L..L...LL.L.....L....L....L.....L....L....L.LLL... 79 | LLLLL.LLLLL..LLLLLLLLLLLLL.LLL.LLLLL.LLLLLLLLL.LLLLLL.LLLLLLLLLLL.LLLLL.LLLLLLLLLLL.LLL.LL.LLLLLLL 80 | LLLLL.LLLLLLLLLLLLLLLLL.LLLLLL.LLLLL.LLLLLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLLL.LLLLLLLLLLLLL.LLLL.LL.LL 81 | LL.LL.LLLLLLLL.LLLLL.LLLLLLLL.LLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLL..LLLLLLLLLLLLLLLLLLLLLLL 82 | LLLLL.LLLLLLLLLLLLLLLLL.LLLLLL.LLLLL.LLLL.LLLLLL.LLLLLLL.LLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLL.LLLLL.L 83 | LLLLL..LLLLLLLL.LLLLLLL.LLLLLLLLL.LL.LLLLLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL 84 | LLLLLLLLLLLLLLL.LLLLLL..LLLLLL.LLLLL.LLLLLLLL.LL.LLLLLLL.LLLLL.LL.LLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLL 85 | L.LL.....LL......LL.L.LL...LL..........LL.LLL...L..L..LL....L......L.....LL.....LL.L..L.LL.L.L.... 86 | LLLLL.LLLLLLLLLL.LLLLLL.LLLLLL.LLLLLLLLLLLLLLL.LLLL.LL.L.LLLLL.LLLLLLLLLL.LLLLLLLLLLLLLL.L.LLLLLLL 87 | LLLLLLL.LLLLLLL.LLLLLLL.LLLLLL.LL.LLLLLLLLLLLL.LLLLLLLLL.L.LLLLLL.LLLLLLLLLLLLLLLLL.LLLLLL.LLLLLLL 88 | LLLLLLLLLLLLLLL.LL.LLLL.LLLLLL.LL.LL.LLL.LLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLL 89 | LLLLL.LLLLLLLLL.LLLLLL..LLL.LL.LLLLL.LLLLLLLLLLLLL.LLLLL.LLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLL.LLLL.L. 90 | LLLLL.LLLLLLLLL.LLLLLLL.LLLLL.LLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLL.LLLL.LL 91 | LLLLL.LLLLLLLLL..LLLLLL.LLLLLL.LLLL.LLLLLL.LLL.LLLLL.LLL.LLLLLLL..LLLLLLLLLLLLL.LLLLLLLLLL.LLLLLLL -------------------------------------------------------------------------------- /2020/input_files/day12: -------------------------------------------------------------------------------- 1 | S2 2 | W5 3 | F20 4 | E3 5 | S5 6 | R90 7 | W5 8 | F48 9 | R180 10 | E3 11 | S3 12 | E5 13 | S3 14 | F83 15 | S1 16 | W5 17 | F81 18 | W3 19 | R90 20 | F88 21 | S2 22 | R90 23 | E2 24 | L90 25 | W4 26 | F77 27 | E1 28 | R90 29 | S4 30 | E2 31 | F89 32 | N2 33 | L90 34 | N2 35 | N2 36 | E3 37 | L180 38 | N1 39 | F82 40 | R90 41 | S3 42 | F64 43 | W1 44 | R180 45 | S2 46 | R180 47 | F28 48 | L180 49 | S3 50 | F100 51 | E1 52 | S4 53 | S5 54 | R90 55 | F3 56 | W5 57 | N4 58 | F9 59 | N5 60 | E4 61 | R90 62 | F83 63 | L180 64 | W3 65 | N5 66 | W2 67 | R180 68 | W1 69 | S4 70 | L90 71 | S5 72 | R90 73 | R90 74 | F36 75 | L180 76 | W1 77 | F88 78 | E3 79 | R90 80 | F13 81 | W1 82 | F13 83 | W4 84 | R90 85 | E3 86 | F98 87 | S4 88 | E5 89 | R90 90 | F77 91 | E5 92 | L180 93 | N5 94 | R90 95 | E1 96 | F70 97 | L180 98 | F54 99 | E5 100 | F9 101 | L180 102 | N3 103 | F77 104 | E2 105 | F81 106 | E2 107 | S1 108 | F41 109 | L90 110 | F32 111 | S3 112 | F66 113 | N2 114 | E4 115 | R90 116 | F80 117 | R90 118 | W1 119 | R90 120 | S3 121 | F65 122 | S4 123 | R90 124 | W4 125 | S4 126 | R90 127 | W4 128 | S2 129 | E1 130 | F44 131 | R90 132 | F53 133 | E3 134 | F67 135 | S5 136 | L90 137 | R90 138 | W2 139 | S2 140 | E3 141 | N5 142 | F97 143 | N3 144 | E1 145 | R90 146 | W4 147 | N5 148 | S4 149 | F38 150 | N5 151 | N1 152 | W4 153 | S3 154 | E1 155 | S3 156 | F87 157 | E1 158 | R90 159 | E2 160 | L180 161 | S1 162 | L90 163 | F29 164 | R90 165 | S2 166 | F95 167 | N2 168 | E5 169 | F24 170 | W1 171 | F71 172 | E3 173 | L90 174 | F16 175 | L90 176 | S5 177 | L90 178 | W1 179 | F95 180 | L90 181 | W2 182 | F97 183 | E4 184 | R90 185 | N5 186 | F77 187 | E2 188 | L90 189 | F71 190 | L90 191 | W2 192 | R90 193 | F75 194 | E1 195 | S1 196 | F28 197 | F86 198 | R90 199 | E3 200 | F9 201 | N2 202 | W4 203 | S1 204 | L90 205 | F10 206 | W4 207 | L90 208 | S5 209 | E1 210 | L90 211 | W2 212 | S3 213 | F41 214 | L90 215 | S5 216 | F73 217 | L90 218 | S4 219 | F80 220 | W4 221 | R180 222 | S4 223 | E3 224 | F89 225 | E5 226 | N5 227 | L90 228 | F66 229 | N4 230 | W1 231 | F93 232 | W1 233 | F27 234 | F68 235 | N4 236 | F23 237 | L90 238 | F14 239 | S3 240 | F74 241 | N2 242 | E2 243 | R90 244 | S4 245 | F85 246 | N2 247 | L180 248 | L180 249 | F55 250 | S5 251 | E5 252 | F42 253 | N2 254 | R90 255 | F53 256 | S4 257 | F70 258 | E2 259 | F73 260 | S4 261 | F71 262 | L90 263 | E1 264 | S3 265 | E5 266 | N3 267 | E2 268 | N5 269 | L270 270 | F69 271 | E5 272 | F30 273 | N1 274 | R90 275 | N4 276 | F15 277 | E4 278 | R180 279 | F12 280 | E2 281 | F95 282 | E2 283 | S4 284 | F13 285 | S1 286 | E1 287 | N4 288 | E3 289 | L270 290 | E4 291 | S5 292 | E3 293 | N2 294 | R180 295 | S2 296 | W2 297 | L90 298 | S3 299 | W4 300 | R90 301 | E1 302 | L180 303 | W5 304 | F23 305 | E5 306 | F67 307 | R90 308 | N2 309 | W4 310 | L90 311 | S1 312 | L90 313 | F17 314 | W2 315 | F80 316 | E1 317 | F13 318 | S2 319 | E3 320 | S4 321 | F46 322 | F70 323 | R180 324 | E3 325 | L90 326 | E4 327 | L90 328 | S3 329 | F31 330 | W5 331 | R90 332 | F21 333 | S5 334 | L90 335 | F12 336 | L90 337 | F70 338 | S1 339 | R180 340 | W5 341 | F14 342 | S5 343 | W5 344 | S1 345 | F56 346 | L90 347 | F43 348 | S4 349 | N4 350 | E1 351 | R180 352 | S1 353 | R90 354 | E3 355 | N4 356 | R90 357 | S2 358 | E5 359 | S4 360 | W4 361 | R90 362 | F88 363 | S4 364 | R90 365 | F79 366 | L90 367 | N2 368 | E3 369 | F74 370 | L90 371 | F72 372 | W1 373 | N3 374 | R90 375 | E2 376 | F38 377 | W3 378 | L90 379 | E3 380 | N2 381 | R90 382 | E2 383 | L90 384 | N3 385 | E1 386 | F96 387 | E3 388 | S4 389 | R180 390 | F28 391 | S2 392 | F93 393 | L270 394 | N3 395 | R90 396 | N2 397 | E4 398 | S1 399 | F47 400 | L270 401 | F9 402 | N2 403 | F80 404 | S4 405 | L180 406 | N5 407 | W2 408 | L90 409 | W4 410 | N5 411 | L90 412 | F82 413 | R90 414 | N3 415 | F4 416 | R90 417 | F96 418 | W5 419 | R90 420 | F28 421 | W2 422 | S2 423 | F16 424 | S4 425 | R90 426 | F9 427 | N5 428 | W4 429 | F78 430 | E3 431 | F84 432 | L90 433 | F42 434 | W2 435 | F43 436 | W4 437 | L90 438 | F95 439 | E1 440 | R90 441 | F59 442 | L90 443 | F82 444 | W1 445 | F17 446 | S4 447 | R180 448 | F91 449 | L180 450 | N1 451 | R90 452 | N3 453 | F57 454 | L90 455 | F90 456 | N3 457 | R90 458 | F98 459 | N5 460 | R90 461 | N2 462 | R90 463 | F4 464 | S2 465 | F80 466 | S2 467 | N2 468 | W4 469 | L90 470 | E2 471 | F67 472 | R90 473 | W4 474 | L180 475 | F22 476 | L90 477 | S3 478 | F9 479 | N5 480 | W2 481 | L180 482 | S3 483 | F23 484 | S4 485 | W4 486 | F90 487 | S2 488 | F32 489 | S3 490 | E5 491 | R90 492 | E1 493 | F64 494 | R180 495 | F17 496 | E3 497 | R90 498 | N2 499 | E1 500 | F90 501 | W3 502 | N5 503 | F19 504 | S5 505 | E4 506 | N5 507 | R90 508 | W1 509 | F18 510 | R180 511 | E2 512 | R90 513 | F76 514 | L90 515 | N2 516 | F96 517 | F38 518 | R180 519 | F94 520 | S4 521 | W4 522 | S4 523 | F63 524 | E4 525 | L90 526 | F69 527 | S2 528 | W3 529 | N1 530 | L270 531 | N1 532 | L90 533 | N4 534 | R90 535 | E5 536 | F67 537 | F85 538 | S1 539 | F2 540 | F68 541 | W2 542 | R90 543 | E4 544 | R90 545 | S3 546 | W4 547 | S2 548 | N5 549 | F13 550 | R180 551 | W1 552 | F31 553 | S1 554 | F23 555 | S1 556 | R90 557 | F86 558 | L90 559 | N5 560 | W3 561 | F47 562 | R90 563 | R270 564 | S1 565 | L90 566 | S1 567 | F40 568 | N4 569 | R180 570 | N1 571 | L180 572 | W3 573 | S1 574 | W5 575 | L90 576 | W5 577 | F41 578 | S4 579 | E2 580 | N5 581 | E4 582 | N1 583 | F97 584 | L90 585 | F62 586 | N5 587 | R90 588 | F98 589 | R180 590 | S5 591 | L270 592 | N5 593 | W5 594 | N4 595 | E3 596 | F38 597 | L90 598 | S2 599 | F79 600 | R270 601 | E1 602 | F14 603 | W1 604 | F38 605 | E3 606 | L180 607 | N4 608 | L90 609 | S5 610 | F90 611 | S1 612 | F7 613 | N1 614 | F11 615 | W4 616 | R180 617 | F73 618 | L90 619 | F54 620 | F25 621 | W5 622 | S3 623 | F39 624 | E2 625 | F37 626 | E2 627 | S4 628 | F94 629 | W5 630 | S2 631 | L180 632 | W3 633 | F70 634 | S3 635 | R180 636 | W1 637 | N5 638 | R90 639 | S4 640 | F12 641 | S3 642 | F45 643 | E1 644 | N3 645 | R90 646 | S2 647 | L180 648 | E4 649 | S3 650 | W5 651 | F9 652 | S4 653 | R90 654 | F19 655 | W3 656 | N4 657 | W5 658 | R90 659 | F16 660 | W3 661 | S4 662 | W1 663 | S3 664 | R180 665 | S4 666 | E4 667 | N1 668 | W3 669 | F10 670 | N5 671 | E2 672 | F61 673 | E4 674 | S1 675 | W3 676 | N5 677 | W2 678 | L90 679 | W5 680 | N2 681 | W1 682 | F8 683 | W4 684 | S5 685 | L180 686 | F76 687 | N1 688 | R180 689 | S3 690 | R180 691 | S3 692 | E1 693 | R90 694 | W1 695 | F38 696 | R90 697 | F74 698 | N2 699 | F60 700 | L90 701 | E2 702 | S3 703 | F78 704 | W1 705 | F57 706 | R90 707 | F39 708 | N5 709 | F2 710 | E3 711 | R90 712 | F81 713 | E2 714 | F2 715 | S3 716 | R90 717 | F95 718 | S4 719 | F1 720 | E2 721 | N5 722 | L270 723 | F59 724 | W2 725 | R90 726 | S1 727 | F42 728 | E2 729 | N5 730 | E4 731 | L90 732 | W1 733 | F17 734 | E2 735 | F91 736 | R90 737 | E3 738 | F30 739 | S1 740 | R90 741 | W5 742 | F74 743 | W5 744 | N1 745 | N4 746 | R180 747 | S5 748 | R180 749 | F92 750 | N4 751 | N3 752 | E3 753 | R90 754 | F60 755 | S4 756 | L90 757 | E4 758 | R270 759 | F3 760 | E1 761 | L180 762 | E1 763 | S5 764 | F84 765 | E3 766 | L90 767 | N3 768 | F27 769 | W1 770 | F58 771 | N1 772 | F93 773 | N2 774 | F30 775 | L90 776 | N2 777 | L90 778 | N2 779 | F99 780 | W4 781 | S2 782 | F13 783 | L90 784 | N3 785 | W4 786 | F100 -------------------------------------------------------------------------------- /2020/input_files/day13: -------------------------------------------------------------------------------- 1 | 1000508 2 | 29,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,37,x,x,x,x,x,467,x,x,x,x,x,x,x,23,x,x,x,x,13,x,x,x,17,x,19,x,x,x,x,x,x,x,x,x,x,x,443,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,x,x,x,x,x,x,x,x,x,x,x,x,x,x,41 -------------------------------------------------------------------------------- /2020/input_files/day15: -------------------------------------------------------------------------------- 1 | 1,0,18,10,19,6 -------------------------------------------------------------------------------- /2020/input_files/day17: -------------------------------------------------------------------------------- 1 | ......## 2 | ####.#.. 3 | .##....# 4 | .##.#..# 5 | ........ 6 | .#.#.### 7 | #.##.... 8 | ####.#.. -------------------------------------------------------------------------------- /2020/input_files/day22: -------------------------------------------------------------------------------- 1 | Player 1: 2 | 44 3 | 31 4 | 29 5 | 48 6 | 40 7 | 50 8 | 33 9 | 14 10 | 10 11 | 30 12 | 5 13 | 15 14 | 41 15 | 45 16 | 12 17 | 4 18 | 3 19 | 17 20 | 36 21 | 1 22 | 23 23 | 34 24 | 38 25 | 16 26 | 18 27 | 28 | Player 2: 29 | 24 30 | 20 31 | 11 32 | 32 33 | 43 34 | 9 35 | 6 36 | 27 37 | 35 38 | 2 39 | 46 40 | 21 41 | 7 42 | 49 43 | 26 44 | 39 45 | 8 46 | 19 47 | 42 48 | 22 49 | 47 50 | 28 51 | 25 52 | 13 53 | 37 -------------------------------------------------------------------------------- /2020/input_files/day23: -------------------------------------------------------------------------------- 1 | 135468729 -------------------------------------------------------------------------------- /2020/input_files/day24: -------------------------------------------------------------------------------- 1 | wseseseswsesesewnesesesesewneseseswnene 2 | seswswsenenweseneesweenwswneswsenwsenw 3 | nenwneneneeneneneneseeenene 4 | swwenwseswseswwnweswswswnwwswesww 5 | nwenenwnwwswnwsewneneswnwswnwwwwsenw 6 | seswseseswsesweseswswswnw 7 | seneesweneesweweeseeseeeenese 8 | nwswnwenwnwnwnwseneswnenwneswswsenenwnenw 9 | wsewwwwwwnenwwwwwneswww 10 | wneneneneenenewneneenesenenenee 11 | sesenweswswneswneswwswnwnwseswseswswnesw 12 | eenwneswseswnwneseneneswwesenwswnwwnese 13 | swnwwenenenwnwnwnwwswnwnwnwnwnwnwneswsw 14 | neeeweswneesweeseeeenweswswwnenw 15 | swswseswnwswseseseneneswsw 16 | eeswnwwnwsenenesenwnwnenwenwnwnenwwnwsw 17 | wseeseswsesewenwswswnweseseseseseswswne 18 | newnewneneneeneswseeneeneeneneese 19 | wenweeswseeeeweseeswneeenwene 20 | swneneswswswnwseseseseswneswswsesesesese 21 | weweewwswwwnw 22 | esesesesewesesenweseseeneswswenesee 23 | eswneswswnwswenewnenwneeeswneswnene 24 | esenenesewseseseesewsesese 25 | wswseneseseeewseswnwneeseneewenee 26 | swseswseewswweeswnwewswenwnewsese 27 | seswseseswwneswswswseswswnwswnwnewnene 28 | sweeesenenenewnenenwneneeneeenewsw 29 | wnwwwwseswnwwwswneswswesewswsenwsww 30 | swswseswswnwneesewswseswneswswsw 31 | seenwseswseesenwseeseseseseseseswswne 32 | swswswnewswswswswswswswsenewwwnewse 33 | swswsewneneswseswnewseswneswneseswsese 34 | wwswnwewswsesenweneeeenwwneee 35 | nwnenenwnwnenenenwnewnwnwnwswe 36 | wwsenwsewwweewwswwswwwnenew 37 | wnenwewnenenenweneenwnwswsw 38 | weeewsweeeeneeeenwneneneneesw 39 | sewnwnwwnwwnwwneweeswnwsenwswnw 40 | swnenenenwswnweswnenenenewnenenene 41 | nwswnwnwsenwesenwnwnwnenwsenenwnwnwwnwsew 42 | nweeeenenenewsweeeneeeeesewese 43 | neneneneneenenwneneeneewnesw 44 | nenwnenwnwnwswnwnwnwnwnwnwnw 45 | nenwswnwnwnwwswnwnwwwnwenwsenwneswnwne 46 | wseneseseseesweseseeenenwenewsese 47 | senwwsesenwenwenenwewseswnweswsese 48 | eweseeseswenwseseeseesenwnwnenwee 49 | wwnwnwwenwnesewwnwnwswwnweeswww 50 | neeneeeneeenenenenwenese 51 | nesenwnwneenwnenwwswnwseswswwwnwene 52 | nesweeswwseswsesewnesewswnw 53 | nwnwewnwnewswnwswwnww 54 | enwnesenwsweseeeewneseeee 55 | seneswwsesesenesesesesesesesenwsesesese 56 | seweswsenesweswswnwswswswwswswswswsw 57 | swswswswswwswneenwswswswswswsewswsene 58 | nenwenewnwnwneneswneneneneneneswenenesene 59 | esenwsesesesesesesesesese 60 | nenwnenwnwnwnenenwnwnenweswnene 61 | swwwwwnewnwnwseewnww 62 | nesenenenenwnewnenwswnweneesenew 63 | wwwwwwwwsewswwswwnw 64 | sesweswswswenwnwswswswswwseswswnwswswswnw 65 | sewnwswswewesee 66 | swnwswswsewswswswneseswswswsw 67 | seswenwnwseeswwnwneseesenweseseesenw 68 | ewesenwseseseeseeseseswsewwwsesw 69 | neeswnenwseenwnenenenwewwnenwnenwnw 70 | eswweeeneneeswenwneenwsewseswse 71 | wwswseseeeseewnwseesesesenwsenese 72 | nwswnwnwenwweswseneswswneswsenenenw 73 | nwwweswewswwnwswswswewwwnwwseee 74 | seseeswsewnwnenweneneenwse 75 | swswwwswsewnwswswww 76 | nwseweseesewsesesewneseseswesese 77 | wwwwnewwwwnwnenwwswwsw 78 | nwenenwseneneswnesenenwnwsewnwswwnwswnwnw 79 | wswneswswswenwseswnwswsesweswswwsesenwne 80 | neesenwnenwseseesweswnwenwneeewe 81 | wneswwwwswwwswweeswweswswwww 82 | wnwewwwwwewwswwwwwwwew 83 | seewwswwwswwneswswwneswnw 84 | swnwswnwsesenwnweswswwseneeewswswsw 85 | swenenwneswwnenweswswnenweeeeeseee 86 | wnwnwneenwswswsenwseenwnwnenwwnwwnene 87 | neneeneswnwneeseewneeweneneneenee 88 | seesenwnwsenesesweseseseswseeneswnwwnw 89 | nweeseseneeenewneeeeeswenwneee 90 | swnenesenwswnenwnwewweswswnwwnenese 91 | senwnewwsenwnwnwnenwnwnwnwnwneeesenwnw 92 | swseenwswneseeseeseseseeewnesenee 93 | sewwswwsenesewnenwewwneeswswee 94 | swneneeeswneneeenenwnene 95 | swwneswswwswseswswswsewwwwnww 96 | nenwnenenenenenesenwsweneneswnenenwnenw 97 | nweswneswseeeeeeswneeeeeneew 98 | swneseneenweeeenwsweseenwsw 99 | nwwswswwenweswwswswwswswswneewwsw 100 | nesweeewsenewsenwnenenwneeneneenenene 101 | swswwswnwwneeswweswswwswswesewwswe 102 | seswseseseeenenweenewwsewseseesese 103 | wswweswwseswwwnw 104 | wsenwsesesenwnenenenwnwswwwnwnenwswwne 105 | swswsweseswswswswswnwswsweswnwswneswswsw 106 | wswwwnwwwwwe 107 | seneseswseseeswnewswswsenwswsesesesese 108 | neesenenesenwenweenwsewneew 109 | wswwswswwswnwswwewswewwnwswesw 110 | swsewsweseneseseneswnese 111 | seseseneswesesesesesesese 112 | newwnesesewnwnenewneneneneswneneswenese 113 | eseswneeenewsenwnewee 114 | nwswswswneswwsweswsw 115 | nwwswwswswsewnwswweewwswswswwswnese 116 | wnewseneeeesweseeewseseseseseneese 117 | swenewnwnweeneneneneswnewsenwnwnenw 118 | nweweeeeswneweseneneneeeswnene 119 | eswneseeeesenweewseweseneesee 120 | nwwswwneneenwsenenwnweneneneeneswe 121 | eweswneneeeseeswenwsenenwnesesewenw 122 | nwseneeswneesesenenwnwneneeswnenwnenwse 123 | swswnwsweeswnesenwswswswswswswswsenwse 124 | nenwnwenwnwswneswnwsenwnwnwenwnwswnwsesw 125 | nwseneenwnwnenwwnwnenwsw 126 | nwnesewswswswsweswwswneswnweswe 127 | enwswwwnewnewwswwwwnwswwwseww 128 | nenwnenenwwneweneseswenwnenwneeswswne 129 | nenwnenwswwneneneneenwswnwneswneneneenesw 130 | neseseneswnewnenesesenenwnwneswsenwnwnw 131 | swenenenenenenesenewnene 132 | nwnwnwnwnwnwnwnwnwenwnwnwswnw 133 | neseneswwnwneswnwsewseseeswenwneswswsw 134 | wwwwneenwnwseswenenwnenwwwnwsesw 135 | wwnewswwwnewswwsewwww 136 | sesesewswsweseswseswse 137 | seswewneenwnenwnwnenwnwnwnwneneswswnwnenw 138 | neeseenwseesweneseweeseeesenwsw 139 | swneneneenewswneneewnenwnwwnwswswnesese 140 | swnesenwnwnwnewnwnenenenwnenenw 141 | wwwnewneeswsenwnwswwnwnwenwnwnewnw 142 | eeeeeeneweeseeeeee 143 | neweeswsenenwseeeeeneneneeneeneswnw 144 | nwnwwenwnwseenwnwenwwnwswwnwswewne 145 | wneenewenweenwseseseesesenewww 146 | eewneeneneeneeenene 147 | swswsenwweenwswswswswswswswsw 148 | nwneneseeenwnwnwswnwwswnwse 149 | swenwnwenwswwnwnwswneenwnwnwnenwnwnwse 150 | wsewswwnenwneseswsenwsww 151 | seeeenwseseneeeeseeeswesew 152 | weenwnewnenwseenwnwnenwnenwnenwwne 153 | sweeeswesenwwnwswwneswnwwewenenw 154 | eeneeenwesewweeneeeswewee 155 | sweseswseswneseseswswsewsesw 156 | wneswseseseseswseseseswswwswsesee 157 | swswswswswseswswwwseeseenewnewsw 158 | eeswnwnwnesewswneseneswsesweewswsee 159 | eseweeneseseseee 160 | weswswnwswsesewswsewenwneneswswenwnw 161 | seseenwseeswneswseenwseseewee 162 | eeneneeswsweseswewwneenwe 163 | neseewnwwesewnwwwswwsewnesenew 164 | eneswnenwewneseneneenenweneneseene 165 | sesenesesesesesenewswsesewseseseseseew 166 | nenenwnenwneeneneneneenwwswneeswnwesw 167 | wwewwsewewwsewwnwwwnwnewww 168 | nweneewnwseneseseeeeswsenweeenew 169 | nwnwwseswseeseseseneenwewswnwseswse 170 | neewsweseeeweswnwsenenwnwwwne 171 | senenwnewseseeswsweseseswswnwwseesesenw 172 | neswswnwnenenwnwsewwnwneswswenwsewnwnenw 173 | wwswwenwnewseneeswsewewnw 174 | seswsewseseneseswneesesenwseseswsesesene 175 | ewwsenenwwseswswsenwnewweenwwenww 176 | nenweenwneenwseneneewwsweeesewe 177 | wswnwwwewwwsewnwsewwsewnwnwse 178 | nwnenwnwenwnwenwnwnesweneswnwnwnwnwswnenw 179 | seeneswwesesesewswsenwwwneewnwne 180 | swwnwswseeswwswswenwswsweswswswwwnw 181 | seswnwewswseswwswwseenesw 182 | eneneseneneneeeneswneneeewnweseswne 183 | enwwneeneeeeesw 184 | sesesenwsesenweesweseeseseneseseswe 185 | nwnwnwnenwenenenenww 186 | nwnwwnwswenwnwnwwnwnwnwwesewnwwnwsw 187 | wwneesenwwsenweswwsewsewwnenww 188 | swswseswswneneswswswswwsweseseswnwswse 189 | wseenwwwwnwnwnenwnwwnwesewsenwnww 190 | wseneseswswwwsewswswwnewsweneswswnww 191 | nwsewnwwnenwnesewsewwnwwswnwnwswnw 192 | senwenesenenenesweenewnewnenenenenw 193 | swnwswweewnwwwnwswseswewewwsww 194 | wsewswnewsenewsewwwswwwwwwnw 195 | nwsenwnenenenenwnwnwnenwnw 196 | nenenwnenwnwnwnwnwenwwnesenwswnene 197 | nwwweewenweeswesw 198 | wnwnwnwsenwswnenwweswwnwnenwwwnwww 199 | seseneenwseneneswwneseneeeweneneenw 200 | swswwswswwswswswswwwesww 201 | nenesenewnwsenenenenwwnenwenenenenww 202 | wnwneseswswswswswnenewswenwswwsesesw 203 | wwwwnwseswwswwsww 204 | nwseenenwswweeseseneseeesewswsesene 205 | nenewsenewwneesweneesewwnwe 206 | wwswwewwwwseswwwweswnweesw 207 | nesweewswsweneeneneenwne 208 | wseseswnwesenwnewseneswenwneswseesw 209 | nwnwwswsenweeswswnwseswsweswse 210 | nenwnwnwnwswneneenenwswswsenwnwnenwnwsenw 211 | wswnewwnwswwwewnwnwsenwnw 212 | nwswneneseeseneeswwne 213 | nwseseswswneswnewsenwseneseswseeseswsenw 214 | enwnwnwswnwnwseneswnwswneswenwwwnesee 215 | wnwnwwswnwnwnenwwwnwnwnwnw 216 | nenwewnesewwswwswneswwseewnwww 217 | nwswsweewswsesesesweswnewnewneesesw 218 | nenwsewwwswwwwswwseswww 219 | nwnwseneneneneneswnwnwnwneswewneneewne 220 | weswsweseseneswsenwsenwseneneesesenwsesw 221 | nwnwswwnwnwnwwnwwnwenw 222 | swnwnwnwenwnwneswnwenwsenwnwnwnwnwnenw 223 | neswnenwneenwswnesenwneesweneswwnene 224 | neeeneneeeeeeesewweeesw 225 | eswneneneseswseswswsesenwnwseswseseswse 226 | seeeeneseseseseswenwnweseesw 227 | wewewnenwnwnesweenwnwwsewswnew 228 | seseweseseseeseneesesewswenewse 229 | wnesewswwswwswwwwneewwwwswsewnw 230 | nwweseswnwwsweseseeneneseeesewsese 231 | nwswneeseewseswneeswnwwwnw 232 | seseswwneesenwneseseeenweseseseesesw 233 | enwnenenenweneneneneneswswnenenesene 234 | eneswseeneseweeeeneenweenwene 235 | swwwwwwwwswnwe 236 | nwsesesesesesewnewseeeswsesee 237 | nwseeseeseseeswsenweneseesweee 238 | nweswwneswnwwnwswweswnwnwnwnwnwnewe 239 | neneswseswenenwnweseeswseseswwnwswswne 240 | wnwnwwwwneswewnwwwseswnenwwww 241 | wnwenwsewwwneseswnwesweeeewse 242 | seeseswnweseseeswswwnwswnwnwwswsee 243 | swswswewsewswseswnwnwwswswswswnewswse 244 | eswseneswnwsweneenw 245 | enwnwswnwwsewwenwnwnwsenwwnwnwnwnw 246 | eeeenesewseeeeeeseweneswwee 247 | eswsweeneneneeeneseneneneewswnwnwe 248 | nwwseseswsenwnwenenewwneneneenewnwnw 249 | nwnwnwnwnwnenwnwnwnwnwnwnwnesw 250 | wneeneswewneneenesenwnwswne 251 | nenweswneesweeeneee 252 | neseneswneneneseenenewenenwneneenwse 253 | swnwswsweneswswswwnwswswswsewseseswwnew 254 | swenwwnesenweewww 255 | swswwwwnwswwwnwnwwswwwseewswe 256 | seswseseswsesesesesenwsese 257 | nenwsewnesenwnenenwnenenesenenenewseswne 258 | nenwnwnwswnenweneenwnenwneswswswnenwesw 259 | wswseswewneseseesenenenwnewswseseswswsw 260 | nesewseseseseseseeseseseseseswenwswnwse 261 | senweswswswseswseswseweeswswwse 262 | wwweesewnwnwswswswswswwwnenwwww 263 | nwswseneenwswswwnwsweseswswswwswswsw 264 | weswneneswneenenesenesewnenenwnenwsesw 265 | neneenenenenenenenwswneneneneeswne 266 | eeenwseseeeeeswseweeenwneeee 267 | swswswswswswwsweswswnwswwenwswswsw 268 | senwnwswswswswewnesenewwswnwwwswsw 269 | nenenwneswnenwnwwnesenenewnenwnenwesese 270 | wwsewnewswnweswsesenwnwnwnwsweswe 271 | nwnenwnwsenwnwnwnwnwwnwseswwnwwnenwewnw 272 | seswswnenweeswnwnwnwswswswneswse 273 | nenesenweeseeneneswneenweweeswene 274 | enesweneeneewneswwnenewneenwnw 275 | swseseswsesenweswnwnwnesenw 276 | nwsenwwnwnwneenwwwnwwwwwnww 277 | seeseneswseswswswsesewswswseswsenewwse 278 | swnenenenwewnenwsenwsenwnwnwnwnw 279 | ewwwswnenwswnwwsenwewneenwwnwwse 280 | swneenweeeneenweeeeeswnweeswnwse 281 | sweeeeseenweeeeeenwwee 282 | weswwwwwnesewwwswwswswwnw 283 | swswswswswswnwswswswswswswswe 284 | wnwnwnenwswnwsenwsenwwnwnwnwwnenwswe 285 | swwwswwwnwnwnweswnwwwenwnwenewne 286 | eenwesesewseenw 287 | neeeseseeenwenwsweeseeeeewe 288 | swnesenwnesenwnwnenwnenewswseenenenwnw 289 | enwwneenwneswnwsenenwnwwnwnwnwnwnw 290 | swswnwnweenwswwneneeswnwnwnewnwwswsene 291 | neswwswsenenwwnwneesesenwnwswweswnee 292 | seswsesesenewneswsese 293 | seneswnenwswswnwneeneswnenwwnesenenww 294 | sesesesesenewewseeseene 295 | eseeewneeneeeeweeneswnweneneswe 296 | neswswswswswseeswswnwwswsweswwsw 297 | wnenwswsewenwnwswwnwenwswwnwnwee 298 | seseneswsewswseseswnesesesesesenwswsese 299 | enewswswnwsewnweswswneswwewwwneswse 300 | seseseswnwnwnwnwnwnwnenwnenwnwnewwnwnwnw 301 | neswnenwwneswswswew 302 | seseenwneneneweseeenwnenewswwwneew 303 | swswswneswswwnwswsweeswswseswseswnwseswne 304 | nenenwwneswswenwnwnenenwnenewnesenenw 305 | enwwneneeeneenenenewsesenewsenenenesw 306 | swseseseseseseseseswnwsesese 307 | swnwnwewsesewenesenwswew 308 | eesenwnwenesweswweeswswsenwnwse 309 | nwwneseseseneneswwswseswswsewswneswsenw 310 | sweseswnwswnwswswswswswswsenwswswesweswsw 311 | seneswneneenwnewnwwseswnewene 312 | wnwnesewnenenwseswnwnenwneenenenenenee 313 | seseeseneswswseseseeenwsenenwsesesee -------------------------------------------------------------------------------- /2020/input_files/day25: -------------------------------------------------------------------------------- 1 | 14205034 2 | 18047856 -------------------------------------------------------------------------------- /2021/day01.py: -------------------------------------------------------------------------------- 1 | with open('input_files/day01') as f: 2 | data = [int(x) for x in f] 3 | 4 | print(sum(x < y for x, y in zip(data, data[1:]))) 5 | print(sum(x < y for x, y in zip(data, data[3:]))) 6 | -------------------------------------------------------------------------------- /2021/day02.py: -------------------------------------------------------------------------------- 1 | with open('input_files/day02') as f: 2 | data = [line.split() for line in f] 3 | data = [(direction, int(delta)) for direction, delta in data] 4 | 5 | x, y, y1 = 0, 0, 0 6 | for direction, delta in data: 7 | match direction: 8 | case 'forward': 9 | x += delta 10 | y1 += y * delta 11 | case 'up': 12 | y -= delta 13 | case 'down': 14 | y += delta 15 | 16 | print(x * y) 17 | print(x * y1) 18 | -------------------------------------------------------------------------------- /2021/day03.py: -------------------------------------------------------------------------------- 1 | with open('input_files/day03') as f: 2 | data = [int(x, 2) for x in f] 3 | bits = max(x.bit_length() for x in data) 4 | 5 | gamma = 0 6 | for i in range(bits): 7 | gamma_bit = sum((x >> i) & 1 for x in data) > len(data) // 2 8 | gamma |= gamma_bit << i 9 | 10 | print(gamma * (2 ** bits - 1 ^ gamma)) 11 | 12 | o2, co2 = [*data], [*data] 13 | for i in range(bits - 1, -1, -1): 14 | o2_bit = sum((x >> i) & 1 for x in o2) >= len(o2) / 2 15 | o2 = [x for x in o2 if (x >> i) & 1 == o2_bit] or o2 16 | 17 | for i in range(bits - 1, -1, -1): 18 | co2_bit = sum((x >> i) & 1 for x in co2) < len(co2) / 2 19 | co2 = [x for x in co2 if (x >> i) & 1 == co2_bit] or co2 20 | 21 | print(o2[0] * co2[0]) 22 | -------------------------------------------------------------------------------- /2021/day04.py: -------------------------------------------------------------------------------- 1 | class Board: 2 | def __init__(self, board): 3 | self.orthogonals = [{*row} for row in board] 4 | self.orthogonals += [{*col} for col in zip(*board)] 5 | self.last_number = 0 6 | 7 | def check_number(self, number): 8 | self.last_number = number 9 | for orthogonal in self.orthogonals: 10 | orthogonal.discard(number) 11 | 12 | def check_win(self): 13 | return not all(orthogonal for orthogonal in self.orthogonals) 14 | 15 | def sum_score(self): 16 | return sum(sum(orthogonal) for orthogonal in self.orthogonals) // 2 17 | 18 | 19 | with open('input_files/day04') as f: 20 | numbers, *boards = f.read().rstrip().split('\n\n') 21 | 22 | numbers = [int(num) for num in numbers.split(',')] 23 | 24 | boards = [board.split('\n') for board in boards] 25 | boards = [[[*map(int, row.split())] for row in board] for board in boards] 26 | boards = [Board(board) for board in boards] 27 | 28 | winners = [] 29 | for number in numbers: 30 | for i in range(len(boards) - 1, -1, -1): 31 | boards[i].check_number(number) 32 | if boards[i].check_win(): 33 | winners.append(boards[i]) 34 | boards.pop(i) 35 | 36 | print(winners[0].sum_score() * winners[0].last_number) 37 | print(winners[-1].sum_score() * winners[-1].last_number) 38 | -------------------------------------------------------------------------------- /2021/day05.py: -------------------------------------------------------------------------------- 1 | import re 2 | from collections import defaultdict 3 | 4 | 5 | def make_range(a, b, c, d): 6 | if a == b: 7 | return [a] * (abs(c - d) + 1) 8 | if a > b: 9 | return range(a, b - 1, -1) 10 | return range(a, b + 1) 11 | 12 | 13 | def is_orthogonal(x1, y1, x2, y2): 14 | return x1 == x2 or y1 == y2 15 | 16 | 17 | def points(x1, y1, x2, y2): 18 | return zip(make_range(x1, x2, y1, y2), make_range(y1, y2, x1, x2)) 19 | 20 | 21 | with open('input_files/day05') as f: 22 | lines = re.findall(r'(\d+),(\d+) -> (\d+),(\d+)\n', f.read()) 23 | lines = [[int(x) for x in line] for line in lines] 24 | 25 | orthogonal_overlaps = defaultdict(int) 26 | overlaps = defaultdict(int) 27 | for line in lines: 28 | for point in points(*line): 29 | overlaps[point] += 1 30 | orthogonal_overlaps[point] += is_orthogonal(*line) 31 | 32 | print(sum(overlap > 1 for overlap in orthogonal_overlaps.values())) 33 | print(sum(overlap > 1 for overlap in overlaps.values())) 34 | -------------------------------------------------------------------------------- /2021/day06.py: -------------------------------------------------------------------------------- 1 | from collections import Counter 2 | 3 | 4 | def run(n, fish): 5 | for _ in range(n): 6 | new_fish = {timer - 1: count for timer, count in fish.items()} 7 | new_fish.pop(-1, None) 8 | if 0 in fish: 9 | new_fish[8] = fish[0] 10 | new_fish[6] = fish[0] + new_fish.get(6, 0) 11 | fish = new_fish 12 | return sum(fish.values()) 13 | 14 | 15 | with open('input_files/day06') as f: 16 | fish_data = Counter(map(int, f.read().split(','))) 17 | 18 | print(run(80, fish_data)) 19 | print(run(256, fish_data)) 20 | -------------------------------------------------------------------------------- /2021/day07.py: -------------------------------------------------------------------------------- 1 | with open('input_files/day07') as f: 2 | data = [int(x) for x in f.read().split(',')] 3 | 4 | linear_weights = [0] * len(data) 5 | quadratic_weights = [0] * len(data) 6 | for i in range(len(data)): 7 | for position in data: 8 | move = abs(position - i) 9 | linear_weights[i] += move 10 | quadratic_weights[i] += move * (move + 1) // 2 11 | 12 | print(min(linear_weights)) 13 | print(min(quadratic_weights)) 14 | -------------------------------------------------------------------------------- /2021/day08.py: -------------------------------------------------------------------------------- 1 | import re 2 | 3 | with open('input_files/day08') as f: 4 | data = re.findall(r'(.*) \| (.*)', f.read()) 5 | data = [(ins.split(), outs.split()) for ins, outs in data] 6 | 7 | uniques = 0 8 | output_sums = 0 9 | for ins, outs in data: 10 | digits = [set()] * 10 11 | digits[1] = next(set(in_) for in_ in ins if len(in_) == 2) 12 | digits[4] = next(set(in_) for in_ in ins if len(in_) == 4) 13 | digits[7] = next(set(in_) for in_ in ins if len(in_) == 3) 14 | digits[8] = next(set(in_) for in_ in ins if len(in_) == 7) 15 | 16 | five_lens = (set(in_) for in_ in ins if len(in_) == 5) 17 | for five_len in five_lens: 18 | if digits[1].issubset(five_len): 19 | digits[3] = five_len 20 | elif len(digits[4] & five_len) == 3: 21 | digits[5] = five_len 22 | else: 23 | digits[2] = five_len 24 | six_lens = (set(in_) for in_ in ins if len(in_) == 6) 25 | for six_len in six_lens: 26 | if len(six_len & digits[4]) == 4: 27 | digits[9] = six_len 28 | elif len(six_len & digits[5]) == 5: 29 | digits[6] = six_len 30 | else: 31 | digits[0] = six_len 32 | 33 | value = 0 34 | for out in outs: 35 | value = value * 10 + digits.index(set(out)) 36 | if value % 10 in (1, 4, 7, 8): 37 | uniques += 1 38 | output_sums += value 39 | 40 | print(uniques) 41 | print(output_sums) 42 | -------------------------------------------------------------------------------- /2021/day09.py: -------------------------------------------------------------------------------- 1 | from bisect import insort 2 | from collections import deque 3 | from itertools import product 4 | from math import prod 5 | 6 | 7 | def get_adjacent(data, i, j): 8 | adjacent = [] 9 | for dy, dx in (-1, 0), (1, 0), (0, -1), (0, 1): 10 | i1, j1 = i + dy, j + dx 11 | if 0 <= i1 < len(data) and 0 <= j1 < len(data[0]): 12 | adjacent.append((i1, j1)) 13 | return adjacent 14 | 15 | 16 | def bfs(data, i, j): 17 | visited = [(i, j)] 18 | queue = deque(((i, j),)) 19 | while queue: 20 | i, j = queue.pop() 21 | for i1, j1 in get_adjacent(data, i, j): 22 | if (i1, j1) not in visited and data[i1][j1] != 9: 23 | queue.appendleft((i1, j1)) 24 | visited.append((i1, j1)) 25 | return len(visited) 26 | 27 | 28 | with open('input_files/day09') as f: 29 | data = [[int(value) for value in line.strip()] for line in f] 30 | 31 | risks = [] 32 | basins = [] 33 | for i, j in product(range(len(data)), range(len(data[0]))): 34 | adjacent = get_adjacent(data, i, j) 35 | if all(data[i][j] < data[i1][j1] for (i1, j1) in adjacent): 36 | risks.append(data[i][j] + 1) 37 | insort(basins, bfs(data, i, j)) 38 | 39 | print(sum(risks)) 40 | print(prod(basins[-3:])) 41 | -------------------------------------------------------------------------------- /2021/day10.py: -------------------------------------------------------------------------------- 1 | from bisect import insort 2 | 3 | 4 | def get_mismatches(line): 5 | brackets = {'(': ')', '[': ']', '<': '>', '{': '}'} 6 | stack = [] 7 | for i, char in enumerate(line): 8 | if char in brackets: 9 | stack.append(i) 10 | if char in brackets.values(): 11 | if brackets[line[stack.pop()]] != char: 12 | return [char] 13 | return [brackets[line[i]] for i in reversed(stack)] 14 | 15 | 16 | with open('input_files/day10') as f: 17 | data = list(f) 18 | 19 | mismatch_weights = {')': 3, ']': 57, '}': 1197, '>': 25137} 20 | closing_weights = {')': 1, ']': 2, '}': 3, '>': 4} 21 | 22 | mismatch_score = 0 23 | scores = [] 24 | for line in data: 25 | mismatches = get_mismatches(line) 26 | if len(mismatches) == 1: 27 | mismatch_score += mismatch_weights[mismatches[0]] 28 | else: 29 | partial = 0 30 | for bracket in mismatches: 31 | partial = partial * 5 + closing_weights[bracket] 32 | insort(scores, partial) 33 | 34 | print(mismatch_score) 35 | print(scores[len(scores) // 2]) 36 | -------------------------------------------------------------------------------- /2021/day11.py: -------------------------------------------------------------------------------- 1 | from copy import deepcopy 2 | from itertools import product 3 | 4 | 5 | def get_adjacent(data, i, j): 6 | for dy, dx in product([-1, 0, 1], repeat=2): 7 | i1, j1 = i + dy, j + dx 8 | if 0 <= i1 < len(data) and 0 <= j1 < len(data[0]): 9 | yield i1, j1 10 | 11 | 12 | def flash(data, flashes, i, j): 13 | flashes[i][j] = True 14 | for i1, j1 in get_adjacent(data, i, j): 15 | data[i1][j1] += 1 16 | if not flashes[i1][j1] and data[i1][j1] > 9: 17 | flash(data, flashes, i1, j1) 18 | 19 | 20 | def step(data): 21 | next_ = [[0] * len(data[0]) for _ in range(len(data))] 22 | flashes = [[False] * len(data[0]) for _ in range(len(data))] 23 | for i, j in product(range(len(data)), range(len(data[0]))): 24 | next_[i][j] += data[i][j] + 1 25 | if next_[i][j] > 9: 26 | flash(next_, flashes, i, j) 27 | return [[0 if val > 9 else val for val in row] for row in next_] 28 | 29 | 30 | with open('input_files/day11') as f: 31 | data = [[int(val) for val in line.strip()] for line in f] 32 | 33 | board = deepcopy(data) 34 | flashes = 0 35 | for _ in range(100): 36 | board = step(board) 37 | flashes += sum(val == 0 for row in board for val in row) 38 | print(flashes) 39 | 40 | board = deepcopy(data) 41 | steps = 0 42 | while any(val for row in board for val in row): 43 | board = step(board) 44 | steps += 1 45 | print(steps) 46 | -------------------------------------------------------------------------------- /2021/day12.py: -------------------------------------------------------------------------------- 1 | import re 2 | from collections import defaultdict 3 | 4 | 5 | def dfs(last, seen, edges, repeats): 6 | if last == 'end': 7 | return 1 8 | paths = 0 9 | for edge in edges[last]: 10 | if not (edge.islower() and edge in seen): 11 | paths += dfs(edge, seen | {edge}, edges, repeats) 12 | elif edge.islower() and edge in seen and repeats: 13 | paths += dfs(edge, seen, edges, False) 14 | return paths 15 | 16 | 17 | with open('input_files/day12') as f: 18 | data = re.findall(r'(.*)-(.*)\n', f.read()) 19 | 20 | edges = defaultdict(list) 21 | for v1, v2 in data: 22 | if v2 != 'start': 23 | edges[v1].append(v2) 24 | if v1 != 'start': 25 | edges[v2].append(v1) 26 | 27 | print(dfs('start', frozenset(), edges, False)) 28 | print(dfs('start', frozenset(), edges, True)) 29 | -------------------------------------------------------------------------------- /2021/day13.py: -------------------------------------------------------------------------------- 1 | import re 2 | 3 | 4 | def fold(axis, coordinate, points): 5 | new_points = set() 6 | for x, y in points: 7 | if axis == 'x' and x > coordinate: 8 | new_points.add((coordinate * 2 - x, y)) 9 | elif axis == 'y' and y > coordinate: 10 | new_points.add((x, coordinate * 2 - y)) 11 | else: 12 | new_points.add((x, y)) 13 | return new_points 14 | 15 | 16 | def print_grid(points): 17 | max_x = max(x for x, _ in points) + 1 18 | max_y = max(y for _, y in points) + 1 19 | for y in range(max_y): 20 | row = ('#' if (x, y) in points else ' ' for x in range(max_x)) 21 | print(' '.join(row)) 22 | 23 | 24 | with open('input_files/day13') as f: 25 | points, folds = f.read().split('\n\n') 26 | 27 | points = re.findall(r'(\d+),(\d+)', points) 28 | points = {(int(x), int(y)) for x, y in points} 29 | folds = re.findall(r'fold along ([xy])=(\d+)', folds) 30 | folds = [(axis, int(coordinate)) for axis, coordinate in folds] 31 | 32 | print(len(fold(*folds[0], points))) 33 | 34 | for axis, coordinate in folds: 35 | points = fold(axis, coordinate, points) 36 | print_grid(points) 37 | -------------------------------------------------------------------------------- /2021/day14.py: -------------------------------------------------------------------------------- 1 | import re 2 | from collections import Counter, defaultdict 3 | 4 | 5 | def run(n, template, rules): 6 | chars = defaultdict(int, Counter(template)) 7 | template = Counter(zip(template, template[1:])) 8 | for _ in range(n): 9 | temp = defaultdict(int) 10 | for pair, count in template.items(): 11 | chars[rules[pair]] += count 12 | temp[pair[0], rules[pair]] += count 13 | temp[rules[pair], pair[1]] += count 14 | template = temp 15 | return max(chars.values()) - min(chars.values()) 16 | 17 | 18 | with open('input_files/day14') as f: 19 | template, rules = f.read().split('\n\n') 20 | 21 | rules = re.findall(r'(\w+) -> (\w+)', rules) 22 | rules = {tuple(pair): value for pair, value in rules} 23 | 24 | print(run(10, template, rules)) 25 | print(run(40, template, rules)) 26 | -------------------------------------------------------------------------------- /2021/day15.py: -------------------------------------------------------------------------------- 1 | import heapq 2 | 3 | 4 | def get_adjacent(data, i, j): 5 | for dy, dx in ((-1, 0), (1, 0), (0, -1), (0, 1)): 6 | i1, j1 = i + dy, j + dx 7 | if 0 <= i1 < len(data) and 0 <= j1 < len(data[0]): 8 | yield i1, j1 9 | 10 | 11 | def search(grid, width, height): 12 | pq = [(0, (0, 0))] 13 | visited = {(0, 0)} 14 | while pq: 15 | dist, (i, j) = heapq.heappop(pq) 16 | if i == height - 1 and j == width - 1: 17 | return dist 18 | for i1, j1 in get_adjacent(grid, i, j): 19 | if (i1, j1) not in visited: 20 | heapq.heappush(pq, (dist + grid[i1][j1], (i1, j1))) 21 | visited.add((i1, j1)) 22 | 23 | 24 | with open('input_files/day15') as f: 25 | data = [[int(x) for x in line] for line in f.read().splitlines()] 26 | 27 | width = len(data[0]) 28 | height = len(data) 29 | 30 | print(search(data, width, height)) 31 | 32 | new_map = [line * 5 for line in data * 5] 33 | for i in range(height * 5): 34 | for j in range(width * 5): 35 | new_map[i][j] = (new_map[i][j] + i // height + j // width - 1) % 9 + 1 36 | 37 | print(search(new_map, width * 5, height * 5)) 38 | -------------------------------------------------------------------------------- /2021/day16.py: -------------------------------------------------------------------------------- 1 | import math 2 | import operator 3 | from dataclasses import dataclass 4 | 5 | OPS = { 6 | 0: sum, 7 | 1: math.prod, 8 | 2: min, 9 | 3: max, 10 | 4: next, 11 | 5: lambda x: operator.gt(*x), 12 | 6: lambda x: operator.lt(*x), 13 | 7: lambda x: operator.eq(*x), 14 | } 15 | 16 | 17 | @dataclass 18 | class Bits: 19 | data: int 20 | num_bits: int 21 | 22 | def pop(self, n): 23 | self.num_bits -= n 24 | value = self.data >> self.num_bits 25 | self.data &= 2 ** self.num_bits - 1 26 | return value 27 | 28 | 29 | def parse(data): 30 | version = data.pop(3) 31 | type_id = data.pop(3) 32 | packet_data = [] 33 | 34 | if type_id == 4: 35 | literal = 0 36 | while data.pop(1) == 1: 37 | literal = (literal << 4) + data.pop(4) 38 | packet_data.append((literal << 4) + data.pop(4)) 39 | elif data.pop(1) == 1: 40 | num_packets = data.pop(11) 41 | packet_data.extend(parse(data) for _ in range(num_packets)) 42 | else: 43 | num_bits = data.pop(15) 44 | sub_packet_data = Bits(data.pop(num_bits), num_bits) 45 | while sub_packet_data.data > 0: 46 | packet_data.append(parse(sub_packet_data)) 47 | return version, type_id, packet_data 48 | 49 | 50 | def sum_versions(packet): 51 | version, type_id, packet_data = packet 52 | if type_id != 4: 53 | return version + sum(sum_versions(p) for p in packet_data) 54 | return version 55 | 56 | 57 | def evaluate(packet): 58 | if isinstance(packet, int): 59 | return packet 60 | op = OPS[packet[1]] 61 | return op(evaluate(p) for p in packet[2]) 62 | 63 | 64 | with open('input_files/day16') as f: 65 | data = f.read().strip() 66 | 67 | bits = Bits(int(data, 16), len(data) * 4) 68 | packets = parse(bits) 69 | 70 | print(sum_versions(packets)) 71 | print(evaluate(packets)) 72 | -------------------------------------------------------------------------------- /2021/day17.py: -------------------------------------------------------------------------------- 1 | import re 2 | 3 | 4 | def shoot(dx, dy, x=0, y=0): 5 | if min_x <= x <= max_x and min_y <= y <= max_y: 6 | return True 7 | if x > max_x or y < min_y: 8 | return False 9 | return shoot(max(0, dx - 1), dy - 1, x+dx, y+dy) 10 | 11 | 12 | with open('input_files/day17') as f: 13 | data = re.search(r'x=(\d+)..(\d+), y=(-?\d+)..(-?\d+)', f.read()).groups() 14 | min_x, max_x = int(data[0]), int(data[1]) 15 | min_y, max_y = int(data[2]), int(data[3]) 16 | 17 | print(min_y * (min_y + 1) // 2) 18 | 19 | total = 0 20 | for dx in range(int(min_x ** 0.5), max_x + 1): 21 | for dy in range(min_y, -min_y + 1): 22 | total += shoot(dx, dy) 23 | print(total) 24 | -------------------------------------------------------------------------------- /2021/day18.py: -------------------------------------------------------------------------------- 1 | import math 2 | from collections import deque 3 | from itertools import permutations 4 | 5 | 6 | def explode(pair): 7 | stack = [] 8 | depth, to_add, last_digit = 0, 0, None 9 | while pair: 10 | stack.append(pair.popleft()) 11 | if stack[-1] == '[': 12 | if depth < 4: 13 | depth += 1 14 | else: 15 | left, right, _ = (pair.popleft() for _ in range(3)) 16 | if last_digit is not None: 17 | stack[last_digit] += left + to_add 18 | to_add = right 19 | stack[-1] = 0 20 | last_digit = len(stack) - 1 21 | elif stack[-1] == ']': 22 | depth -= 1 23 | elif isinstance(stack[-1], int): 24 | stack[-1] += to_add 25 | to_add = 0 26 | last_digit = len(stack) - 1 27 | return deque(stack) 28 | 29 | 30 | def split(pair): 31 | new_pair = deque() 32 | while pair: 33 | char = pair.popleft() 34 | if isinstance(char, int) and char > 9: 35 | left, right = math.floor(char / 2), math.ceil(char / 2) 36 | new_pair.extend(('[', left, right, ']')) 37 | return new_pair + pair, True 38 | new_pair.append(char) 39 | return new_pair, False 40 | 41 | 42 | def reduce(pair): 43 | has_split = True 44 | while has_split: 45 | pair = explode(pair) 46 | pair, has_split = split(pair) 47 | return pair 48 | 49 | 50 | def magnitude(pair): 51 | stack = [] 52 | for char in pair: 53 | if char == ']': 54 | right, left = stack.pop(), stack.pop() 55 | stack.append(left * 3 + right * 2) 56 | elif isinstance(char, int): 57 | stack.append(char) 58 | return stack[0] 59 | 60 | 61 | with open('input_files/day18') as f: 62 | data = f.read().splitlines() 63 | data = [(c for c in line if c != ',') for line in data] 64 | data = [[int(c) if c.isdigit() else c for c in line] for line in data] 65 | 66 | sum_ = data[0] 67 | for pair in data[1:]: 68 | sum_ = deque(('[', *sum_, *pair, ']')) 69 | sum_ = reduce(sum_) 70 | print(magnitude(sum_)) 71 | 72 | max_ = 0 73 | for x, y in permutations(data, 2): 74 | sum_ = reduce(deque(('[', *x, *y, ']'))) 75 | max_ = max(max_, magnitude(sum_)) 76 | print(max_) 77 | -------------------------------------------------------------------------------- /2021/day19.py: -------------------------------------------------------------------------------- 1 | from itertools import combinations 2 | 3 | 4 | class Scanner: 5 | rotation_lambdas = [ 6 | lambda x, y, z: ((-y, x, z), (-x, -y, z), (y, -x, z)), # x 90, 180, 270 7 | lambda x, y, z: ((z, y, -x), (-x, y, -z), (-z, y, x)), # y 90, 180, 270 8 | lambda x, y, z: ((x, -z, y), (x, -y, -z), (x, z, -y)), # z 90, 180, 270 9 | ] 10 | 11 | def __init__(self, points): 12 | self.points = frozenset(points) 13 | self.rotations = self.get_rotations() 14 | self.position = (0, 0, 0) 15 | 16 | def get_rotations(self): 17 | point_clouds = {self.points} 18 | for rot in Scanner.rotation_lambdas: 19 | temp_clouds = set() 20 | for cloud in point_clouds: 21 | rotated = set(zip(*(rot(*point) for point in cloud))) 22 | temp_clouds |= rotated 23 | point_clouds |= temp_clouds 24 | return point_clouds 25 | 26 | 27 | def match(anchor, scanner): 28 | for rotation in scanner.rotations: 29 | for x1, y1, z1 in anchor.points: 30 | for x2, y2, z2 in rotation: 31 | dx, dy, dz = x1 - x2, y1 - y2, z1 - z2 32 | cloud = set((x + dx, y + dy, z + dz) for x, y, z in rotation) 33 | if len(anchor.points & cloud) >= 12: 34 | return cloud, (dx, dy, dz) 35 | return None, None 36 | 37 | 38 | with open('input_files/day19') as f: 39 | data = f.read().strip().split('\n\n') 40 | data = [line.split('\n')[1:] for line in data] 41 | data = [[line.split(',') for line in cloud] for cloud in data] 42 | data = [[tuple(int(x) for x in line) for line in cloud] for cloud in data] 43 | 44 | scanners = [Scanner(cloud) for cloud in data] 45 | 46 | points = {*data[0]} 47 | to_match = scanners[1:] 48 | anchors = [scanners[0]] 49 | while anchors: 50 | anchor = anchors.pop() 51 | temp = [] 52 | for scanner in to_match: 53 | abs_points, position = match(anchor, scanner) 54 | if abs_points is not None: 55 | points |= abs_points 56 | scanner.points = abs_points 57 | anchors.append(scanner) 58 | scanner.position = position 59 | else: 60 | temp.append(scanner) 61 | to_match = temp 62 | 63 | print(len(points)) 64 | 65 | dist = 0 66 | scanner_positions = {scanner.position for scanner in scanners} 67 | for (x1, y1, z1), (x2, y2, z2) in combinations(scanner_positions, 2): 68 | dist = max(dist, abs(x1 - x2) + abs(y1 - y2) + abs(z1 - z2)) 69 | print(dist) 70 | -------------------------------------------------------------------------------- /2021/day20.py: -------------------------------------------------------------------------------- 1 | from itertools import product 2 | 3 | 4 | def pad(image, value=0): 5 | sides = [value] * 3 6 | tops = [[value] * (len(image[0]) + 6)] * 3 7 | image = [*tops, 8 | *[[*sides, *line, *sides] for line in image], 9 | *tops] 10 | return image 11 | 12 | 13 | def enhance(img, pad_value=0): 14 | img = pad(img, pad_value) 15 | height, width = len(img), len(img[0]) 16 | res = [[0] * width for _ in range(height)] 17 | for i, j in product(range(height - 2), range(width - 2)): 18 | bits = [img[i1][j1] for i1 in range(i, i + 3) for j1 in range(j, j + 3)] 19 | index = int(''.join(map(str, bits)), 2) 20 | res[i + 1][j + 1] = enhancement[index] 21 | return [line[2:-2] for line in res[2:-2]] 22 | 23 | 24 | with open('input_files/day20') as f: 25 | enhancement, img = f.read().split('\n\n') 26 | enhancement = [1 if x == '#' else 0 for x in enhancement] 27 | img = [[1 if x == '#' else 0 for x in line] for line in img.split()] 28 | 29 | enhanced = enhance(enhance(img), pad_value=1) 30 | print(sum(char for line in enhanced for char in line)) 31 | 32 | enhanced = img 33 | for i in range(50): 34 | enhanced = enhance(enhanced, i % 2) 35 | print(sum(char for line in enhanced for char in line)) 36 | -------------------------------------------------------------------------------- /2021/day21.py: -------------------------------------------------------------------------------- 1 | from functools import lru_cache 2 | 3 | 4 | def play(p1, p2, s1=0, s2=0, dice=0): 5 | if s2 >= 1000: 6 | return 0, s1 7 | p1 += sum((dice + i) % 100 for i in (1, 2, 3)) 8 | p1 %= 10 9 | s1 = s1 + p1 + 1 10 | rolls, score = play(p2, p1, s2, s1, (dice + 3) % 100) 11 | return rolls + 3, score 12 | 13 | 14 | @lru_cache(maxsize=None) 15 | def play_quantum(p1, p2, s1=0, s2=0): 16 | if s2 >= 21: 17 | return 0, 1 18 | win1, win2 = 0, 0 19 | for roll, n in (3, 1), (4, 3), (5, 6), (6, 7), (7, 6), (8, 3), (9, 1): 20 | pos = (p1 + roll) % 10 21 | score = s1 + pos + 1 22 | p2_score, p1_score = play_quantum(p2, pos, s2, score) 23 | win1, win2 = win1 + p1_score * n, win2 + p2_score * n 24 | return win1, win2 25 | 26 | 27 | with open('input_files/day21') as f: 28 | p1, p2 = (int(line[-2]) - 1 for line in f.readlines()) 29 | 30 | rolls, score = play(p1, p2) 31 | print(rolls * score) 32 | 33 | print(max(play_quantum(p1, p2))) 34 | -------------------------------------------------------------------------------- /2021/day22.py: -------------------------------------------------------------------------------- 1 | import re 2 | from collections import Counter 3 | 4 | 5 | def get_intersection(cube1, cube2): 6 | x1, x2, y1, y2, z1, z2 = cube1 7 | x3, x4, y3, y4, z3, z4 = cube2 8 | ox1 = max(x1, x3) 9 | ox2 = min(x2, x4) 10 | oy1 = max(y1, y3) 11 | oy2 = min(y2, y4) 12 | oz1 = max(z1, z3) 13 | oz2 = min(z2, z4) 14 | if ox1 <= ox2 and oy1 <= oy2 and oz1 <= oz2: 15 | return ox1, ox2, oy1, oy2, oz1, oz2 16 | 17 | 18 | def get_area(cube): 19 | x1, x2, y1, y2, z1, z2 = cube 20 | return (x2 - x1 + 1) * (y2 - y1 + 1) * (z2 - z1 + 1) 21 | 22 | 23 | def run(ranges): 24 | cubes = Counter() 25 | for setting, *cube in ranges: 26 | temp = Counter() 27 | if setting > 0: 28 | temp[tuple(cube)] = setting 29 | for other_cube, other_setting in cubes.items(): 30 | intersection = get_intersection(cube, other_cube) 31 | if intersection: 32 | temp[intersection] -= other_setting 33 | cubes.update(temp) 34 | return sum(get_area(cube) * setting for cube, setting in cubes.items()) 35 | 36 | 37 | pattern = r'(on|off) x=(-?\d+)..(-?\d+),y=(-?\d+)..(-?\d+),z=(-?\d+)..(-?\d+)' 38 | with open('input_files/day22') as f: 39 | ranges = re.findall(pattern, f.read()) 40 | ranges = [(line[0], *(int(x) for x in line[1:])) for line in ranges] 41 | ranges = [(1 if line[0] == 'on' else -1, *line[1:]) for line in ranges] 42 | 43 | core_ranges = [line for line in ranges if all(x < 50 for x in line[1:])] 44 | core_ranges = [line for line in core_ranges if all(x > -50 for x in line[1:])] 45 | 46 | print(run(core_ranges)) 47 | print(run(ranges)) 48 | -------------------------------------------------------------------------------- /2021/day23.py: -------------------------------------------------------------------------------- 1 | import heapq 2 | import math 3 | from collections import defaultdict, namedtuple 4 | from dataclasses import dataclass 5 | 6 | COST = {"A": 1, "B": 10, "C": 100, "D": 1000} 7 | TARGETS = {"A": 2, "B": 4, "C": 6, "D": 8} 8 | HALL = (0, 1, 3, 5, 7, 9, 10) 9 | PART_TWO = "D#C#B#A\nD#B#A#C".splitlines() 10 | 11 | Amphipod = namedtuple("Amphipod", ["symbol", "index", "depth"]) 12 | 13 | 14 | def main(): 15 | with open("input_files/day23", "r") as f: 16 | lines = f.read().splitlines()[2:-1] 17 | lines = [line.strip().strip("#").split("#") for line in lines] 18 | 19 | amphipods = frozenset( 20 | Amphipod(symbol, index * 2, depth) 21 | for depth, line in enumerate(lines, start=1) 22 | for index, symbol in enumerate(line, start=1) 23 | ) 24 | extended_amphipods = frozenset( 25 | a if a.depth == 1 else Amphipod(a.symbol, a.index, 4) for a in amphipods 26 | ) 27 | extended_amphipods |= frozenset( 28 | Amphipod(symbol, index * 2, depth) 29 | for depth, line in enumerate(PART_TWO, start=2) 30 | for index, symbol in enumerate(line.split("#"), start=1) 31 | ) 32 | print(search(State(amphipods, 2))) 33 | print(search(State(extended_amphipods, 4))) 34 | 35 | 36 | def search(state): 37 | h = [(0, state)] 38 | seen = defaultdict(lambda: math.inf) 39 | while h: 40 | cost, state = heapq.heappop(h) 41 | if len(state.amphipods) == 0: 42 | return cost 43 | next_ = state.moves() 44 | for new_state, added_cost in next_: 45 | total = added_cost + cost 46 | if total < seen[new_state]: 47 | seen[new_state] = total 48 | heapq.heappush(h, (total, new_state)) 49 | 50 | 51 | @dataclass(frozen=True, order=True) 52 | class State: 53 | amphipods: frozenset[Amphipod] 54 | height: int 55 | finished: frozenset[Amphipod] = frozenset() 56 | 57 | def path_clear(self, current, destination): 58 | from_ = min(current + 1, destination) 59 | to = max(current - 1, destination) 60 | return not any( 61 | a.index in range(from_, to + 1) and a.depth == 0 62 | for a in self.amphipods 63 | ) 64 | 65 | def can_move(self, amphipod): 66 | return not any( 67 | a.index == amphipod.index and a.depth < amphipod.depth 68 | for a in self.amphipods 69 | ) 70 | 71 | def moves_of(self, amphipod): 72 | amphipods = self.amphipods - {amphipod} 73 | if amphipod.depth == 0: 74 | yield from self.move_to_room(amphipod, amphipods) 75 | elif self.can_move(amphipod): 76 | yield from self.move_from_room(amphipod, amphipods) 77 | 78 | def move_from_room(self, amphipod, amphipods): 79 | hallway = {loc for loc in HALL if self.path_clear(amphipod.index, loc)} 80 | for loc in hallway: 81 | added_cost = cost_to_move(amphipod, loc) 82 | new_amphipods = amphipods | {Amphipod(amphipod.symbol, loc, 0)} 83 | yield State(new_amphipods, self.height, self.finished), added_cost 84 | 85 | def move_to_room(self, amphipod, amphipods): 86 | target = TARGETS[amphipod.symbol] 87 | room = {a for a in amphipods | self.finished if a.index == target} 88 | room_clear = all(a.symbol == amphipod.symbol for a in room) 89 | if room_clear and self.path_clear(amphipod.index, target): 90 | new_depth = self.height - len(room) 91 | added_cost = cost_to_move(amphipod, target, new_depth) 92 | new_amphipod = Amphipod(amphipod.symbol, target, new_depth) 93 | new_finished = self.finished | {new_amphipod} | room 94 | yield State(amphipods - room, self.height, new_finished), added_cost 95 | 96 | def moves(self): 97 | for amphipod in self.amphipods: 98 | yield from self.moves_of(amphipod) 99 | 100 | 101 | def cost_to_move(amphipod, destination, depth=0): 102 | distance = amphipod.depth + abs(amphipod.index - destination) + depth 103 | return distance * COST[amphipod.symbol] 104 | 105 | 106 | if __name__ == "__main__": 107 | main() 108 | -------------------------------------------------------------------------------- /2021/day24.py: -------------------------------------------------------------------------------- 1 | from z3 import If, Int, Optimize 2 | 3 | # Generate CSV 4 | # with open("input_files/day24", "r") as f: 5 | # instructions = f.read().strip("inp w\n").split("inp w\n") 6 | # instructions = [e.splitlines() for e in instructions] 7 | # instructions = [*zip(*zip(*instructions))] 8 | # print("\n".join(",".join(("inp w", *line)) for line in instructions)) 9 | 10 | A = [1, 1, 1, 26, 1, 26, 1, 1, 1, 26, 26, 26, 26, 26] 11 | B = [12, 10, 10, -6, 11, -12, 11, 12, 12, -2, -5, -4, -4, -12] 12 | C = [6, 2, 13, 8, 13, 8, 3, 11, 10, 8, 14, 6, 8, 2] 13 | 14 | 15 | def solve(a, b, c, maximise): 16 | # Huge thank you to fuglede for their solution on this one 17 | # https://github.com/fuglede 18 | # Fingers crossed there isn't another question like this next year! 19 | solver = Optimize() 20 | w = [Int(f"w{i}") for i in range(14)] 21 | for wi in w: 22 | solver.add(0 < wi, wi <= 9) 23 | if maximise: 24 | solver.maximize(wi) 25 | else: 26 | solver.minimize(wi) 27 | 28 | z = 0 29 | for wi, ai, bi, ci in zip(w, a, b, c): 30 | z = If( 31 | z % 26 + bi != wi, 32 | z / ai * 26 + wi + ci, 33 | z / ai, 34 | ) 35 | solver.add(z == 0) 36 | solver.check() 37 | return "".join(solver.model()[wi].as_string() for wi in w) 38 | 39 | 40 | print(solve(A, B, C, True)) 41 | print(solve(A, B, C, False)) 42 | -------------------------------------------------------------------------------- /2021/day25.py: -------------------------------------------------------------------------------- 1 | def adjacent(i, j, di, dj): 2 | return (i + di) % HEIGHT, (j + dj) % WIDTH 3 | 4 | 5 | def step_facing(grid, facing, di, dj): 6 | next_grid = [line[:] for line in grid] 7 | for i, line in enumerate(grid): 8 | for j, elt in enumerate(line): 9 | if elt == facing: 10 | i1, j1 = adjacent(i, j, di, dj) 11 | if grid[i1][j1] == ".": 12 | next_grid[i][j] = "." 13 | next_grid[i1][j1] = facing 14 | return next_grid 15 | 16 | 17 | def step(grid): 18 | grid = step_facing(grid, ">", 0, 1) 19 | grid = step_facing(grid, "v", 1, 0) 20 | return grid 21 | 22 | 23 | with open("input_files/day25", "r") as f: 24 | grid = f.read().splitlines() 25 | 26 | grid = [list(line) for line in grid] 27 | 28 | WIDTH = len(grid[0]) 29 | HEIGHT = len(grid) 30 | 31 | steps = 1 32 | last_grid = grid 33 | current_grid = step(grid) 34 | while last_grid != current_grid: 35 | steps += 1 36 | current_grid, last_grid = step(current_grid), current_grid 37 | 38 | print(steps) 39 | -------------------------------------------------------------------------------- /2021/input_files/day04: -------------------------------------------------------------------------------- 1 | 87,7,82,21,47,88,12,71,24,35,10,90,4,97,30,55,36,74,19,50,23,46,13,44,69,27,2,0,37,33,99,49,77,15,89,98,31,51,22,96,73,94,95,18,52,78,32,83,85,54,75,84,59,25,76,45,20,48,9,28,39,70,63,56,5,68,61,26,58,92,67,53,43,62,17,81,80,66,91,93,41,64,14,8,57,38,34,16,42,11,86,72,40,65,79,6,3,29,60,1 2 | 3 | 3 55 15 54 81 4 | 56 77 20 99 25 5 | 90 57 67 0 97 6 | 28 45 69 84 14 7 | 91 94 39 36 85 8 | 9 | 52 60 30 7 36 10 | 71 97 77 19 46 11 | 6 3 75 82 24 12 | 4 57 2 11 91 13 | 56 84 23 43 48 14 | 15 | 69 60 78 87 11 16 | 79 30 93 39 63 17 | 32 31 23 90 17 18 | 57 98 13 46 9 19 | 65 94 26 77 19 20 | 21 | 87 68 81 63 95 22 | 91 43 98 49 70 23 | 67 46 12 10 3 24 | 65 93 39 29 34 25 | 45 35 78 40 59 26 | 27 | 95 11 27 19 78 28 | 8 47 87 44 10 29 | 48 83 93 52 23 30 | 16 13 21 1 4 31 | 69 12 40 39 81 32 | 33 | 50 73 63 93 86 34 | 55 76 33 22 75 35 | 61 23 82 37 99 36 | 26 29 85 74 2 37 | 19 78 30 40 6 38 | 39 | 58 2 95 92 78 40 | 25 56 26 9 38 41 | 43 83 4 87 8 42 | 79 61 18 69 49 43 | 24 29 5 41 89 44 | 45 | 56 8 72 92 9 46 | 34 26 28 66 22 47 | 51 42 89 87 90 48 | 98 48 40 18 19 49 | 13 80 71 79 52 50 | 51 | 87 77 82 38 48 52 | 92 36 85 66 71 53 | 97 29 94 9 1 54 | 70 50 19 45 84 55 | 43 6 72 54 89 56 | 57 | 9 60 6 17 14 58 | 97 2 10 84 0 59 | 7 98 51 8 93 60 | 54 77 37 36 1 61 | 72 29 26 47 19 62 | 63 | 92 22 25 19 36 64 | 80 14 24 59 78 65 | 29 45 88 54 4 66 | 37 85 77 46 6 67 | 42 52 43 26 72 68 | 69 | 41 84 36 95 49 70 | 22 17 83 47 99 71 | 25 77 12 71 39 72 | 76 73 60 79 85 73 | 63 94 11 54 51 74 | 75 | 88 29 7 26 45 76 | 25 11 9 82 28 77 | 43 5 41 70 39 78 | 20 69 14 79 37 79 | 78 59 98 93 6 80 | 81 | 99 24 81 51 57 82 | 56 47 7 50 66 83 | 84 85 71 86 31 84 | 17 74 90 26 73 85 | 15 11 12 61 45 86 | 87 | 61 27 84 49 21 88 | 76 15 5 0 2 89 | 35 7 79 77 20 90 | 40 91 72 57 89 91 | 11 33 18 42 78 92 | 93 | 21 38 46 53 50 94 | 49 10 9 59 67 95 | 3 51 96 44 63 96 | 93 45 82 27 47 97 | 69 92 41 85 95 98 | 99 | 14 70 5 4 34 100 | 59 98 53 45 7 101 | 97 29 58 1 84 102 | 19 69 37 93 57 103 | 86 68 35 30 73 104 | 105 | 38 21 7 1 43 106 | 41 9 54 0 11 107 | 51 94 99 75 72 108 | 89 78 79 2 73 109 | 18 90 85 84 10 110 | 111 | 33 68 5 26 8 112 | 51 85 20 49 58 113 | 27 24 88 11 21 114 | 9 65 62 72 31 115 | 95 53 12 14 83 116 | 117 | 1 22 76 11 56 118 | 97 95 79 55 14 119 | 20 53 27 77 23 120 | 37 49 30 72 84 121 | 91 68 8 18 5 122 | 123 | 45 68 6 49 92 124 | 43 90 20 1 78 125 | 77 89 5 10 56 126 | 84 28 73 62 72 127 | 21 47 51 36 14 128 | 129 | 30 71 52 21 13 130 | 20 8 73 38 92 131 | 17 50 59 3 14 132 | 19 76 41 4 90 133 | 57 25 94 82 62 134 | 135 | 52 76 18 60 9 136 | 29 38 5 96 63 137 | 58 70 28 82 1 138 | 40 49 43 25 19 139 | 92 56 80 66 69 140 | 141 | 58 60 90 33 92 142 | 13 74 0 80 84 143 | 77 97 51 70 56 144 | 15 87 68 98 55 145 | 1 64 35 3 83 146 | 147 | 77 43 69 58 34 148 | 42 12 75 27 28 149 | 74 54 30 2 15 150 | 63 21 81 90 9 151 | 6 22 29 65 19 152 | 153 | 60 89 43 26 86 154 | 47 52 12 17 90 155 | 56 54 96 37 75 156 | 3 80 0 19 85 157 | 39 61 13 59 73 158 | 159 | 94 59 82 21 68 160 | 87 19 69 79 31 161 | 64 57 72 43 25 162 | 49 5 81 67 76 163 | 95 16 58 52 51 164 | 165 | 33 36 1 61 85 166 | 11 74 37 89 30 167 | 24 59 31 76 62 168 | 4 50 81 69 78 169 | 66 57 9 94 7 170 | 171 | 6 20 26 2 9 172 | 52 34 63 89 13 173 | 16 65 30 29 27 174 | 97 18 47 53 19 175 | 79 7 38 33 39 176 | 177 | 90 20 79 95 44 178 | 0 96 98 74 60 179 | 80 65 36 93 67 180 | 54 25 81 84 10 181 | 21 56 83 14 66 182 | 183 | 99 1 17 41 95 184 | 66 29 47 74 43 185 | 63 68 72 97 96 186 | 92 79 13 93 4 187 | 25 42 44 78 23 188 | 189 | 17 19 98 55 14 190 | 2 35 42 22 64 191 | 52 32 69 27 82 192 | 85 16 89 41 81 193 | 10 70 95 56 84 194 | 195 | 64 4 94 51 35 196 | 25 60 33 24 80 197 | 59 40 14 47 93 198 | 32 74 42 46 26 199 | 49 75 7 95 79 200 | 201 | 39 98 43 56 73 202 | 92 63 13 61 36 203 | 4 34 35 10 11 204 | 30 19 75 26 41 205 | 54 37 65 15 58 206 | 207 | 89 64 83 43 42 208 | 71 32 25 63 34 209 | 80 93 99 86 16 210 | 31 33 94 27 91 211 | 8 17 81 41 85 212 | 213 | 16 89 41 87 53 214 | 27 29 64 30 81 215 | 20 47 18 1 50 216 | 56 82 93 4 45 217 | 71 21 63 25 15 218 | 219 | 61 12 97 41 32 220 | 51 85 64 16 99 221 | 68 2 43 10 86 222 | 69 5 38 94 11 223 | 92 74 20 83 90 224 | 225 | 98 96 44 95 36 226 | 63 42 56 24 21 227 | 40 7 65 48 59 228 | 18 11 2 58 13 229 | 86 41 0 53 20 230 | 231 | 0 74 23 35 48 232 | 21 34 97 10 2 233 | 17 25 80 89 60 234 | 15 27 94 68 7 235 | 72 75 69 32 85 236 | 237 | 29 72 40 13 9 238 | 48 41 21 66 94 239 | 20 23 42 53 84 240 | 93 14 7 57 77 241 | 67 36 10 81 0 242 | 243 | 85 92 45 94 75 244 | 58 79 9 98 5 245 | 14 39 40 48 88 246 | 96 61 36 62 7 247 | 32 81 77 8 27 248 | 249 | 78 80 98 62 87 250 | 90 53 91 81 23 251 | 46 15 4 63 74 252 | 30 6 47 64 44 253 | 12 45 95 68 99 254 | 255 | 88 4 53 84 25 256 | 71 36 20 46 74 257 | 48 70 5 63 94 258 | 15 65 78 33 67 259 | 99 64 76 97 26 260 | 261 | 64 96 69 13 60 262 | 31 26 86 38 46 263 | 35 90 45 97 40 264 | 98 87 21 61 1 265 | 27 67 77 29 66 266 | 267 | 74 97 72 66 1 268 | 34 50 2 57 33 269 | 29 71 52 88 73 270 | 16 7 39 40 24 271 | 15 38 80 54 17 272 | 273 | 22 99 67 95 97 274 | 60 68 38 18 96 275 | 89 46 57 8 11 276 | 7 12 61 83 35 277 | 17 74 42 52 58 278 | 279 | 10 19 44 12 41 280 | 82 71 1 26 55 281 | 52 88 6 97 48 282 | 16 66 36 50 29 283 | 67 2 65 0 45 284 | 285 | 68 16 99 57 12 286 | 36 50 32 19 91 287 | 43 21 52 31 69 288 | 41 82 37 49 75 289 | 20 74 87 76 63 290 | 291 | 81 10 7 80 78 292 | 29 86 6 13 67 293 | 19 12 23 54 68 294 | 64 85 40 43 87 295 | 16 5 59 3 34 296 | 297 | 79 37 13 17 31 298 | 56 22 24 7 58 299 | 65 76 38 39 85 300 | 45 36 90 3 66 301 | 25 52 28 61 71 302 | 303 | 18 20 21 74 33 304 | 77 30 29 56 26 305 | 86 49 44 75 62 306 | 11 47 10 90 97 307 | 64 94 6 43 67 308 | 309 | 77 59 44 58 41 310 | 85 30 22 56 19 311 | 62 16 35 32 88 312 | 91 94 34 51 9 313 | 31 33 13 60 90 314 | 315 | 94 56 72 12 59 316 | 64 78 2 80 96 317 | 41 99 69 21 79 318 | 17 88 36 37 85 319 | 89 7 66 15 84 320 | 321 | 61 80 26 83 11 322 | 62 42 51 79 31 323 | 86 98 64 28 58 324 | 2 19 71 35 52 325 | 14 34 0 32 44 326 | 327 | 1 50 76 15 12 328 | 96 55 73 61 19 329 | 74 0 79 5 8 330 | 3 36 53 67 52 331 | 60 49 93 43 85 332 | 333 | 71 75 35 44 1 334 | 82 96 22 68 81 335 | 19 25 52 62 97 336 | 28 64 73 99 92 337 | 38 60 42 70 20 338 | 339 | 38 15 77 19 74 340 | 5 89 17 10 16 341 | 96 48 40 42 57 342 | 21 18 51 56 29 343 | 86 63 25 45 93 344 | 345 | 98 36 26 69 2 346 | 70 75 18 89 81 347 | 33 24 10 76 47 348 | 28 59 54 49 58 349 | 62 19 53 73 16 350 | 351 | 96 84 52 86 47 352 | 70 14 26 46 81 353 | 90 53 66 16 87 354 | 34 9 91 83 41 355 | 61 29 13 49 77 356 | 357 | 78 49 94 33 18 358 | 91 83 55 73 44 359 | 19 4 14 6 3 360 | 45 28 57 12 9 361 | 41 1 82 79 95 362 | 363 | 74 38 35 88 6 364 | 80 21 32 3 71 365 | 1 34 17 8 2 366 | 94 24 84 26 91 367 | 64 27 83 60 23 368 | 369 | 93 18 27 52 28 370 | 83 90 40 8 87 371 | 21 3 4 99 26 372 | 14 13 71 41 91 373 | 20 63 69 38 30 374 | 375 | 49 20 31 70 5 376 | 37 7 94 85 84 377 | 68 90 45 4 6 378 | 96 46 10 97 63 379 | 9 89 34 25 52 380 | 381 | 9 79 30 87 53 382 | 43 3 47 32 0 383 | 59 29 44 11 98 384 | 31 75 41 91 12 385 | 8 14 62 73 94 386 | 387 | 43 52 60 16 61 388 | 40 5 99 90 44 389 | 35 78 83 75 64 390 | 29 10 32 11 79 391 | 59 18 72 54 30 392 | 393 | 11 19 84 76 12 394 | 7 91 24 81 93 395 | 4 59 78 63 69 396 | 46 72 74 43 28 397 | 94 55 73 35 1 398 | 399 | 51 6 64 31 82 400 | 52 75 43 68 42 401 | 95 49 21 63 46 402 | 96 19 33 97 70 403 | 1 60 78 56 23 404 | 405 | 73 40 83 36 26 406 | 32 61 43 66 39 407 | 63 15 34 98 3 408 | 68 79 44 12 27 409 | 4 57 96 7 52 410 | 411 | 63 77 12 89 17 412 | 64 16 90 46 88 413 | 33 65 58 55 85 414 | 45 83 41 71 68 415 | 57 81 56 13 15 416 | 417 | 34 33 49 54 10 418 | 97 77 14 22 59 419 | 26 45 16 13 76 420 | 3 87 75 66 47 421 | 2 53 56 23 63 422 | 423 | 42 38 69 33 96 424 | 32 90 53 2 59 425 | 56 22 45 11 54 426 | 92 25 8 30 60 427 | 75 41 19 79 70 428 | 429 | 17 88 80 21 3 430 | 96 91 27 15 72 431 | 61 62 5 23 75 432 | 67 8 37 40 65 433 | 76 46 49 13 35 434 | 435 | 90 7 11 28 54 436 | 98 37 88 35 14 437 | 12 20 71 44 80 438 | 24 55 97 83 6 439 | 36 59 66 48 26 440 | 441 | 90 87 75 28 7 442 | 32 14 80 62 6 443 | 81 12 18 22 52 444 | 51 89 16 41 93 445 | 55 0 43 40 11 446 | 447 | 28 49 8 75 21 448 | 34 77 84 66 17 449 | 6 82 98 22 1 450 | 20 93 94 96 40 451 | 58 80 18 63 19 452 | 453 | 94 63 36 29 53 454 | 27 61 32 79 71 455 | 8 87 67 58 1 456 | 78 97 88 28 12 457 | 59 74 70 89 80 458 | 459 | 48 37 57 42 26 460 | 31 69 10 1 91 461 | 23 38 99 79 49 462 | 68 19 61 75 43 463 | 90 59 30 94 44 464 | 465 | 76 56 21 17 24 466 | 73 59 71 46 50 467 | 35 9 97 92 26 468 | 33 98 30 7 34 469 | 52 5 91 68 60 470 | 471 | 35 63 55 99 8 472 | 2 94 66 29 14 473 | 50 54 72 57 44 474 | 90 34 9 69 95 475 | 31 45 49 27 33 476 | 477 | 62 14 84 0 85 478 | 59 36 64 43 31 479 | 47 4 33 8 24 480 | 28 46 39 20 22 481 | 3 80 72 21 40 482 | 483 | 19 92 34 62 2 484 | 7 98 44 3 5 485 | 59 45 25 33 52 486 | 85 87 65 9 89 487 | 16 63 36 28 78 488 | 489 | 72 84 91 77 93 490 | 48 99 80 21 90 491 | 52 6 15 86 47 492 | 19 32 83 53 22 493 | 94 1 61 38 10 494 | 495 | 52 1 12 93 33 496 | 59 11 82 96 10 497 | 54 36 97 32 55 498 | 5 2 76 49 81 499 | 48 60 62 98 27 500 | 501 | 65 62 7 22 52 502 | 19 91 53 9 81 503 | 51 20 82 99 60 504 | 24 72 3 49 54 505 | 35 94 74 38 42 506 | 507 | 60 28 11 10 35 508 | 18 40 22 78 27 509 | 53 3 52 1 63 510 | 41 31 23 16 68 511 | 70 98 42 84 33 512 | 513 | 64 99 92 95 74 514 | 35 86 87 33 40 515 | 3 79 13 44 39 516 | 34 57 69 50 80 517 | 9 42 29 77 6 518 | 519 | 22 71 46 44 88 520 | 42 70 94 60 43 521 | 50 92 95 57 63 522 | 24 39 35 18 68 523 | 28 34 77 81 91 524 | 525 | 49 41 21 59 32 526 | 44 46 19 20 22 527 | 88 45 85 10 38 528 | 84 18 70 77 11 529 | 33 43 63 0 47 530 | 531 | 86 23 32 30 25 532 | 85 40 26 39 71 533 | 88 3 72 93 19 534 | 53 59 52 55 73 535 | 51 58 90 49 81 536 | 537 | 33 25 87 46 58 538 | 90 55 53 82 54 539 | 30 89 11 81 29 540 | 41 83 28 35 94 541 | 49 97 48 72 34 542 | 543 | 86 22 0 27 89 544 | 78 64 87 59 11 545 | 85 19 60 61 3 546 | 31 55 17 79 5 547 | 93 4 1 26 66 548 | 549 | 96 11 86 81 31 550 | 28 37 7 64 36 551 | 27 29 6 53 69 552 | 30 21 8 50 60 553 | 43 1 12 63 97 554 | 555 | 81 3 10 25 41 556 | 4 54 96 45 51 557 | 76 68 74 52 63 558 | 26 77 21 82 69 559 | 70 6 19 43 93 560 | 561 | 63 72 20 36 53 562 | 65 84 61 92 67 563 | 28 15 69 52 68 564 | 95 21 44 48 96 565 | 93 78 94 62 91 566 | 567 | 39 13 53 94 1 568 | 95 42 48 93 79 569 | 71 32 65 2 82 570 | 96 22 99 46 54 571 | 37 35 34 29 11 572 | 573 | 52 40 66 96 26 574 | 11 69 62 91 85 575 | 58 92 75 48 71 576 | 19 31 28 12 15 577 | 99 76 90 87 98 578 | 579 | 52 95 93 9 76 580 | 11 63 68 89 17 581 | 13 8 99 78 33 582 | 14 53 6 4 47 583 | 26 35 57 67 73 584 | 585 | 96 71 14 40 34 586 | 16 80 55 67 19 587 | 36 4 63 91 61 588 | 46 77 43 81 23 589 | 22 54 79 76 89 590 | 591 | 69 28 48 84 35 592 | 31 86 58 91 45 593 | 37 25 97 13 14 594 | 65 32 80 99 23 595 | 94 63 60 41 90 596 | 597 | 19 47 13 80 58 598 | 69 53 15 81 20 599 | 21 39 70 22 26 600 | 56 92 61 65 42 601 | 96 76 86 87 41 602 | -------------------------------------------------------------------------------- /2021/input_files/day06: -------------------------------------------------------------------------------- 1 | 4,2,4,1,5,1,2,2,4,1,1,2,2,2,4,4,1,2,1,1,4,1,2,1,2,2,2,2,5,2,2,3,1,4,4,4,1,2,3,4,4,5,4,3,5,1,2,5,1,1,5,5,1,4,4,5,1,3,1,4,5,5,5,4,1,2,3,4,2,1,2,1,2,2,1,5,5,1,1,1,1,5,2,2,2,4,2,4,2,4,2,1,2,1,2,4,2,4,1,3,5,5,2,4,4,2,2,2,2,3,3,2,1,1,1,1,4,3,2,5,4,3,5,3,1,5,5,2,4,1,1,2,1,3,5,1,5,3,1,3,1,4,5,1,1,3,2,1,1,1,5,2,1,2,4,2,3,3,2,3,5,1,5,1,2,1,5,2,4,1,2,4,4,1,5,1,1,5,2,2,5,5,3,1,2,2,1,1,4,1,5,4,5,5,2,2,1,1,2,5,4,3,2,2,5,4,2,5,4,4,2,3,1,1,1,5,5,4,5,3,2,5,3,4,5,1,4,1,1,3,4,4,1,1,5,1,4,1,2,1,4,1,1,3,1,5,2,5,1,5,2,5,2,5,4,1,1,4,4,2,3,1,5,2,5,1,5,2,1,1,1,2,1,1,1,4,4,5,4,4,1,4,2,2,2,5,3,2,4,4,5,5,1,1,1,1,3,1,2,1 2 | -------------------------------------------------------------------------------- /2021/input_files/day07: -------------------------------------------------------------------------------- 1 | 1101,1,29,67,1102,0,1,65,1008,65,35,66,1005,66,28,1,67,65,20,4,0,1001,65,1,65,1106,0,8,99,35,67,101,99,105,32,110,39,101,115,116,32,112,97,115,32,117,110,101,32,105,110,116,99,111,100,101,32,112,114,111,103,114,97,109,10,760,1085,275,960,23,133,190,86,999,298,714,247,509,704,122,1109,713,51,41,1028,59,10,251,0,600,201,103,176,482,204,747,540,57,33,133,90,724,793,294,1618,762,65,1579,4,603,1182,25,12,718,30,1534,614,1021,1175,20,647,201,65,136,798,526,1,1060,70,329,194,54,747,423,349,261,604,133,32,1074,148,177,997,597,703,158,1265,472,277,52,320,467,899,333,750,40,588,311,456,1298,1511,33,1037,946,199,12,1751,221,14,1046,686,552,288,231,926,747,67,105,537,1264,654,539,211,549,294,381,662,6,523,239,48,487,6,575,553,218,1404,160,1196,330,336,1690,215,134,1312,186,1502,377,52,2,479,649,523,330,737,112,40,846,171,102,1614,39,514,438,932,143,443,1270,339,548,230,430,420,521,431,83,517,463,12,517,173,72,45,806,65,280,559,1076,332,162,50,606,1468,15,128,34,77,533,211,1157,789,111,67,308,462,147,1106,215,801,1294,203,98,833,136,136,1363,539,114,365,690,1378,266,1,212,537,283,327,55,96,377,57,899,37,1397,747,341,4,555,72,283,356,70,1410,33,311,1255,382,1076,50,98,314,214,49,281,33,1143,11,1270,396,477,265,156,763,86,595,1182,139,1085,499,1,3,7,90,408,1062,37,1175,56,925,1118,463,93,198,678,839,507,511,151,1081,146,1,553,292,208,384,787,395,360,1587,400,981,22,852,109,342,52,173,439,980,1058,11,282,117,558,652,370,86,81,178,531,309,691,254,183,324,495,511,26,57,1473,19,243,1290,392,362,1533,837,397,207,251,1250,584,700,431,1084,204,89,4,1439,48,1163,100,149,73,426,107,882,868,145,352,434,1445,354,74,1134,166,118,792,722,198,228,157,119,1178,789,947,670,1247,726,28,474,35,137,24,328,152,270,429,368,1113,132,364,32,122,12,1314,227,513,215,96,235,142,230,100,1112,119,308,1590,509,297,494,316,916,816,791,1204,42,660,1207,1170,257,663,120,12,18,1579,1164,110,432,601,397,323,376,656,128,34,215,1572,744,156,1081,330,1084,245,83,620,409,463,1029,1178,952,334,1344,963,109,8,462,174,302,1441,12,16,701,466,1794,620,442,227,165,894,1542,94,261,419,962,1047,1294,400,3,355,394,125,25,674,774,44,22,492,384,44,457,121,188,132,1226,185,991,822,1351,1126,638,258,134,349,204,72,330,1006,124,969,981,586,61,670,0,158,316,794,835,1086,160,506,293,798,77,44,1337,106,602,1459,665,85,364,1328,363,32,796,344,1894,178,742,347,626,267,304,909,130,82,189,284,745,14,50,494,36,113,632,527,140,817,136,1707,1227,792,1774,4,159,1233,85,486,515,917,16,200,333,335,328,640,347,311,1297,1489,1047,653,1,56,157,833,257,1294,237,759,124,453,1205,447,734,976,364,315,656,19,336,42,566,61,73,212,107,747,1033,130,1896,1283,1028,877,336,325,127,762,887,644,965,955,25,562,1042,975,410,346,387,1432,1303,1,257,87,814,1101,1399,38,204,1753,69,201,1347,442,169,272,1593,136,21,1821,200,60,99,76,6,88,1657,1825,539,92,705,1402,297,1309,316,614,84,403,204,45,805,119,67,149,384,179,188,1712,68,226,1430,1137,0,561,515,1233,9,450,657,216,516,197,829,413,53,792,792,432,397,97,120,876,596,287,44,125,37,70,225,27,5,122,1936,14,492,151,1072,464,62,478,1393,35,747,510,100,1242,10,1608,212,281,15,905,81,49,198,318,278,751,219,211,561,33,1787,64,419,1,809,410,228,196,333,261,1,454,1364,637,654,224,107,1573,907,245,129,346,619,111,392,40,273,256,1,807,1594,51,766,1113,21,31,745,1510,204,25,125,124,434,608,546,0,251,81,116,957,973,76,1129,320,368,851,302,711,612,84,218,809,858,1460,818,136,886,1160,1284,531,1617,122,1091,539,231,318,616,148,1366,291,537,1606,1004,317,43,1424,469,1193,500,479,431,470,1316,32,953,593,1162,803,761,60,255,369,1250,275,1534,312,258,36,114,308,672,94,698,231,34,213,168,64,1170,44,1547,246,1607,733,479,87,554,101,68,631,673,231,177,392,627,464,405,415,148,1478,396,1309,445,298,445,428,208,510,371,788,597,635,1230,111,325,121,1173,21,157,576,5,365,319,858,722,259,129,198,555,83,160,1125,467,784,100,706,155,209,446,821,379,732,160,233,114,644,565,106,656,863,354,1246,266,437,41,154 2 | -------------------------------------------------------------------------------- /2021/input_files/day09: -------------------------------------------------------------------------------- 1 | 7678999878989655432345789645679998765678998765434567897854323489543467898999785456789123989109765458 2 | 6567898767878943101234678923678987654599987533323468976543212379954578967898654398993299879998754387 3 | 5428988654567893212645699213567898543689876321013456897654323567895699656799543237894988659876543235 4 | 6219876532178954324596988901289999698799965434565567998865439878976789545678932146999876545995432124 5 | 5301988631079966546689877892397898799899876567677678989876545689989897234999943239898985432987654265 6 | 6212987432367897656899756789456789989943987878998789878987659792196976546899865498767994321398754376 7 | 5429876543456789897998767896569898978932198989949896569999798943235989756798976987656789520999866789 8 | 6534989654678898999239878987698987567893239996823987698898987894476799868987897896547897639898997894 9 | 7676798798799967894345989399897696457894547895612998987657896789987897979986789987535679798767989923 10 | 8787899999895459965456895499987545348987656954109899996532345996598965499765678996547899987955679434 11 | 9898998798986578977567896989876432167899767963298789987831234897679879987654567987698929896434598945 12 | 9949987696598789898978999876989643456789878974987679876542546789889999998543479998999019765323597896 13 | 8939998985439896789989389965597656587898999989876545989753657895999989899697568919998998943210126789 14 | 7998999874321965889991278954498768998987999899976432399864798934989876789987678924987987895434335991 15 | 6877999965439654567892469893349879019876789789876541989878999329876545678998789439876896796545449890 16 | 5456889879998963456953998792123989929965456699987799876989987912983534767999896598965345689987659789 17 | 5345678998787999769899877689934599898766344578999989545697896899892123457899987987421236799998998678 18 | 1234589987656787998787654577895789789654213799098765433456895698789012456999699876434349988999987567 19 | 2455689898546876987665343456789895698766439893129876212356924997679133477897578987646498877899999456 20 | 3576798765435455696543212567899964569987898993298865101248939876568949588926496798797987765698976567 21 | 4799897654321234987854343456999653456798987989987654312346795325459998999212345699998986564567899688 22 | 6989998767433345699765454567898799999969876678999985323489893210298987992101296789029897423456998789 23 | 8979879876544476789876565778919987878954965567899876544678954321987676789212989893298775212347999893 24 | 9769865989699988895987986789929876565969854349965988965989875439896565678939878965997654303567895932 25 | 8949876798987899954598987899899975444898765456894999876898986698765434567898767899876543212347894541 26 | 6732987987896789543459998987698765323789878677923899988987897987854324678987656999989754323456943210 27 | 5421299896785678952349879999549886212678989989765789199876759876544215799999545698999865534568964721 28 | 7532398765654679893499767897632998343567893598986891098765345975432106789987234997964987665778965673 29 | 9678998544263456789988959789543987657678932467897932129954234596543312899876129876853498786899876789 30 | 8989876432102345679876434678954598767899743478998943498764345987986324678944098765432129897999998996 31 | 7899987653212456789954323499765679898987654589129654569895456798875435899432129874321012979998999765 32 | 6789998764343568899983212389876789999598765699939765678987667899986545986543298985435433567897898654 33 | 5698999889654689969874301278987899995439876799898996789998789967987676897684987899876574679946999543 34 | 4567894998788797645965212367998978989567988899787789898999895456798789999895996212987989789035698912 35 | 3459943219899895434596776456789765878979899987645678987689954345679896798999854301298999892124567901 36 | 2588954323999954323987886567898954569898789895434567998567893234699945987998765412569321943235678912 37 | 1467975754798765102498997688967932456789698765423478899455789124989239886569885323457939654345679324 38 | 2356899765679843212349998799456891348995569543213456789324678939878998776457995434567898965567789535 39 | 4567899879789764334467999890345989969544398754302398893213999998767987654349876776699957896788998745 40 | 7679943989999878876578987921235679898931239965614689965354899989654398768124997898789546789899987656 41 | 8789432199899989987679765434356898777999459877323567896765789878965459878236898949895435899987898769 42 | 9996431098788991098789879865468999656788968986545978987976899769879878989356999434976567978976989898 43 | 6797643989657989199894989976789987547897899898767989898988998656989989198767898921297678967965678997 44 | 5989859764546778987953299987898798623456798769878998789999987545699993239878957890998989456894567986 45 | 4578998943436567996592109798987643214567989657989987667999987636798954569989346989879594345993479875 46 | 3459976832323456789489297659298754323579876545699876557989999947997895678994219878965432256989599854 47 | 1569765321012367892378989432129898734567988435689764345678998799896989789875699767895421019878989763 48 | 2979876465433458921269878993234987655689876324997653256789989654765678999986987656789532198767978932 49 | 9899997598545769210359767989345698978789995436789767967999978943234568989999876545679673299956767891 50 | 7678998987656898521298655678956789989890987545679978979998767894345679878998765434568984987845656789 51 | 5467869998769987439987834567997891299991987676789989999987656789459894567899875323479895996434345679 52 | 4328956999878976598765423456789920198989998789897594987654345679767893479999983212998789875321234589 53 | 3212347899999987689896514567895439987878999899969423498543234578978942346789765929877678995434345699 54 | 4323456789998998799987625678976598965456899998754312987654547899989321457899879898765534987646656789 55 | 5436567998987899989699876789987987854345799879876533498987656789795452567954999789854424987657898896 56 | 9597778987656999879545987899898996543236878965987645569998768995696563467892987689943215598768959934 57 | 8989899876545698768996798998759897652123467894598786689999879654989694598993995578994103469878948923 58 | 7678956989656987656989899987545789643014989912989897899898989769979989679989894469989912456989237894 59 | 6567899998768996545678956795437699654423458909878969998797899898768778989977673234767893567890146789 60 | 5454578999899998656989349989326578967434567898769459997656999987855667899866582123456789678921237993 61 | 5323457898988998767892198975412468998658998987658998878546689876543556789954321014569899989743678932 62 | 5434578987677789878989987654301656789767899498767897651234579994312347898765432785678999998654568941 63 | 8656789876435678989678999765212345699878901399988999530145678987523556789879545676789898999875678932 64 | 8798999754323699094567899874323456899999213989999998921456789797687678999988657887896787893986989543 65 | 9899898765214589123789998765474587998765439778899876542347895698798789999899767998965345932397899655 66 | 8946789874345678934690989987565678999876598656789987673656954329899898898789898979873234991098998976 67 | 7657894995456789545791976798786789989989987545791298784967899212945997787678999965432125789199687897 68 | 9767923987877897656999875899897899878998996434690249899878998909896985678567899876553239899987545699 69 | 9898934998988998987899987899998999767987654323589356976989876898799864323456789998674999989995432378 70 | 3939999879399899598978998998789998656798895212679467895499965536567973212345892139799889578976653467 71 | 2123989765456789799767899887699987545989987825678978954349873213459854323456999012998778989987854578 72 | 1034979876789894987656789765569895239875498434569989767459654323498765456567897999875667899998769989 73 | 3249867987899965986545678954498764345984399565878999878598776434789896587689966789943458999879898999 74 | 4398756798959896965434989543359895459865987676789999998679986565699987678797655698965567896567987678 75 | 5987545789349789874323478921239876567978998787899989598789997676789998889893234987896689965439876567 76 | 6798435678998678955412567890124989878989799898998879329899898789897899997992109986999791986323965456 77 | 8999323699987589432101678921265696989997678999997568912998759897996987656789298975698910987439854345 78 | 9998434598765478943312989892376965399876546798775467893498942956889876545678987764567891296598763234 79 | 6987545789876569765529899789499894236995435987655345679987621345678965434786796543456799397998521065 80 | 5698656795998978997698765678998789945989412396543238789296549496789876212345987432345678989997432156 81 | 4569767894349989989899876789987687899875324987652146790197698989997984101456798543456789979876543234 82 | 7695979943256997878999989899876546798765459876543234892398797678976543219597987654767899865989754546 83 | 8983598954569876557998998913985434569878969987656345789989986567897655998989998866978998754599867656 84 | 9672567895698987445987897654954323678989978998765456999879876458989769897778999877899999863212998767 85 | 8543479976987894323456789799899939899497989549877667898765964345678979786667899988989987654201239879 86 | 7656567899996789434569899988767898954345798767998788987654321234589998654557898999678996543212378989 87 | 8767678998987896545678999875456787943234679878999899876543210156799987543238967976579998754323567898 88 | 9878789987698939876789398754346896795345799989989942987654921234578975432123459985458999895454578967 89 | 2989999896579920987996209543212345689567989899875321298769832345689986543234567894367899986895789456 90 | 3499998755465891298965498932101234567978978789965433349987655466789987654355678965456989998999892345 91 | 9567897645234789349996987893323346788989865667899564559998776567894298765696989796567978999998921234 92 | 8978965432145679959889896894894487899998754345978975698989897678992199896787897689679867899867890123 93 | 7899876541034567898775765789765698910987543234567896987676998989989987979898976578998956989656989934 94 | 6987998643123456789654324899876789991299654345678999876545789999879876569969323488987645678945679895 95 | 5476789654234569898775013678989898989399865476789998964335679986567965498653212346986534799134998799 96 | 4345698765545878959898723459994967979988976597998997643212398765457894329965623678997656789029898678 97 | 3236989876676789543997634678943459869877997689367899854323459854346965939876784569789867997998767567 98 | 2135678987798994312498545689642399759866859789245699978754667965457899845989765679679878956999543458 99 | 3446889398919865324987656796530987649754349890134589989765778976579998756799897789545989349898742455 100 | 4587993209101965435698787895421298432101245932375678999876899987678999867899998996432191298765431234 101 | -------------------------------------------------------------------------------- /2021/input_files/day10: -------------------------------------------------------------------------------- 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 | -------------------------------------------------------------------------------- /2021/input_files/day11: -------------------------------------------------------------------------------- 1 | 6636827465 2 | 6774248431 3 | 4227386366 4 | 7447452613 5 | 6223122545 6 | 2814388766 7 | 6615551144 8 | 4836235836 9 | 5334783256 10 | 4128344843 -------------------------------------------------------------------------------- /2021/input_files/day12: -------------------------------------------------------------------------------- 1 | we-NX 2 | ys-px 3 | ys-we 4 | px-end 5 | yq-NX 6 | px-NX 7 | yq-px 8 | qk-yq 9 | pr-NX 10 | wq-EY 11 | pr-oe 12 | wq-pr 13 | ys-end 14 | start-we 15 | ys-start 16 | oe-DW 17 | EY-oe 18 | end-oe 19 | pr-yq 20 | pr-we 21 | wq-start 22 | oe-NX 23 | yq-EY 24 | ys-wq 25 | ys-pr 26 | -------------------------------------------------------------------------------- /2021/input_files/day14: -------------------------------------------------------------------------------- 1 | FNFPPNKPPHSOKFFHOFOC 2 | 3 | VS -> B 4 | SV -> C 5 | PP -> N 6 | NS -> N 7 | BC -> N 8 | PB -> F 9 | BK -> P 10 | NV -> V 11 | KF -> C 12 | KS -> C 13 | PV -> N 14 | NF -> S 15 | PK -> F 16 | SC -> F 17 | KN -> K 18 | PN -> K 19 | OH -> F 20 | PS -> P 21 | FN -> O 22 | OP -> B 23 | FO -> C 24 | HS -> F 25 | VO -> C 26 | OS -> B 27 | PF -> V 28 | SB -> V 29 | KO -> O 30 | SK -> N 31 | KB -> F 32 | KH -> C 33 | CC -> B 34 | CS -> C 35 | OF -> C 36 | FS -> B 37 | FP -> H 38 | VN -> O 39 | NB -> N 40 | BS -> H 41 | PC -> H 42 | OO -> F 43 | BF -> O 44 | HC -> P 45 | BH -> S 46 | NP -> P 47 | FB -> C 48 | CB -> H 49 | BO -> C 50 | NN -> V 51 | SF -> N 52 | FC -> F 53 | KK -> C 54 | CN -> N 55 | BV -> F 56 | FK -> C 57 | CF -> F 58 | VV -> B 59 | VF -> S 60 | CK -> C 61 | OV -> P 62 | NC -> N 63 | SS -> F 64 | NK -> V 65 | HN -> O 66 | ON -> P 67 | FH -> O 68 | OB -> H 69 | SH -> H 70 | NH -> V 71 | FF -> B 72 | HP -> B 73 | PO -> P 74 | HB -> H 75 | CH -> N 76 | SN -> P 77 | HK -> P 78 | FV -> H 79 | SO -> O 80 | VH -> V 81 | BP -> V 82 | CV -> P 83 | KP -> K 84 | VB -> N 85 | HV -> K 86 | SP -> N 87 | HO -> P 88 | CP -> H 89 | VC -> N 90 | CO -> S 91 | BN -> H 92 | NO -> B 93 | HF -> O 94 | VP -> K 95 | KV -> H 96 | KC -> F 97 | HH -> C 98 | BB -> K 99 | VK -> P 100 | OK -> C 101 | OC -> C 102 | PH -> H 103 | -------------------------------------------------------------------------------- /2021/input_files/day15: -------------------------------------------------------------------------------- 1 | 1219917144152175521192937532735222272149142113771132143147736143821412611744118289583116354731774896 2 | 2557512188918722129241527232426994127475524882192911212273111191198918793769715954435631918975113353 3 | 5148523873321627398918131496732819295119712179711821713519886567141523157142619551992311453629315192 4 | 9632263822975132424163835224215815892118427192363791212959143352271227157116392913928119722459511125 5 | 3185531228179249199132957128512117111252215481499141912134153119363486721329112488129931544281746943 6 | 6444131257861912212213566341547625318612947741947592216383971229498251819853114728336521972351727213 7 | 6119491432245199553227565792296746663122251697311779965288819515139517181957182294511562659256672111 8 | 4171583111313321126172811385811255321273232454216251182121721131484211131831222492993728891981971114 9 | 1341849511511242171164255384447912212224719734743691122834632315218249551449671182115252121111156181 10 | 1121112491757379637111862858819612765926153911965619342514253127318148225883471116411283421481483345 11 | 1167137612323494235488916856964241714189111237191123629184132141111145253521464198423217838223242512 12 | 4311612195114191713711476122347911218991144817112121211611193399913617171241119191358941941128724511 13 | 2123711542281113233832612196322232224151811634272257192329211311115581942712113212557511132196641138 14 | 1213849757651153121353111121622819181131276414791121199285198731447891282943722115918164451314891482 15 | 8452414871316392311777435436449543321181278443124146282942335735799416795143316673734922393215263431 16 | 1279122141849833212177412212838363622166617823729182112922111161453729411617138551811798732554949918 17 | 1249419231711833991175332636161189983115218158581538822611657182121479211193211938125232371429245361 18 | 1319258512511139586913231118441291591712823735497296423917382353927134296132251532517492181693411375 19 | 3525191191342199293611167759151664313711134582741267191119461121431366123241927264523633112827214271 20 | 9387118746621534231131157516179343324752261123871127136532194122712932711311169283228722736522371834 21 | 4773514993519731492815621358211411439197463211136622834191131692919839112122181453172122255696861725 22 | 3198931377211519252141913161796151721418913267284128732587818431983433989963478138411161529411442572 23 | 2261499111361913823877342734465371229822182162132411947122174411152929198117151833172327911496151286 24 | 1961496281554884563122217455413111211628441529812218185321989446486689759325931211447941121311212314 25 | 3897242126711516589731569241135932561698777441162448251991349531993617884911148182621295295122135611 26 | 2412811444213823453246272367143231179558517361221185171111342171325361145992297331819913259413111527 27 | 9611111926111324991251141139812726231992911859513889884411422919226713323221711295798927912283813619 28 | 9563121343236772122984113282397434332892136811221126115712291632516112269949177199243128132147287541 29 | 8111836813275591191867182961221351352186133971921336475946474313133263141973412912119126431488746929 30 | 1819173956922111422339121928412725813184246318863216182117297149338314431117222121391942333715414442 31 | 3555392111317621347223556715543171546344431881435581192481113191839943868211448112211874545221334171 32 | 2222739299125482136593114624843922229242828241722681491234612921121197412271122915951873118379932344 33 | 8894211352921451247112111832115887222164719188413154182176233121511325216772371748814217111971291441 34 | 1241119546122152111234315223196183447191811299123422311336244221352485349331293341114119632223634797 35 | 4637913139122613238169186977764211118113343332851211117171224779326113113921321619812743123318122412 36 | 2461337399253583154176111281131145124112913691774116211773211142599211377341692716467112811115121192 37 | 1153375721177212844436432531661238112449236334311651313321796596121211551711299261661929611861251898 38 | 4893154234747691512431996536141312369111759297162949119242173188691662292511328133924822414724191117 39 | 5211775126411114348121619292141499234125581151111113111149141278442371171172594946555112147652634299 40 | 5917442496111599898513259229261421311181591691652923111351675561542342955131564454586482191829212192 41 | 9865167621895314375711471159161159158313433712114124412212168279119321622991152764966122421479798231 42 | 6548332431327841911816143662519918911614913451327118181631211961151355726862969176165531631753248521 43 | 5122351829687371111443237234211291132275428173941122649496341219371168219125531141627511818841483129 44 | 3141533982287711251295246118381924133118191856944972112175571441512626962511223133726161425521149241 45 | 1821514936525118453193161518897576271879751936248147412942297553212947276421421999264129282438111231 46 | 6141863149146173593991157124416744781625932429378911421331232112247414988122711418587999129921221122 47 | 2895979246915111697386933211415182292171391339699351319296991249321449625463511311243334911121812412 48 | 9177815411963232141161419498192413849819511221131618249691181151221218142512512822221741292341241892 49 | 9819396217132198357912599619225141914974518191118289523187528714716116111413142941111222347936964419 50 | 7765213221824954389191123482488934933151372615399632117813129121643375133484515211794242186441632541 51 | 6951214213553792986255118522686218217292313176158411312115195111332671114991213236936519198143236111 52 | 9118287696282937591138441514192592117643231764197725942334257111713232715122281852399745911114271137 53 | 4566422611231133195134162897522357348143161728134311794135115211225351133121513783383214256277311532 54 | 4475393713114151182644171131852591421261492882128118319154692171421187171684511672619911172348164194 55 | 1111217799913661277119632571453317646718377991238132523827595949362221445516394911114115131363191811 56 | 7765812716992133119444669152192111667198133189233863123711311327383681188761121456592218131114819336 57 | 1388184462842955782412892223162192325251579369336785211348512617232196131228482959731138937157718498 58 | 1442281432432331243141181167352743261155331127154521914436339624135153921111991841222144349221983263 59 | 2118911111722128423435369234197632171161321332713739152981254534392116711212168748182558241119612292 60 | 7425835555999411456115219711486928871791194911622422443131131151869943793121849452757479151541193238 61 | 6273533932119332144337838911241924161952426152244282136613131931814413713937961331142348314112627681 62 | 3619382443482484922182198232111231252214976973134811171119137322129479818551912311199121291122162929 63 | 3912426218529951835351144327195139233117757188845988637711159522282848376115132711917168971451261518 64 | 3265925112111433392872328782961619171185173966152417141155325312131122616411333111238191716261257485 65 | 1242716431166513161625111114683932616217931984541184688911592972726739656935164145121145132631314979 66 | 3415492185254118831924313536616252481713116172113531691597114621371211158112161119334313826141379994 67 | 5441892282127311173977232233728731115776543922581812411399115488149292752192929319849273222151196922 68 | 1235743787531916112292489438144472231211658527293188711973137267112212211167314293171287136682955115 69 | 1333294722215132412221221262162219457229132119913516725252151338221919327451136911113112117336822515 70 | 9331231123592911822263353141831119975118161447142819761483517671116143433133142332512659131913222721 71 | 3992253114286291383443278312415738212511824722112142285454597529913218231311912211942471216196171264 72 | 7711342215218256815142128911292422371111121543424241292139213131665264611211251126121888119691522734 73 | 8411511211111416645747264431231945531421941991159321719191626986135153918923138823123521913311198361 74 | 6121728223451261313327971988476382228291893892961729321143199752834127947814918789111334173233399917 75 | 9313991119478121911791171414449229764818191131372312248732529637235133261912819111353262161311546151 76 | 6649929178412651913799572613826355481534259121496795338311425411595416142114438611896811513191294332 77 | 2132111122838179135732712817169152933112621182473182281571194352212917691913414532612228113172111358 78 | 2134222915341933394564321262512639111728333221919123218326614591155318825191435373754119826745581171 79 | 6742116731122431232352198412116792152911711441192111114918117431269171311433451923331143412222412131 80 | 7219269346518212476157254134997112325122255417321112617147112914699612443937121912819111166191791856 81 | 1291426781442111827269315611129912298472441375137133924961118112332121213446939299391382279288479832 82 | 5111286128131184229931541119389592147372869163918183417952918911352311258311537699525638569517633869 83 | 1359593994121893927658864372474592242416516361415129132114962419923181927917646131191196311617581293 84 | 1237169312421138451513332522714144374669422211691149331324891299921786471185594199159179126153974198 85 | 7138277991213181681291435176294846458821417597651324616721711192111269574424121725841217526321921113 86 | 2161711131191415119721833839443682513651341232156254241697172725136211433293118592564228291612193175 87 | 1727751123829611982619162593242155341421111359221311219161583917218119189643995635165131411717212478 88 | 3117829197616964164244562631312123353771267731191121111669399731835815516112513151252241917416362637 89 | 3194136151344178679113326751926511212592171651666551146418825317116834246251364323719111772313131587 90 | 4291217141757268211156428822859436947765174113615122993621171932855219161411491911134545431181711299 91 | 5997413363617522311289962152813138983337592831554436331449697411511331141919367112145863531983739525 92 | 4921956113922148983493293662286283931168581912293125191141141933921922555924248751397286198663591915 93 | 1215941691191215417121184719678595241271547449751274399115174111167841222943228823242831122511727131 94 | 1159182321242861312426534714612318674343111171114851259411791112329417724215297322521225512741224311 95 | 6281341219211943791368131121321267212256393218518218419131162114813236387812741163832532141821219916 96 | 4193245278439599314115597967195121393211954731119312111183627617215112219382729591791697152923521124 97 | 7271212528143433228925278813516213957172122199181859163721121116782941621321111232342127151299298258 98 | 1193171222181731577512311151622115325981249325524411329527149123294187131519331115293169191191188974 99 | 7361414488876111685422912712199945339791122321313661373284819524231223276991835456242151321911173365 100 | 6132116139116159519661211214183822195812917735711165919172937611282417713718496254611651115137154211 101 | -------------------------------------------------------------------------------- /2021/input_files/day16: -------------------------------------------------------------------------------- 1 | 6053231004C12DC26D00526BEE728D2C013AC7795ACA756F93B524D8000AAC8FF80B3A7A4016F6802D35C7C94C8AC97AD81D30024C00D1003C80AD050029C00E20240580853401E98C00D50038400D401518C00C7003880376300290023000060D800D09B9D03E7F546930052C016000422234208CC000854778CF0EA7C9C802ACE005FE4EBE1B99EA4C8A2A804D26730E25AA8B23CBDE7C855808057C9C87718DFEED9A008880391520BC280004260C44C8E460086802600087C548430A4401B8C91AE3749CF9CEFF0A8C0041498F180532A9728813A012261367931FF43E9040191F002A539D7A9CEBFCF7B3DE36CA56BC506005EE6393A0ACAA990030B3E29348734BC200D980390960BC723007614C618DC600D4268AD168C0268ED2CB72E09341040181D802B285937A739ACCEFFE9F4B6D30802DC94803D80292B5389DFEB2A440081CE0FCE951005AD800D04BF26B32FC9AFCF8D280592D65B9CE67DCEF20C530E13B7F67F8FB140D200E6673BA45C0086262FBB084F5BF381918017221E402474EF86280333100622FC37844200DC6A8950650005C8273133A300465A7AEC08B00103925392575007E63310592EA747830052801C99C9CB215397F3ACF97CFE41C802DBD004244C67B189E3BC4584E2013C1F91B0BCD60AA1690060360094F6A70B7FC7D34A52CBAE011CB6A17509F8DF61F3B4ED46A683E6BD258100667EA4B1A6211006AD367D600ACBD61FD10CBD61FD129003D9600B4608C931D54700AA6E2932D3CBB45399A49E66E641274AE4040039B8BD2C933137F95A4A76CFBAE122704026E700662200D4358530D4401F8AD0722DCEC3124E92B639CC5AF413300700010D8F30FE1B80021506A33C3F1007A314348DC0002EC4D9CF36280213938F648925BDE134803CB9BD6BF3BFD83C0149E859EA6614A8C 2 | -------------------------------------------------------------------------------- /2021/input_files/day17: -------------------------------------------------------------------------------- 1 | target area: x=288..330, y=-96..-50 2 | -------------------------------------------------------------------------------- /2021/input_files/day18: -------------------------------------------------------------------------------- 1 | [3,[5,[7,[3,9]]]] 2 | [[[[7,0],0],[2,[2,8]]],[[[7,8],1],3]] 3 | [[[[2,7],0],7],4] 4 | [[2,1],[9,0]] 5 | [[[[7,1],[3,2]],[[9,8],5]],[2,7]] 6 | [[[8,9],[[8,7],0]],[[[8,7],[6,3]],[[1,7],[8,9]]]] 7 | [[8,6],[[9,[1,7]],[6,[3,9]]]] 8 | [[2,[[5,6],6]],[[4,[5,9]],[3,[4,5]]]] 9 | [[[[2,0],[1,1]],[6,6]],[[1,9],[[2,7],[6,8]]]] 10 | [[[4,6],[[6,3],[3,9]]],[[[2,6],[6,1]],[[9,9],[1,5]]]] 11 | [[[4,[3,1]],3],6] 12 | [[0,[[5,2],8]],[1,[9,[4,3]]]] 13 | [[[[8,6],[2,1]],[2,[8,6]]],[[[7,1],[3,9]],0]] 14 | [[[[4,7],[2,7]],[[8,9],2]],[[[2,4],[7,2]],[3,7]]] 15 | [[5,[2,2]],[[1,6],[[9,1],[5,0]]]] 16 | [[5,[[1,2],[6,4]]],[6,8]] 17 | [[[5,[1,7]],7],[7,[8,1]]] 18 | [[1,9],[[0,3],[[6,7],[2,4]]]] 19 | [1,[7,[[0,6],0]]] 20 | [[[[5,7],9],[[3,2],7]],[[5,1],[9,9]]] 21 | [[[[0,4],[9,6]],[[8,3],[7,4]]],[7,[6,2]]] 22 | [[[[1,6],0],[[8,0],[3,4]]],[[3,[0,3]],4]] 23 | [4,[[7,8],[4,[9,7]]]] 24 | [[[2,[3,7]],5],[0,[9,9]]] 25 | [[[2,0],[[5,8],[7,6]]],[[9,[6,2]],[3,2]]] 26 | [[[3,1],3],[[[3,7],6],[9,8]]] 27 | [[7,[[2,5],5]],[5,[3,[4,5]]]] 28 | [[[6,7],6],[2,[[9,3],9]]] 29 | [[[[5,6],7],[[3,2],5]],[[9,[4,3]],[3,8]]] 30 | [0,7] 31 | [[[4,6],[2,9]],[[[7,6],[5,1]],7]] 32 | [[0,5],[[1,[4,1]],[[7,3],9]]] 33 | [[[2,[3,8]],5],[[[5,9],8],[7,0]]] 34 | [[[6,[8,6]],[[3,6],7]],[[2,1],[6,[7,5]]]] 35 | [[2,[[6,3],[8,9]]],[[[5,6],4],[[7,0],1]]] 36 | [[[[7,1],[5,6]],8],[[[8,9],4],[8,3]]] 37 | [[[9,2],[1,0]],0] 38 | [[5,[5,[8,5]]],4] 39 | [[3,[5,[4,9]]],3] 40 | [[8,[[7,7],6]],5] 41 | [[4,[[5,1],1]],[1,[1,[9,8]]]] 42 | [[[7,[3,6]],[[2,8],[4,7]]],[[[8,8],[4,0]],[2,4]]] 43 | [[[[3,6],3],[0,9]],2] 44 | [[2,8],[[8,[8,6]],[[1,1],[4,5]]]] 45 | [[2,[1,[1,0]]],[[[6,2],[7,4]],[[7,1],6]]] 46 | [3,[8,[7,[8,6]]]] 47 | [[1,0],[[[0,4],[0,5]],[1,5]]] 48 | [[[[5,0],4],[[7,8],[8,8]]],[[1,7],0]] 49 | [1,[[[4,1],7],[6,[9,0]]]] 50 | [[[1,8],2],[[5,5],[8,5]]] 51 | [[4,[9,[0,6]]],[[[8,9],[4,5]],4]] 52 | [[[[5,4],[1,7]],[[3,1],[7,9]]],[[[0,8],[4,7]],[[5,9],6]]] 53 | [[[[8,0],9],4],[[7,[1,3]],5]] 54 | [[[[5,0],6],[[6,1],8]],[[9,1],7]] 55 | [[9,[6,[8,8]]],[7,[[7,1],6]]] 56 | [[[5,[1,5]],[3,[4,2]]],[[[5,2],7],[[6,9],[2,8]]]] 57 | [[[5,[5,5]],[5,7]],[4,[[2,9],7]]] 58 | [[[[0,4],0],[[0,6],[3,0]]],[0,[[8,1],2]]] 59 | [[[7,[4,6]],[[7,2],[4,6]]],[[[9,3],[4,9]],6]] 60 | [[6,7],7] 61 | [[[4,1],[8,[1,5]]],[[4,6],0]] 62 | [[[4,[5,5]],5],[[0,[2,7]],[1,1]]] 63 | [[[[0,1],3],[6,7]],[4,7]] 64 | [[4,[6,4]],[[[9,8],1],[9,3]]] 65 | [[[4,9],0],[[[7,0],[0,9]],[1,[1,0]]]] 66 | [[[7,9],[[9,5],[6,9]]],[[0,[3,0]],[0,[5,9]]]] 67 | [9,[[0,0],[[1,9],9]]] 68 | [[[5,[0,5]],[[9,8],[9,5]]],[[0,[2,5]],7]] 69 | [[[[5,8],6],9],[[[2,7],7],[[7,8],5]]] 70 | [[8,[[4,7],6]],2] 71 | [[[[7,1],[9,0]],[9,[1,7]]],[[8,[6,7]],[2,5]]] 72 | [[4,[2,9]],8] 73 | [[[[7,6],[5,3]],[5,[9,7]]],[[6,[8,1]],[[6,4],9]]] 74 | [[7,[[7,8],4]],[[1,3],[4,[9,7]]]] 75 | [[[6,[6,7]],[[2,8],3]],[7,[6,[0,3]]]] 76 | [[9,8],[[0,[4,8]],[[9,1],1]]] 77 | [[[[4,0],[5,9]],7],[6,[[5,9],[9,6]]]] 78 | [[8,1],[1,[9,[8,3]]]] 79 | [[[1,[5,1]],[6,7]],[[5,9],[2,[6,7]]]] 80 | [[[3,7],[[7,8],1]],[[0,[6,3]],[8,0]]] 81 | [[5,[[9,3],[1,2]]],7] 82 | [[[1,[9,9]],3],[[6,4],[4,1]]] 83 | [[6,[1,[3,6]]],[2,9]] 84 | [[2,[0,2]],[5,[[9,4],[5,0]]]] 85 | [[4,[[3,1],[7,0]]],[[9,1],[[5,5],[6,7]]]] 86 | [[3,[[7,1],[3,4]]],[7,[9,[9,4]]]] 87 | [[9,9],[[5,4],[[9,7],4]]] 88 | [[[5,1],8],[[6,7],9]] 89 | [[[0,[9,5]],[4,3]],[3,2]] 90 | [[[6,[4,1]],[[8,7],[5,3]]],[[[1,2],5],[[9,2],5]]] 91 | [[[[7,4],[9,0]],[[1,8],[2,9]]],[[5,[1,9]],[4,0]]] 92 | [[[4,[3,8]],[[3,3],[2,8]]],[[[1,3],9],[[8,5],6]]] 93 | [[[[6,4],[7,9]],[[7,6],8]],[7,[9,8]]] 94 | [[7,[3,5]],7] 95 | [[[[5,0],[2,3]],[3,7]],[[4,[6,3]],[7,[4,4]]]] 96 | [[6,[3,[7,6]]],[[[5,8],[8,1]],[3,[1,5]]]] 97 | [[8,[9,[5,2]]],2] 98 | [[1,[5,4]],[[7,[8,0]],8]] 99 | [[[[2,7],4],3],[[1,4],[8,4]]] 100 | [3,[9,2]] 101 | -------------------------------------------------------------------------------- /2021/input_files/day20: -------------------------------------------------------------------------------- 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 | -------------------------------------------------------------------------------- /2021/input_files/day21: -------------------------------------------------------------------------------- 1 | Player 1 starting position: 7 2 | Player 2 starting position: 3 3 | -------------------------------------------------------------------------------- /2021/input_files/day23: -------------------------------------------------------------------------------- 1 | ############# 2 | #...........# 3 | ###A#D#A#C### 4 | #C#D#B#B# 5 | ######### -------------------------------------------------------------------------------- /2021/input_files/day24: -------------------------------------------------------------------------------- 1 | inp w 2 | mul x 0 3 | add x z 4 | mod x 26 5 | div z 1 6 | add x 12 7 | eql x w 8 | eql x 0 9 | mul y 0 10 | add y 25 11 | mul y x 12 | add y 1 13 | mul z y 14 | mul y 0 15 | add y w 16 | add y 6 17 | mul y x 18 | add z y 19 | inp w 20 | mul x 0 21 | add x z 22 | mod x 26 23 | div z 1 24 | add x 10 25 | eql x w 26 | eql x 0 27 | mul y 0 28 | add y 25 29 | mul y x 30 | add y 1 31 | mul z y 32 | mul y 0 33 | add y w 34 | add y 2 35 | mul y x 36 | add z y 37 | inp w 38 | mul x 0 39 | add x z 40 | mod x 26 41 | div z 1 42 | add x 10 43 | eql x w 44 | eql x 0 45 | mul y 0 46 | add y 25 47 | mul y x 48 | add y 1 49 | mul z y 50 | mul y 0 51 | add y w 52 | add y 13 53 | mul y x 54 | add z y 55 | inp w 56 | mul x 0 57 | add x z 58 | mod x 26 59 | div z 26 60 | add x -6 61 | eql x w 62 | eql x 0 63 | mul y 0 64 | add y 25 65 | mul y x 66 | add y 1 67 | mul z y 68 | mul y 0 69 | add y w 70 | add y 8 71 | mul y x 72 | add z y 73 | inp w 74 | mul x 0 75 | add x z 76 | mod x 26 77 | div z 1 78 | add x 11 79 | eql x w 80 | eql x 0 81 | mul y 0 82 | add y 25 83 | mul y x 84 | add y 1 85 | mul z y 86 | mul y 0 87 | add y w 88 | add y 13 89 | mul y x 90 | add z y 91 | inp w 92 | mul x 0 93 | add x z 94 | mod x 26 95 | div z 26 96 | add x -12 97 | eql x w 98 | eql x 0 99 | mul y 0 100 | add y 25 101 | mul y x 102 | add y 1 103 | mul z y 104 | mul y 0 105 | add y w 106 | add y 8 107 | mul y x 108 | add z y 109 | inp w 110 | mul x 0 111 | add x z 112 | mod x 26 113 | div z 1 114 | add x 11 115 | eql x w 116 | eql x 0 117 | mul y 0 118 | add y 25 119 | mul y x 120 | add y 1 121 | mul z y 122 | mul y 0 123 | add y w 124 | add y 3 125 | mul y x 126 | add z y 127 | inp w 128 | mul x 0 129 | add x z 130 | mod x 26 131 | div z 1 132 | add x 12 133 | eql x w 134 | eql x 0 135 | mul y 0 136 | add y 25 137 | mul y x 138 | add y 1 139 | mul z y 140 | mul y 0 141 | add y w 142 | add y 11 143 | mul y x 144 | add z y 145 | inp w 146 | mul x 0 147 | add x z 148 | mod x 26 149 | div z 1 150 | add x 12 151 | eql x w 152 | eql x 0 153 | mul y 0 154 | add y 25 155 | mul y x 156 | add y 1 157 | mul z y 158 | mul y 0 159 | add y w 160 | add y 10 161 | mul y x 162 | add z y 163 | inp w 164 | mul x 0 165 | add x z 166 | mod x 26 167 | div z 26 168 | add x -2 169 | eql x w 170 | eql x 0 171 | mul y 0 172 | add y 25 173 | mul y x 174 | add y 1 175 | mul z y 176 | mul y 0 177 | add y w 178 | add y 8 179 | mul y x 180 | add z y 181 | inp w 182 | mul x 0 183 | add x z 184 | mod x 26 185 | div z 26 186 | add x -5 187 | eql x w 188 | eql x 0 189 | mul y 0 190 | add y 25 191 | mul y x 192 | add y 1 193 | mul z y 194 | mul y 0 195 | add y w 196 | add y 14 197 | mul y x 198 | add z y 199 | inp w 200 | mul x 0 201 | add x z 202 | mod x 26 203 | div z 26 204 | add x -4 205 | eql x w 206 | eql x 0 207 | mul y 0 208 | add y 25 209 | mul y x 210 | add y 1 211 | mul z y 212 | mul y 0 213 | add y w 214 | add y 6 215 | mul y x 216 | add z y 217 | inp w 218 | mul x 0 219 | add x z 220 | mod x 26 221 | div z 26 222 | add x -4 223 | eql x w 224 | eql x 0 225 | mul y 0 226 | add y 25 227 | mul y x 228 | add y 1 229 | mul z y 230 | mul y 0 231 | add y w 232 | add y 8 233 | mul y x 234 | add z y 235 | inp w 236 | mul x 0 237 | add x z 238 | mod x 26 239 | div z 26 240 | add x -12 241 | eql x w 242 | eql x 0 243 | mul y 0 244 | add y 25 245 | mul y x 246 | add y 1 247 | mul z y 248 | mul y 0 249 | add y w 250 | add y 2 251 | mul y x 252 | add z y 253 | -------------------------------------------------------------------------------- /2022/day01.py: -------------------------------------------------------------------------------- 1 | with open("input_files/day01", "r") as f: 2 | data = f.read().split("\n\n") 3 | data = [[int(item) for item in pack.splitlines()] for pack in data] 4 | data = [sum(pack) for pack in data] 5 | data = sorted(data) 6 | 7 | print(data[-1]) 8 | print(sum(data[-3:])) 9 | -------------------------------------------------------------------------------- /2022/day02.py: -------------------------------------------------------------------------------- 1 | def score(p1, p2): 2 | if (p1 - 1) % 3 == p2: 3 | return p2 + 1 4 | elif (p2 - 1) % 3 == p1: 5 | return p2 + 7 6 | return p2 + 4 7 | 8 | 9 | with open("input_files/day02", "r") as f: 10 | data = f.read().splitlines() 11 | data = [line.split() for line in data] 12 | data = [(ord(p1) - ord("A"), ord(p2) - ord("X")) for p1, p2 in data] 13 | 14 | moves = [(p1, (p1 + p2 - 1) % 3) for p1, p2 in data] 15 | 16 | print(sum(score(p1, p2) for p1, p2 in data)) 17 | print(sum(score(p1, p2) for p1, p2 in moves)) 18 | -------------------------------------------------------------------------------- /2022/day03.py: -------------------------------------------------------------------------------- 1 | from string import ascii_letters 2 | 3 | with open("input_files/day03", "r") as f: 4 | data = f.read().splitlines() 5 | 6 | middles = [len(line) // 2 for line in data] 7 | compartments = [(line[:i], line[i:]) for line, i in zip(data, middles)] 8 | compartments = [(set(c1) & set(c2)).pop() for c1, c2 in compartments] 9 | 10 | groups = [data[i: i + 3] for i in range(0, len(data), 3)] 11 | groups = [map(set, group) for group in groups] 12 | groups = [set.intersection(*group).pop() for group in groups] 13 | 14 | print(sum(ascii_letters.index(item) + 1 for item in compartments)) 15 | print(sum(ascii_letters.index(item) + 1 for item in groups)) 16 | -------------------------------------------------------------------------------- /2022/day04.py: -------------------------------------------------------------------------------- 1 | import re 2 | 3 | with open("input_files/day04", "r") as f: 4 | data = re.findall(r"(\d+)-(\d+),(\d+)-(\d+)", f.read()) 5 | data = [[int(e) for e in row] for row in data] 6 | 7 | contained = [(a <= c <= d <= b or c <= a <= b <= d) for a, b, c, d in data] 8 | overlap = [max(a, c) <= min(b, d) for a, b, c, d in data] 9 | 10 | print(sum(contained)) 11 | print(sum(overlap)) 12 | -------------------------------------------------------------------------------- /2022/day05.py: -------------------------------------------------------------------------------- 1 | import re 2 | from itertools import zip_longest 3 | 4 | with open("input_files/day05", "r") as f: 5 | crates, moves = f.read().split("\n\n") 6 | 7 | crates = crates.splitlines()[:-1] 8 | crates = [crate[1::4] for crate in crates] 9 | crates = zip_longest(*crates[::-1], fillvalue=" ") 10 | crates = [[e for e in crate if not e.isspace()] for crate in crates] 11 | 12 | moves = re.findall(r"move (\d+) from (\d+) to (\d+)", moves) 13 | moves = [map(int, move) for move in moves] 14 | moves = [[amt, from_ - 1, to - 1] for amt, from_, to in moves] 15 | 16 | crate_mover_9000 = [crate[:] for crate in crates] 17 | crate_mover_9001 = [crate[:] for crate in crates] 18 | 19 | for amt, from_, to in moves: 20 | crate_mover_9000[to] += crate_mover_9000[from_][:-amt - 1:-1] 21 | del crate_mover_9000[from_][-amt:] 22 | 23 | crate_mover_9001[to] += crate_mover_9001[from_][-amt:] 24 | del crate_mover_9001[from_][-amt:] 25 | 26 | print("".join(crate[-1] for crate in crate_mover_9000)) 27 | print("".join(crate[-1] for crate in crate_mover_9001)) 28 | -------------------------------------------------------------------------------- /2022/day06.py: -------------------------------------------------------------------------------- 1 | with open("input_files/day06", "r") as f: 2 | data = f.read() 3 | 4 | fours = (set(data[i:i+4]) for i in range(len(data))) 5 | fourteens = (set(data[i:i + 14]) for i in range(len(data))) 6 | 7 | idx4 = next(i + 4 for i, window in enumerate(fours) if len(window) == 4) 8 | idx14 = next(i + 14 for i, window in enumerate(fourteens) if len(window) == 14) 9 | 10 | print(idx4) 11 | print(idx14) 12 | -------------------------------------------------------------------------------- /2022/day07.py: -------------------------------------------------------------------------------- 1 | import re 2 | 3 | with open("input_files/day07", "r") as f: 4 | data = iter(f.read().splitlines()) 5 | 6 | sizes = [] 7 | stack = [0] 8 | while stack: 9 | line = next(data, "$ cd ..") 10 | if line == "$ cd ..": 11 | child = stack.pop() 12 | if stack: 13 | sizes.append(child) 14 | stack[-1] += child 15 | elif cd := re.match(r"\$ cd .+", line): 16 | stack.append(0) 17 | elif file := re.match(r"(\d+) .+", line): 18 | stack[-1] += int(file.group(1)) 19 | 20 | space_needed = 30_000_000 - (70_000_000 - sizes[-1]) 21 | sizes = sorted(sizes) 22 | 23 | print(sum(elt for elt in sizes if elt <= 100_000)) 24 | print(next(elt for elt in sizes if elt >= space_needed)) 25 | -------------------------------------------------------------------------------- /2022/day08.py: -------------------------------------------------------------------------------- 1 | from math import prod 2 | 3 | with open("input_files/day08", "r") as f: 4 | data = f.read().splitlines() 5 | 6 | data = [[int(e) for e in line] for line in data] 7 | data_t = [*zip(*data)] 8 | 9 | invisibles = 0 10 | best_scenic_score = 0 11 | for i in range(1, len(data) - 1): 12 | row = data[i] 13 | for j in range(1, len(data[0]) - 1): 14 | col = data_t[j] 15 | target = data[i][j] 16 | runs = (row[j - 1::-1], row[j + 1:], col[i - 1::-1], col[i + 1:]) 17 | 18 | invisibles += all(any(t >= target for t in run) for run in runs) 19 | score = prod( 20 | next((k + 1 for k, t in enumerate(run) if t >= target), len(run)) 21 | for run in runs 22 | ) 23 | best_scenic_score = max(best_scenic_score, score) 24 | 25 | print(len(data[0]) * len(data) - invisibles) 26 | print(best_scenic_score) 27 | -------------------------------------------------------------------------------- /2022/day09.py: -------------------------------------------------------------------------------- 1 | def solve(positions, n): 2 | t_steps = [(0, 0)] 3 | for _ in range(n): 4 | t_steps = [(0, 0)] 5 | for h in positions: 6 | hx, hy, tx, ty = *h, *t_steps[-1] 7 | dx, dy = hx - tx, hy - ty 8 | if max(abs(dx), abs(dy)) > 1: 9 | dx, dy = max(-1, min(dx, 1)), max(-1, min(dy, 1)) 10 | t_steps.append((tx + dx, ty + dy)) 11 | positions = t_steps 12 | return len(set(t_steps)) 13 | 14 | 15 | with open("input_files/day09", "r") as f: 16 | data = f.read().splitlines() 17 | data = [line.split() for line in data] 18 | data = [(dir_, int(dist)) for dir_, dist in data] 19 | 20 | dirs = {"R": (1, 0), "L": (-1, 0), "U": (0, -1), "D": (0, 1)} 21 | steps = [(0, 0)] 22 | for dir_, dist in data: 23 | x, y, dx, dy = *steps[-1], *dirs[dir_] 24 | steps += [(x + dx * i, y + dy * i) for i in range(1, dist + 1)] 25 | 26 | print(solve(steps, 1)) 27 | print(solve(steps, 9)) 28 | -------------------------------------------------------------------------------- /2022/day10.py: -------------------------------------------------------------------------------- 1 | with open("input_files/day10", "r") as f: 2 | data = f.read().splitlines() 3 | data = [line.split() for line in reversed(data)] 4 | 5 | clock = 0 6 | x_reg = 1 7 | strength = 0 8 | pixels = [] 9 | while data: 10 | instr = data.pop() 11 | pixels += "#" if abs(clock % 40 - x_reg) <= 1 else " " 12 | clock += 1 13 | if (20 + clock) % 40 == 0: 14 | strength += clock * x_reg 15 | if instr[0] == "addx": 16 | data.append(("add", instr[1])) 17 | if instr[0] == "add": 18 | x_reg += int(instr[1]) 19 | 20 | print(strength) 21 | print("\n".join(" ".join(pixels[i:i + 40]) for i in range(0, len(pixels), 40))) 22 | -------------------------------------------------------------------------------- /2022/day11.py: -------------------------------------------------------------------------------- 1 | import heapq 2 | import re 3 | from collections import deque 4 | from math import prod 5 | from operator import add, mul 6 | 7 | pattern = r"""Monkey (?P\d+): 8 | Starting items: (?P.+) 9 | Operation: new = (?P.+) 10 | Test: divisible by (?P\d+) 11 | If true: throw to monkey (?P\d+) 12 | If false: throw to monkey (?P\d+)""" 13 | 14 | with open("input_files/day11", "r") as f: 15 | data = re.finditer(pattern, f.read()) 16 | data = [m.groupdict() for m in data] 17 | 18 | ops = {"*": mul, "+": add} 19 | monkeys = {} 20 | for monkey in data: 21 | match monkey["op"].split(): 22 | case ["old", op, "old"]: 23 | operation = lambda x, op=ops[op]: op(x, x) 24 | case ["old", op, v]: 25 | operation = lambda x, op=ops[op], v=v: op(x, int(v)) 26 | monkeys[monkey["id"]] = { 27 | "items": [int(item) for item in monkey["items"].split(", ")], 28 | "op": operation, 29 | "cond": int(monkey["cond"]), 30 | "if_true": monkey["if_true"], 31 | "if_false": monkey["if_false"], 32 | } 33 | 34 | 35 | def run(rounds, worry_factor): 36 | data = {id_: {"items": deque(m["items"]), "inspected": 0} 37 | for id_, m in monkeys.items()} 38 | mod_by = prod(m["cond"] for m in monkeys.values()) 39 | for _ in range(rounds): 40 | for m_id, monkey in monkeys.items(): 41 | m_data = data[m_id] 42 | while m_data["items"]: 43 | item = m_data["items"].popleft() 44 | item = (monkey["op"](item) // worry_factor) % mod_by 45 | m_data["inspected"] += 1 46 | if item % monkey["cond"] == 0: 47 | next_monkey = monkey["if_true"] 48 | else: 49 | next_monkey = monkey["if_false"] 50 | data[next_monkey]["items"].append(item) 51 | m1, m2 = heapq.nlargest(2, [m["inspected"] for m in data.values()]) 52 | return m1 * m2 53 | 54 | 55 | print(run(20, 3)) 56 | print(run(10000, 1)) 57 | -------------------------------------------------------------------------------- /2022/day12.py: -------------------------------------------------------------------------------- 1 | from collections import deque 2 | from itertools import product 3 | 4 | with open("input_files/day12", "r") as f: 5 | data = f.read().splitlines() 6 | data = [[ord(c) for c in line] for line in data] 7 | 8 | S, E, A, Z = (ord(c) for c in "SEaz") 9 | HEIGHTS, WIDTHS = range(len(data)), range(len(data[0])) 10 | 11 | start = next((i, j) for i, j in product(HEIGHTS, WIDTHS) if data[i][j] == S) 12 | end = next((i, j) for i, j in product(HEIGHTS, WIDTHS) if data[i][j] == E) 13 | 14 | data[start[0]][start[1]] = A 15 | data[end[0]][end[1]] = Z 16 | 17 | deltas = (0, 1), (0, -1), (1, 0), (-1, 0) 18 | 19 | distance = 0 20 | best_spot = None 21 | queue = deque([(end, 0)]) 22 | seen = {end} 23 | while queue: 24 | (i, j), dist = queue.popleft() 25 | if (i, j) == start: 26 | distance = dist 27 | break 28 | if data[i][j] == A and best_spot is None: 29 | best_spot = dist 30 | 31 | children = ((i + di, j + dj) for di, dj in deltas) 32 | children = {(i1, j1) for i1, j1 in children 33 | if (i1 in HEIGHTS and j1 in WIDTHS 34 | and (i1, j1) not in seen 35 | and data[i][j] - data[i1][j1] <= 1)} 36 | 37 | queue.extend((pos, dist + 1) for pos in children) 38 | seen |= children 39 | 40 | print(distance) 41 | print(best_spot) 42 | -------------------------------------------------------------------------------- /2022/day13.py: -------------------------------------------------------------------------------- 1 | import json 2 | from functools import cmp_to_key 3 | 4 | 5 | def compare(l, r): 6 | for l1, r1 in zip(l, r): 7 | if r1 == l1: 8 | continue 9 | if isinstance(l1, int) and isinstance(r1, int): 10 | return (l1 > r1) - (l1 < r1) 11 | l1 = [l1] if isinstance(l1, int) else l1 12 | r1 = [r1] if isinstance(r1, int) else r1 13 | if (res := compare(l1, r1)) != 0: 14 | return res 15 | return (len(l) > len(r)) - (len(l) < len(r)) 16 | 17 | 18 | with open("input_files/day13", "r") as f: 19 | data = f.read().split("\n\n") 20 | data = [line.split() for line in data] 21 | data = [[json.loads(val) for val in group] for group in data] 22 | 23 | flat_data = [v for group in data for v in group] 24 | flat_data += [[2]], [[6]], [] 25 | flat_data = sorted(flat_data, key=cmp_to_key(compare)) 26 | 27 | print(sum(i + 1 for i, v in enumerate(data) if compare(*v) == -1)) 28 | print(flat_data.index([[2]]) * flat_data.index([[6]])) 29 | -------------------------------------------------------------------------------- /2022/day14.py: -------------------------------------------------------------------------------- 1 | import re 2 | from itertools import count, pairwise, product 3 | 4 | 5 | def fall(sx, sy, grid, lowest_point): 6 | if (500, 0) in grid: 7 | return None 8 | for y in range(sy, lowest_point + 1): 9 | if (sx, y) in grid: 10 | if (sx - 1, y) not in grid: 11 | return fall(sx - 1, y, grid, lowest_point) 12 | elif (sx + 1, y) not in grid: 13 | return fall(sx + 1, y, grid, lowest_point) 14 | else: 15 | return sx, y - 1 16 | 17 | 18 | def run(grid): 19 | grid = set(grid) 20 | lowest_point = max(p[1] for p in grid) 21 | for i in count(0): 22 | stopped_at = fall(500, 0, grid, lowest_point) 23 | if stopped_at is None: 24 | return i 25 | grid.add(stopped_at) 26 | 27 | 28 | with open("input_files/day14", "r") as f: 29 | data = f.read().splitlines() 30 | data = [re.findall(r"(\d+),(\d+)", line) for line in data] 31 | data = [[(int(v1), int(v2)) for v1, v2 in line] for line in data] 32 | 33 | points = set() 34 | for line in data: 35 | for start, end in pairwise(line): 36 | (x1, x2), (y1, y2) = (sorted(pair) for pair in zip(start, end)) 37 | points.update(product(range(x1, x2 + 1), range(y1, y2 + 1))) 38 | 39 | lowest_point = max(p[1] for p in points) + 2 40 | left, right = 500 - lowest_point, 501 + lowest_point 41 | inf_floor = {(i, lowest_point) for i in range(left, right)} 42 | 43 | print(run(points)) 44 | print(run(points | inf_floor)) 45 | -------------------------------------------------------------------------------- /2022/input_files/day03: -------------------------------------------------------------------------------- 1 | NJvhJcQWTJWTNTFFMTqqGqfTmB 2 | VwVzPldRZVLVRmfsvfjvqfmm 3 | ZDPDHZHVcvDhbvnv 4 | FHHwHBzzVCWWmmCzCPrVmgBwbLTtRFFbbbttRGRLjTcLpbbT 5 | vhZZvdsNSdSMdNvjncppCLcLnGnj 6 | CDZZsNZMZqdNSdlNZCqrzPHDzgrgzwVVWwmwwm 7 | ndlndntsFJntFvccLjjLrjBShcBBfc 8 | GpCGHzVwmmzqQWSSSfWHBhQL 9 | mpCMGGCZVzVwGGVwmJsZnFtZnTSTJtdsvl 10 | nCnPDGmDNmVCsVQDmGSWqvzchWSjjcWGqS 11 | gTnBRLpfTRnrTdZgdLfRdrThvqcvWWhFFWvcFSSgjqqzjv 12 | pfZfTMwrbLTTfsbmQtlVtHHnbs 13 | wNdSdsbTvTZMTvTv 14 | rrdRWdWQhFVdHWBGWQmmmnnMvCfmnhvmCmtZ 15 | rJrVDRWpGddpbSlNSlspPP 16 | chTNrthMMwWMTjfsmRzZszJpwm 17 | BLnFFCngbcBnbbldDlpRjGpmsCzGsGsRGmmG 18 | dqvnvlgbqtcPPMhH 19 | QcLNqZbCzJDQBJJRpwzRpdnRldgnpf 20 | GmmmvVGsHrWffrlwdCWd 21 | CMsFVVFjCmFStGQbbLZNBbJBcTjc 22 | LQVggbQvcLbQLHgvVLhWGGsChssrMWfzGccc 23 | qDnRTTRqJttPfWMChJhGslWlzh 24 | qRTRwPBTBtRZdnjnqqqnQVbjbNLFbbfLgVmgHLQm 25 | cZbzwCwZPlJcMLrNSNfHWNBBNZ 26 | vsQsDCqtsDhmtjVrBNWNjBHrhr 27 | TtDTGnvTlgbbRCGg 28 | BgBlplHlsgNNsJlVpBtPwJhMPRRQSSttRtSP 29 | bvhTnmdFTzddStwStQRddt 30 | ZnZDLvnvqZzbbhFzzmTbnFsVjVlNgsCCNVsVLpNWVgsB 31 | TdptqrrcVGhhzFtw 32 | DRnSfwJlDmmDDVGv 33 | RCSQNSCQZndwbcMqQrBB 34 | wvRlrlwVwwqzgbZRdCJBWfmdzCWfBdhf 35 | cFcsQpNtLLsGTtNGpMdPmDdPBmmBvJPWvDtC 36 | TpjssTFFvLLLcFFQpwbwwHngjHRrZRqZVH 37 | mqqddrPPcPmqPDlrQnjTrbvMvbHzzsjjpTvz 38 | gtBWgGgVhLGWHzMDztzstDHj 39 | hfWRhBBNBGgLNQDPwdNPcPdw 40 | LhQzdhhbTzpMhddhhhTzhnZcBFllHZFtrrHZHMHFjlHr 41 | mwwssqDvjptrvplr 42 | NCSgVDPDwmDgVJVpLfTznQJdhfLhnhQQ 43 | GzjzDhjhhZzcrRgQCBjBPBBjQCgT 44 | vHHHmntsbSgLwbsSmNHbwNbvpqPCBVppCpFTpTPTBtqWBCqV 45 | NJbwNSwdndvmvwhGhgzcfMcDJfgJ 46 | GncgDvvcMGnttjDvrgRRFSZZLZFWdJFJwGQwZBWZ 47 | bPqpChPfsshfZZBdZdLTFZ 48 | lNqqsClmbsNlPbHqPsmblmsrHdvdMngcVrjggvrvggRDcn 49 | bDvtgVVVpMQvjQWmQL 50 | rwTflmlfZJBBdQWQWjQqdM 51 | HsJJmZZwscHrwTrcRbzpcbPgtCSbgz 52 | CsCsRvshMjpbqCqf 53 | ncblgDBgtDmmmTlBgwlgbHHqMFHLqPDMHPHHpqWfFM 54 | TcBctSmTZTtSTzsZvsvJZRsGVb 55 | znznvngttwltzlLwhtThHbqHPvNbNHSSHmmNWHjP 56 | FBcLrRMFQpPqpPSpqHHW 57 | fRQMJZJfrcMcMVrQJJftnwCzVCltgTnstTVnVL 58 | MfLlRfCMrLzRlQgwNqQFcsGd 59 | jtTjjBTvbdqcGjqFcj 60 | vvShDSBDppzhCmzq 61 | plWMptTvfrnncvcRfwqzqLGhzhzThNzNNJqD 62 | jSdSHFPQQbdPCQCssjSbBmhJGNZZNGNqqJNBlJqqLh 63 | VCCCVCQgjdddjCgljCjbbwgRRttgrpftfWrgvpwpnf 64 | MWlbBcPjjvvjPWWMPqgRQZfJZDGGbRZJffQQwh 65 | HrHrnncHpzrJQJfVDQVR 66 | zzsSTtSTLzsspSdtTmHHmpmtFgqcgPlgFqWBqqqBMdWWvFlg 67 | nSqBbJbqlnBBClVZcMgZVgcP 68 | FQwrwHrRwWWFBRPNgNgcCGZZZC 69 | rWFWFTwpwwWzHrnDbfJDLDbBBbbz 70 | BMmNtLMMtFCNFNMvvLmcndpgcdgppPrgrGPPrgJD 71 | WVWWhbTtVnGpjrrPhr 72 | HWssSTHWfRHRsQQFLvfvFFCLCNMNlt 73 | sTmDsQffVrrLCjTFltTFWL 74 | BnwwQBJbJndMMRzMwCLlWlLWWCWLLtRlWF 75 | cqqBMcMqwnznMGzcvDmQhrvssHmPDVssrP 76 | pQGQGJDDrDVJbbfVzvvgPcCZwhZhncscZWWc 77 | SqMMlBBljMmRlchhPTqThCZnPs 78 | FMjMBmjRNFHQJJpHVhVDhG 79 | tHNNdBdNtBBBMgsMpsZm 80 | wVPzVvbwqzhrVqvjqzzsZpDsZDsZmsCPCgZgCM 81 | bVbvLThvvbrWqHmmnJLdHdJQLn 82 | PzTspPZpdLLDZTplPLpPDpvbfhnqNvqzfvNMzQQfNwnQ 83 | GWRHmjmFWMMSnhbhHw 84 | JWWcmtBrBtWBFWGJpsgTgldhLVLpJl 85 | DwLMDzLMhvMcwvgdVqWWlCVgvlqF 86 | TTSBBRpbStHZVgjWFldjRVlV 87 | SnbTBdJBmnpQzMPDMcMznr 88 | nNlMNBPPNtJQnbZhZsgSbh 89 | czzCjcwTdvSbgQNcgNQq 90 | VTdNdGDTzDTdlFFPtBrtLtDr 91 | FMbbfMlzvFsmgVZmmg 92 | SrNTHGmdSQDqLhtQhhgggs 93 | dRDTSDPPcHRdHGDHlwJBbmwljmMcfjbW 94 | sQgWLtqLtWhdqlpNZRpG 95 | blTHTjlvTCJnJvRZdGGhHHGZhFGV 96 | CCDlJclnCmbrmBMgcwcLWtcBsB 97 | vqPWWvqwwCFvFZfZPRFRrcGQrQwsDrNcrwnbDNcQ 98 | LVgJLSBBVtzTLzBMmTMJmLnnDNQcrsGbsQbNbrbDjs 99 | zggVSmmhVdfqFhvHWG 100 | WwdndGGmmmLwwwmRwWSncLRnZqZqhqZthBtqtBqZBgtdtvMH 101 | FfHHzlQQDsFzzrNsVTfttZvTvttTqqtbqb 102 | lQjFDNQFPjCsVCCDjGCwwSGGnccwcHppGp 103 | mrjggcFsFMjdjZRpSZpn 104 | NCqfLCFNbQPzPPlPzNfSRTRZdSdWWwndpqRSSd 105 | vDvzzbPQFNCFtllLLNMBhMcDHGBGMggMmcBc 106 | jhjlBvvnjbtDNPjtSjBDBbDNgHggrQrhghRQrqRrZcRwwqVg 107 | pLdTMsWdLLmpMdqZZdPdVqZgHPwH 108 | WLTCGmMLfPSlbGjlnnJD 109 | gtbwhgHbHgqqbgQthgQLtZZCRjMcjjnRnrRNJmMRJrNhRc 110 | bGWVTTvDvfpVFFBpvvVTdRDMJcrccCrJnMRnNnNCcc 111 | FVWTBsdvdTzTBFWssVQtLgSQtHqqPzPbqHbw 112 | dlzrPTSSjSrllzWhsvVmVtTRTWtf 113 | bJMpLGcqGhNbJQttVQmmvRWWsp 114 | qLbMwqqbGHFGzrlZrjhPHCrj 115 | rNrrffVlqqrfLlPpltcBBTTGRzzZRPRsBTcJ 116 | msbsmWSsMmQwjdMbWMhMhQmcRZRzGjTBGTBcBJBjCHJGcC 117 | FwWbvdhbmrsFrfrgsN 118 | rHjrQHdhdQrvSddcHWLssBSVVpBSWWWWWf 119 | JNfTGtqDwVWBMBMpwM 120 | qlltZgfJFvcRgcRjvc 121 | CqfcwfDqwwmRnnqmRdNRBTRTRrdGdNpTvF 122 | WVbzsZszBbrsvpdMpdQM 123 | tJhbVZHWLLHDgnSwnSSgHB 124 | TZCqqlTsqpZVVsZQJSBSLpLmppnJzmFz 125 | brSgNtGjjRjRRjDddDtrRJcJJbJmmwcmBmnPcJFwFB 126 | jgdRtMjNNjfqlMvShvSZSZ 127 | dJTdqCwMNCgqTQllGBdlGBmmmZ 128 | fcVfVcnbVfrwDLWVfncZBQPlBHRGljLZQjHGQl 129 | brwnnfSFDvfzCTqFzgMJTh 130 | njnsPBjjsrrnGLnbTTjGvcldQPCMllNzMvRQPCdd 131 | ggZgfZtmZVpqZqZWDgFmgqfCcQRcRcWhQcccQddMcvRQdQ 132 | tfqgggVgHpDwDtfwbGLJRjbLjsrLTj 133 | JmrfrmTlDWTfgQCdHCdpqBvQdD 134 | jsZtVzNsSNVQQHnBlVQR 135 | PljljFjPljSsLPtFLTTgTcFrrfMJmrrmrr 136 | hmGcmmndhmGnfmtGnDzFLwrFJQsQFzNFrNJG 137 | ZSqPlSWcWlbgqWVTVWRVZPrjQqjzjFNJzLsNJsLJNqNL 138 | RHcWTZbSMMMPgZcWgSWPPbVMDnBffmtdpDBddfnnvmCdfC 139 | vSJvsbFfJfvqCsTHJswssJnLTZjjhzrrzLrzLMrzhdjM 140 | pBNQDPcpmWDcBNgMMnZPVjdddnndhH 141 | QWlDgmpmgDBlGRgDDgffSqwSwGCwHfvqwSFJ 142 | jvlgvMJclPdGdtdcjMVmMHbFHFVHWHbZHZ 143 | CwhLzLhzQpnqfpfqDVHCHbsbDFZDmHmj 144 | LnBzfQjSzQrPvJvdSSrr 145 | wpcvcsqclDCnVCVvWfnZ 146 | BLRMRtbnbbBLNCjNCjVVZhbC 147 | rFgMPSRnrRpmqpJwqFDs 148 | LZQNQbMrZppLNLQplvlGLNvVmmmfjbwVCfjbwJwCmBCwfj 149 | ShTPRFtTHZPCsnwswsFwCF 150 | WtHRPdThSqZTRtDqtdRWTdpGDLLzrNczvzMGLlQLGDDM 151 | hdcffBvldjhCMljqPwWwWNwWdwqHZr 152 | LtQmbQRVsZQZMZPQSN 153 | tmMRsJMpDhjJzJhv 154 | wNQCMFCDQDBmrHmmRWrrHN 155 | SShLnfqpcqpSZSfrzJvRVrvfrrJH 156 | cRpqdGclpScltTQQtsFQMQsTCT 157 | NCjggZmgfBgnBmgWbcwcTFctcWWfvb 158 | HsDGthRGrtppSQpbFFJTVcJdFbTRvd 159 | rPDGhDDrSzZLtzBLZMCB 160 | RsBBMBsCBlFFCgRsBJzlMjMPNSdPhSrSrzLbmSDrDNmDSd 161 | pZHZZJpGHHHpTTHvTncZqVLdqLbhLrDLdhrSLLbLDDdD 162 | tGtwnJccvCtCffMBgt 163 | wbddvVjfwPhbjjbDbbvbjvTNCNmfHZfpCZRJNzCmJmnJNC 164 | BslcLtclZWsZJWNrRRNRpRmR 165 | BSLBlScGtFMcssMBBFGLlQZTDZQjPddVwwbTdvvdhTZb 166 | NSZHzmLZBnzHmLLzLSntDttDDtddhDtttDWW 167 | QgfjsrrvNNJwtMddcvcvtq 168 | jrfgfQpQrTTVLSNBClFV 169 | GQWcWWPPQRcrJQNDdRcDmmLCFSnqNSmqhCNvFnql 170 | zHfwjzpMjwZmCLqvvnlljC 171 | ZgtVZBtHHZtgQGgPrbPRJdPv 172 | TWdWpJTJTdgLWfWLlLFLrfrgBGsNqhGslBGHqSNqqBNshnws 173 | ZpQmjzbZZCjZCCCPZtttRCCwsBnHNssBHbShsshHqsGBqN 174 | RDRRPpPCzmZCtRpVVJFrfTfWFLLJggJrDv 175 | pDDFlglsvFMgntlTMMqNffmTdfddRM 176 | jhGJLVCHQpHGQCCzLjWdTTdZZdNdcRWNccWfNN 177 | jQjSGjrjCQLhzVSLSCSHGDpngbrnDFtFBwBglBnBvg 178 | wsLzstsgszcpcGLHGpcgcghlDBvQvjQvbFbQCbJBtCCJJv 179 | mnSqRSSqSRThWRnmWWRSJDFTFCFCblbBCFQFCjFj 180 | rZRRWqSSdZZfMVnZLspPsMgHpzMhHGPg 181 | mwHrCLSWWwrsHCHDDsVrsmhfFZFnSSBlFlgZbbgBglbggj 182 | GJdpcRtGJvNRdcPtdpJJdbQZfjfQBlnQBjnBtbfFnB 183 | qcPpqqzFzJqvPVCCmWrVwhrWrz 184 | jjMbvbhDvnRjNRGMmjbMZftSSwwwthJSffStctcwqd 185 | lTQrVlpCVvCcfdcSJqLVcw 186 | srHFWCHrFlrHlrsBsprljjRmDZZnmbDngNBgbNZv 187 | MgTlQJlTQJZWpgLrRssrVqqqpRts 188 | bBNbbzSSjMBPjzhMjsPtRVVRVPRqLttGGs 189 | SjHBbfjNCDfjZgTlZdMJnDJW 190 | lpThgTwtplhghgwhThqnnrdZctSZSjSZcRSRfbdrrc 191 | RBVBGvmBmfdrcvrbbr 192 | PmVGNGmmGRLLQwwLqTnglQ 193 | nHwnBwBTnFHQwRsMhwghmzcm 194 | GtprdCpdtqWdbqbrfdnPPszsWmRzRnShPszS 195 | dGptbCfCrlnVDBJNLDLLVDLQ 196 | CZtCjhTndCzqbCNq 197 | dwpGvpsmwGslDszrNNrzqDMzWMgJ 198 | vmcGccvpBVPTVTjTdTTTdZ 199 | jWZhvZLjZfCZDwrDrSSzJGhVdJccscGsgV 200 | blMBlRqqqgSJLBLcsJ 201 | blmHLmFMMMnRqLmMMFqHmfPDfjQDnCDDQrZvfCjvDr 202 | rnvnHrDLFZmMFLvrHQBMGQggBztzglplRl 203 | sbWWhdNzsshsfhcsjJJPPbWdtQGVGllRTRjRRgBgQlpRlppB 204 | PPCCwNWhPhNfWCzbqmFnDFFnCDLSrvZS 205 | GChNjwWlWJWTJZBggvdgnQgdhdnd 206 | HPsHfHHrpHDpFFrcSfsfpCMmQdntLBMgtmtBgDdLLC 207 | SqpPscpPzpSWzjlCjjCGjl 208 | nvgLvcLgvgvngbLprpJNTDCCRNVJrNPlDDTV 209 | WZsMtsffGQtMzWFqFmWmWsVNJNlDwwCDVRTwJlCCDVLz 210 | BQfGZGmmsMWFstWFmfMsfBccdncbpbSbvbbvHnLbpc 211 | tsmDsvswNZmcZTccfh 212 | zCTpGCbWBRWFWHGRFZJbMbJfnrhnhfMnnZ 213 | TzFGFBRLdpHHNNQddDQDvwQN 214 | fhBBpJgdHddjZQfmVmNzNNLmFN 215 | qvMRrvlbwqlbTTMBMvLssFNmVzzwFDmLLzVD 216 | TRSRWqRRMcBHhGHcdGgPGp 217 | lSjHmtmnpHStblnpSlHSrtmMzLWzqzqCZDDTzTTWqMFqCqVV 218 | sLRLLfPPRQfCTqqVVqFT 219 | dNJgRPNQNsJJhBRvdJvQvNNsjSrrSmrcctpbpHtBrBjLjmSH 220 | nwFwpppjfwSlpLTsqsTgNshhjM 221 | ccBRGvtsmgGNPqNNGP 222 | BCcJHvssdcWBCVmVHSSrZrwVzblpwbzZnf 223 | rcfQRrBPPczjcRBctZDNlnVNHbgZGjVDjN 224 | TvMsFJGSFMhJnNZlwVVnDNTZ 225 | qhSqqmqLCLhFdJLqSvLhmQRQRWcRPczPtzrCrWGRBp 226 | JVhdPhsFPFqLDBHVdHLPvhHDCMwcgJJwbwRgnnCMbwGwcmGC 227 | fzjzpTZTQQQLwCbgGgbMmQcR 228 | jzNpTzfSZtfNSWZlVVtdFFFDHHqLHVqv 229 | TwSNnSnSGVTpNppGlPTlTcVqQrRhVBqdqBRqZqQZqQ 230 | DcDCMfDbCMHJdrRBqbdjRBRZ 231 | gvftMCJHcHfCDmDLgfMmMmmWlwWnWsTTwlGTlWTwppNlGL 232 | pbGMbllDQPhhWWQDpPgVGlMCvRRrQLcCCcfBBQzLBcvQBv 233 | wqnJjSmjrstdqwwFBLcRsBRRszzLFC 234 | qwdddTJTdHtjndqJqHZHmwVWGpDbGTlbWWpWWrPGhhhM 235 | WGllqLjjLCpSffmBmvfpHs 236 | dnrQwZzRTdZwnCThdzzFTVmcBHBJBmsHfBPHcfvcSVHs 237 | QgQrzCdrTRCZzrZLbjGLqNMWGgNNLt 238 | sgPnhPPTTPTTwlJfwNHlqcfs 239 | LMCpFbLLbRpMGbMcCFLVlNlNqrHqVfbHHwNDwr 240 | GjBcCCtWMtMRZTSvgWQTngvg 241 | BCMtJJMpRDlMMvBJBBnfjtcjPhPmZgnhgdcf 242 | NrsrsqFNvrVLVGVrsHsqFgfmcPGdcmhfjdPgfjcnZd 243 | zFTzsNqHqFssLVLQqNTFbsBDwCCwvWlDwRMRCTRBDMDS 244 | zQtLgvggSRtgvVRtLvvnzdnjnGwGdmmrlpnlGz 245 | JssBFpqsDqPNnlWWjrrjqrnj 246 | DHDFBNDfPbJBsFHNMPvpvStQvMRVTtgVTVtv 247 | FvzttFvBTJJzLbvwhCnnVnWwjCnBNC 248 | mQdZgZPDPdPPSsMSQPdZgCwVGmnwnWpGnGhqNWjWCG 249 | ggdDgfQSdcjtFHjlLJfF 250 | ghcgScNNSsCvGSzmpVFlZbrzcFcV 251 | MWWRLRqqqdQwTtLjjmqMlFpFlzVnbFVDwplFzlDr 252 | LHMHqdHWjdQMdMtLHHLtWjJRsGCGSNghmSvPBJBNhsGfvfGP 253 | CbVqqqDbcbMHnnDqcCbrRFCfBvvwGjzrBwQGzrwwBjGwBQ 254 | sTPmpNWdWPTJssSSLPfNljjBvflGtjwwBzMG 255 | mmWgmgSZLTLMZWpnhqZbhFFCnhqnnn 256 | QQmjmZqnmQrfTZlbbcVbBcfbHfzf 257 | vpdSNShNppFdSRtdGBqvJBDlDzqbPPHVBH 258 | tRNSNRFhNpSRhFRMFtGhRGswLZZsZqWnmrmZwqwsTZmmmQ 259 | gGWCllFCGWtGGWdlGlWNZdwpnnSbwpMvpphZpndn 260 | RsshDDLcQVMSJQwJwnvw 261 | HVPzrPcDNhPFGhPC 262 | jtHQGHjGGtdTLjnqTQlmvRPRPBBwRBnFPPWP 263 | hZbzNzVrczZzcbNssVspZZVvBwbmPmJPWmvbBRvPlmvRJF 264 | fzNVDsZMhzpVhpVhlZcMNfcDDdQTLTjGDTCqGCjtSQHdHL 265 | GrbFggGrTrzSrgfwJjdTmwmNJZJd 266 | VMPQplPDptchwdsjmlml 267 | MqMWtBDPPWDWHQtvqQtWPjbzCGLgSBgGbzgrzFgnnz 268 | fcJccCcwcDfcpbRnCfWJnQJqtqtqPQdsGdgPsgTQqg 269 | LSjVMhzSFFrljdNbltNGtgdqQq 270 | MMhSHFFMLzBWDcHHcfcHwb 271 | rwmWtJWMwSNRJMtwNmMrrSsmtTjjlgqnTqZZZPlHnTngTTgn 272 | BGqGqqFBFggjjdGHlj 273 | QDhhLbDQCDFMNcmhRhqJNW 274 | BnRnRvMnLGLSCHvvSnlRfWbbTNQJsJsbNbJTBfQT 275 | tzMmmMwjhcpFjDmMcptrcjzFQggfQPTsWsfgNbbgfhJbPhQT 276 | FdzcrtDwDMtcwtFGRZdRLvdnHRSZZv 277 | HVpsSpvjpNjsBmbGFBnMNnDM 278 | WRRWhZtfrVtLJrBZMnDmDbnZBTGF 279 | thhPLzWzhzwPtLRLWrQlpPvvClcVcCppSvpl 280 | lZPbhnZLRPnnPZZPdlGMBWcBMgMQHBBcvvvzBL 281 | jpFjmwwwCDDbsjvjjgcvQgcNBQ 282 | rbFmppbwhqhGRGZr 283 | ggrLwFgWCBwbMWBbFwLMgNBZdmZHclJPllnJlNRPmSNZRR 284 | ppszzDfhDfhsqpnvDVTfGpSPlPmclHcdRcZmmmdPPGSP 285 | pvtDDVDVpqDfzDfngBLCwQrgCtCwFwrg 286 | pbGjFFGGDjpbsGsmNhNFNRBBBtRhhhHv 287 | JnczJVCvwWJvhPgghgNtNtNJ 288 | nwVSSzdzzqSpvQSZQG 289 | mssLLttQrsMrMzLCRmMmrrSQpvWpDNlBTBDlvNTccDQl 290 | HdHJwJqVPwHnqJwbjJbGjnSgSTWPpNgWWpgBBgcvDWWN 291 | ZHVwVZGwwdndqJVJqfHbGwnwrRLtLMftMvMMRrhmLMthhLmz 292 | RgHGLbTqlZlPRZPHfvvfZttJnvfvjnzr 293 | sVcChDVDccwNhhvjTvVzWJjnzFff 294 | mpNcCMTCGmLqBLGH 295 | wVJwHJHVMtMpBmDDWPQVPWDGDD 296 | zCrlZzCblBvnCDWNGLmvGDLPNG 297 | dqZglgbzrzbbgZqzTFSBHHFJSSSfjjSMfwhj 298 | NMWJSjLMCnHHNMNNHWCHMbVVGBPZTrPVPBVDrBSDGTTr 299 | zvttlFpgdtldwwvftPDPTWQdBZrsrWrGBZ 300 | hFlFmhRFvfCbmWJWHcnj 301 | -------------------------------------------------------------------------------- /2022/input_files/day06: -------------------------------------------------------------------------------- 1 | gzbzwzjwwrfftfrrbvvcbcvcffpssvhhzfzbfzzrbrtrcttnthnhsnhsnnclcpctpprwwgppppchhvvctvtsvswwcdcrrdzdhzdzvddvfvfjjlldvvfllfhlfhlhghnhghrgrsggvbbhdhffzggmttjqtjjgljjwtjwjggldlzzrfrpppjsjggqrrdbbgwgtwwwtqwtqqvccjnnhrhqqsnssjbssmjjbzjjqnqnlnjncjjzzqddfqqqnqvnqncqqmsshqqccssvpvllbbfvfmmmgzgdggtjgjtjbttngtnnhhfrfddmtmtftcftthvttwzwrzrbrgrbrqbqccmmtvtqvtqqzmzwmzzzsvzvhhhqlhqlqplpggvmvwmmshhnshsjszzljlnlrnllgddqllpmllsgswwqnqlnlqqlmqqvrqvrqrppvrrqwqhqllgjgcggsllqgllghlghhbvhhcvvbddvcvwwwzdzzfjjvcczbbwccjvccmvmfvfgfmfttwrttpmtmsszccjggcssmqsmsgszzfpphghvgvvcddtltwlwnnrbbfdbbtssrvvmwwjfflmlblwlrlmlwwhrhnhqnnvdvllzblzzndzdlzzhpprbrprnrzrjjlnlnrrjddgrrwrttcstsgshszzvgvfvpfpqfpfbpbfbwbmmzvvnnqvvqppzspzpzplldqlqsqlldmlmgmcmwmsmfsfzfdzzbpzzbbcwbbtppphlhshchjjszztctpprqppszzchcqczczddscsrstsntstjsjqjjfggvccgbggqhghrhppdldnlndnpddllgplgppnlpnnmwwglghhftfrtrqtqsszrssfjjzhzfhfssflfslsmmgrrcdrdnrdnnqznndrrbtrrmhrhbhsbsgsnslsqlqnncpccplpldpldppshsdssqdsqdsqdsdsdfsddchczhczcszcscffzhfzffpbbgttdhthnhnjnwnnwrrmwmlljzlzlzdzrrcvcbbsfstfsfnfqftqffgjfjzfjfsjswswccsvcvlccshhjpjcccnfnqqmsqmmrwmwjwswgsgjsjttmjmjttpqtqwttgmgfmmnbnrnpnwppgspggwnwqnqpqmmbmmnwnllbwwdqqzsqqtgttnrtrllcwcchpchcbhbpbnpbpsptpvtvzvrzzslljddjzjjmqmmdpmddcdzzrdrqddtctppwzzwrzrvzrvrzzjtztqqsmmcncllhmlmpmhgsrtrzjhjbtfvhmzpssfbjwcdshthnmmqmfhlhwcbbllwzbwfgfvzjcqblchzqqqgcgmpnbnnblhbcpgmvsbvtcmhsghldlhqlghgtpdvjflmjsmppdsvrjlwvhmwsmfvvdnzpmtfqjqpjdctnnrlfjfvdtmvdmhsczlfsqwfrqtlqwnzdzrcdzmhvrgwnjjtqjrqljhgcffglvhnsdssqdpfrfhtjwlqzvfjmpjnqhsjvndtstqjsqgcmgqdjvfqnlmtjlvcblndprmffrgqdnnncnlfflclgqbjbmsdqsjrmzpwtbqqqqsqmgthhjfqwzvcbqwlvdbffhcvncpldmchnptbnlbhmzrrjhzvzdrvtlhsnfnfdnvhlrlrmdcpnmvdwswctcqldszlvftqtwldrhmfjmfvcgjcdjsbjqjwdtslblwhqfvgrfcpnhszqqsfwbwcmvfvccvztdmcjqfjvdvmbdtcjvtwqpwsqjtdvpvvvsdrrvngmjztgjtnpdbmtlrbrjlwsdnthgzgpssgbzzrqvgblqhrtfbflnphvhpzmdfrwqvjjvcpsmdrqwdbzlpnqpmglgqzfhctrzdpzdthqgjtvpwcrlsmqnjwgzlnqbthvfswhjtrrsrswhbmnddgzmznvppbnmtjpzpdpmpzpmsgfstzldgmrtgplwwsbztphtcvdfgsqzqwrmlqpnhvpcqpfjpbrthrtwgqlfnrqcrpvhssjmhfgpnzzvlrlcbnpmddhtdvvfrrvprqrwbhfgvvltgrhrpwsdgvrlgthbztcgcfggtcfzqtlcdhpmcvpgcszslhpfrttnrdrqpqlgdfwtccmbhfrnlbhhmrtrjmzstbqhmtphzcpcllzsnghfvlwvzzvlqrjmfsvhrnjnvldgnbqvpjsmmphhrmhqrtcncmjwbdlqtrvmhgjrjsrddcpqnjhfmczfgwzspnrjfwvfdpdlcfpvctfrlspdwwlnpbvbglzsmgfsmrshsqgcvlfrvjssrglbwvvvgpvtqshbtqmzbnglflhhldtfzqssptrbnnzdqwqtstpftdqgmmhfjdlfwtmcmtmcgcvtfhzvsbllgbchvlhrgnvvbsnrwqrlvdqlcwwlgbjrvrzgcvljqzvdngtbhpnppjrzpmbwztzvnvrbfccfgvnqvrcmpdblngcvlwjwzpbbwmnslsdjmbrwbvnjsgcmsfvzvnwbzrrlzvgdnzcqqgggvmcwczjqnrddnzhlndgzjbvtbtjqdnlvlflqnfvjdmfstpdfqsgjdslgtpgdnvvpmfwvlqbmbgdrqjhdfhlmsdtfwpscsvdzmswszjfwqtsjqpfnjjlnsspvlgzwwtvwgdzfjjljfwbvfbvpglcqcdbdpshwcqzswbwhftbfqblzpqfmqpvzdjsrcqtvjntnhmlhmzllffcjsdnwpfzdglvlrhrljbrhjhgdnfcqcrccwrbbhrvqwrzlwjrrwzsfcwsvbqsjgtgpzqwlczljrtdhtzcgsfgqssdbjjmttdtzhrqtbqjtqfwmcpdftrfjmznpscsqmtfcdpcdjwcqjvmhngcqnmtmwfttcvpwgcnhhgnnbgjdvztzhczvqljjqwcmwcbvmqqjsfnmhtbtsvsnsfwfzgdvlctrgdvbjqpgfrrlsnppmvhfbbclprlvcssnvtsgftmlpqrpjzrrphrzltbtgfwjqqvbgqjdpdgqvzppfzcbhdbbjttcdzclsphtlzfvnfqgpmqvpzrqgpdnbmsrqgsnfdwpvndzmsllgmnrlhnnzldwshtrrsrsmdncwrcjnmcjlwbbfpzcwzvldtgvbcvhnbhgjgwjcvslrfcwbqlrqldvpcgnbwbzzncncftrgbrwchfrrtnpqsjbcpzvplnbqdgtvnnrcwwfvbdzdrsfspvtbhflhsbqmlsjvfmpvjbfvcrdmgrfqsmqgfrntfqnlqbvmsqtpncjrstspbqvfmddmhwsssdcddshmwdlscttmdzljtpwhzhzhwsdnmgjstfmlnqqvzzdqpqsjdsllswmqcjtnthwqnhbscrjdstljqgncjvjvlpfrtscrzrqghrdvdnbtnpshpldcchljzrzqjlwwscnphvrwlvzttcdjdrddgmvqpvdmttdqhwpfmslzvnrwlrrdttbhctgpgzjrmdwjbcmsprwggvmdmmltldgpbfnppnrpwcnpgtblccdvbsnfvgzmjppftvndmdslfshjvndfvvzjjlzhgfmhcggttrcrbrlwrqgjpchvhnjwqnbsnmftwszhzftglrfdvvnbcbzsslgmdchtrrrqqzhllrfhwfwbbdgfpdfwssmzcfcnzmrhfdddtdhfqmctsglqbwhwpnbdzbsfbbvvthrrgjvztjjwgjcgjntrddmmdldtmvjnwjbcqwfwvfhsrpchznhlqpcttqjffbrpbftftdjzlrqchmzrfgjrqlndfwfrghtsfsblcvtjmjrbfrwdgsgzmmjpdlbwzfscfsfcdqwdwnjwjbvvbptmfrqltmnlpbtrqspwdfmhnncqgtrtmbzhfmwrbcqhmmpmvprvwrjplspcmmspldmbgpbtmqjtrfcpfhcnpjbnlhjpzflstjqfqvzcnfgvrmtplndchffzrtfrqdpdnzrspddwmpzlfchrzzfcfvmbvfnlfwtfbvnffdqhljbvwwdtmszgrjtzwqdbgvvfphcnsdgvlmslqngfmsbrztrnpjprghmjffscbnfqwrvjjjtfzrmjtzbwdsmzgmbtjzvddhngmzvflwftblbzfd 2 | -------------------------------------------------------------------------------- /2022/input_files/day08: -------------------------------------------------------------------------------- 1 | 120121010220011210213341221400410032024200305455123332224004344232032410401431102230313221032220201 2 | 201110121023013230302330021311131013421112311431532122324332345241340200121101343122032000302222002 3 | 102002033003222123334224022231014024154332332522532413152443343521420024142120221020312130000012220 4 | 022021002022122234142411233442032215244333211545534421223521213425452321323211314230012132230101111 5 | 000001213311312040044040324004345251313532532244214111234445435523443223231014031402202003220202022 6 | 120012020112324402101203201012524422234555211555441254543532525542455422431100123100134112211321001 7 | 201331122323231022322414132513445443542225314522442122134451213343255351243403333214100001221310002 8 | 202213230323304224323401211524355443322423124143363225331551434545141211212254401343122332131333320 9 | 121211210204211420223411323113111133452563332665665366256342425412125353114131102200130004332132023 10 | 112113312123342311122121342553114544542544233526256565633442525642534431424122340140222330201020323 11 | 212220201231231331225325433524212465354244363465433323422435453425443544233314142214213330210013003 12 | 323312311034244021124115523324235453334553635453645456346262262243535541114542314510442100141301122 13 | 322110024020203105422444554225662245423642666363652244366624233565255245323234242444442021114003131 14 | 020022410424334054535554351356634265526252563433644446436343335353246322341442512355214000224142031 15 | 113011113224033331332141536246552466454462445665475466223436433443654356455435321342422024224240233 16 | 122102233311322113321454362252243234624432447544375657355353324635433643234333542125422313433332321 17 | 233120110314034111141332425232564555665674743363443764643543745663655355633235321453124432104042231 18 | 100223100402324212124236262364446355557657673733745547363557734565242545543336131354254512432331033 19 | 220330034134143234154666534352252567443643755654677737776567374445733425452244254511151514234122213 20 | 223443144015521314236554452665635663377377657447643476573534645467643254356634655544313443004430033 21 | 101024341052411454165252566424674556674773657353656433343654447535674354245262332333523555242331132 22 | 220222110223533215564454533347744755673537673333455433773653447746564747422325642363122431352422211 23 | 004240214354322434225324663557754746553337448764574547564453643767763554322626552333144243243100443 24 | 244002112413445223342664642343745646463566545585488848785555544433334435346654656363551511425432311 25 | 304400052221222432253436664545656765657858858457776876475466485467576564653534555232555135554512103 26 | 301034122214253266644646654774435447685475487674646855754787758675544354374563635536335552414541214 27 | 023143512353534433525535355774437554848684458474566677886556568485755464753466263454354215342330021 28 | 114124535331116466652546536664743784557757457584466558864655558574887544735673255226463153414244423 29 | 321342532351563246464464534353744766487574566878456865566554674786854545747634762245326241111545302 30 | 222324535212433454342577763447374686575568646767976677984686747686474557575435676242252334324424133 31 | 041455115451655624645633347335876745564448989976988776878785466666874474733445456453534561112433131 32 | 234035233445234443233733563648557487657498899968897866857865785856886577346464734446452554244252101 33 | 042322443436343444646433663564848665688656875758665978859999876545768558637766334653546264321513150 34 | 311341431232552555557665566457765567779965958979678879768989766764576764655455375556543222315153443 35 | 432422413526624252456643546576745546967687555668559776976867857598647675565463476444325456215124324 36 | 141355224535323342657744536454664777877655975965957569957665675698786568684357375345633653521322134 37 | 141122432443266326344466678445475489879775756757768969966588589795858867477644375464354434554334542 38 | 404524251535424526674473367658588859789659999696879679797895959568796848845577655453633456432522251 39 | 052555241454534576467457557666865778585785777799889798799796659588785886875774465345553622342424344 40 | 431231215564564335455644575547778969999599889767689766876767676769986454648577766665523563621423244 41 | 015225326665656474355776784465595855559969779697867888768786867958987787865555557547456236256414443 42 | 342141412264436237555367786748757775996887869887989697887868985969768974878458377746343563334112432 43 | 245424112423634535653674854786759556887899698796699686769888766789698865458448564436356633653255423 44 | 152344536556354376777665885575687899789896978768778768999866666875968688488776547446465633626145213 45 | 143323326635362775675356868684997875878998968799998887969968886965597768474646637337765355426415522 46 | 233135153446345733457544575578758698668698796778899989988686677699869766655775463667634536224515421 47 | 442322432622254677457747586645559867668696769899897879878696967979757585566766656433333444234655425 48 | 211425433422356366455578477849687667769687699987878799877668866765868769745448755533566453422341433 49 | 142142345456557463367644747779979677698996689878999779799897968888567959674764537364645446523214543 50 | 112243356444435356743678858455568578689876999787888879899876878888997787884868645546363254345642533 51 | 341213364343435537345688745769797686679769679778778788899769986867599798667874534334444664434313333 52 | 243532164222666764774486748579698698876689888987878887998777687869755585776544863447444553624622141 53 | 341332522665223377644645444775976687977778897889989999977786997965895889866888467355775645335253141 54 | 451243166652422747755745765448975967698978698799997898999688997896678767488644763664752333224424553 55 | 343541133453346465373775878855568559988786799997787988999967996859859695684886756457573444332411142 56 | 314533526655524646634488455785868658876797968989787988796698776878757988467468647665474336362332241 57 | 442414135564436647537445687767866699679676668888999999798976797688656765447854434566735624532545551 58 | 032213154226544776557438554788789576777666889966978788867789879775988668444584736553534343622315541 59 | 255412122466665773547546685885987799779967977989879687777878699876566957766566647736545453255421212 60 | 211412336445563474775766856667577998798997678997686866778969879788687858487546455537653524366143412 61 | 051255123462256533566636777744877655896767699778989868868796978589575976844685335654756444462141342 62 | 322542554464342265336333465776645696986799889779679986879686787697697647574587563753453625343545521 63 | 033123425643433264635737446877447585887867896898797976879886786698688684876443473335322466665351333 64 | 133544314253462427775743366646484968555695958697698797876679667978854648774634475773653542364235421 65 | 224252431244343247466566786445767556659899789679866787689999766568777856867437767535434222445521233 66 | 125411234266255436753533664888768586696657765695958586799598696979557774846357447354325235425345222 67 | 321143533344454465635634634548656884666775656786776897656977675678544868467454563642465352614111534 68 | 324314254344466535257774447774685768796778758589556968777657876755454678874457376763662322355442241 69 | 120211113135325666447367553357474668876977665968588879588965668457446445756555755344632353524213111 70 | 311224554131565262327577435344586647744599595585679959557779868848845756333753447342232421323535422 71 | 114341442141636522627743367646645776654857585789589599759987575646778664434443566622565323551144104 72 | 210244242413152456645637357357684777785854766967688795794848665476646666547365474664225335235523134 73 | 124135421531242254525555475654745664788867846468845666746887888854654564764543562353564341341354241 74 | 232040414531142663343623666666355755588686458756864548766766867588477574653643266543552344453423142 75 | 241410112355426236262654356375777777866756675768668766578744448586537335565654443353226124123350230 76 | 140311131221515422466665656675435767464774857745654575455565568556777765663432626225661213413111223 77 | 110443321215553263625546467777476774558756864846764586756488688436634346356345662654634352234124332 78 | 221343332131351442346665233764775367674745555446558654675758467463467434543336344234234541352014440 79 | 133230443252342342426444235644376747467676654877885765875675433747574653525324245321411114352213140 80 | 040240221445511125623332465444547333774437463744467533446475535636346363436524235541352245340433401 81 | 204040003033154341135523356453644337774767676777576456764567576775643742526424535545245441222304411 82 | 304042224012435531346652244635426465733436576763444573475575775466734463356433425322423121010012441 83 | 020411330415234333353346655465454535766463345353547737546577344756646645346366361232312212001341120 84 | 222312310221442455555216363452342336634374577563373335557775555536643536565552525532355153044340022 85 | 321033011221232232531512333546323244633765663543646734377575566264364252534433124442412113401004401 86 | 221333321104001131445331226542565353624544444743335737563556662324243523642455442214142202003030231 87 | 031021212444432454341232542543223433534244654624443452522654546656624352422154453544520212142411231 88 | 000032101021330433425441534355232524355526522443326623545256546525633243254355513511514204131400330 89 | 010223333430411314211115534412532344324626322226423546334526362632342264344512422433334011314221121 90 | 030012220233010021431154541112223663556346352526365422265452334332256431412154223121433241032331112 91 | 221110003130033344202155154114455435426433642224264344325523445244211424335321121000334310001120112 92 | 010013223234422000001143241135132415264644343446443425245345324221223223212325552323312333412330222 93 | 032103213130121140030443255125332243343336336555656433255235254313433424224542501100302101221320301 94 | 112201332000400003333114425525244134115212434522644332332513434523545134353120230443131202022212112 95 | 212133330330243143424430334431513443235234452344525122433141135525522345433024123302104122132331020 96 | 110220302112033431311324214242235434551543155442332335242312153314452535320343340301332123320021320 97 | 121223310122302143024320402120433335414432343211234251415554145543214421134023034143302200002123012 98 | 221212001102321134443014113311424542341431224511531255544142141422243112400414323421322323011122100 99 | 102101010031312320301133133420124425352551441553552411331314122515423420100020312041230123102220212 100 | -------------------------------------------------------------------------------- /2022/input_files/day10: -------------------------------------------------------------------------------- 1 | noop 2 | noop 3 | noop 4 | addx 6 5 | addx -1 6 | noop 7 | addx 5 8 | noop 9 | noop 10 | addx -12 11 | addx 19 12 | addx -1 13 | noop 14 | addx 4 15 | addx -11 16 | addx 16 17 | noop 18 | noop 19 | addx 5 20 | addx 3 21 | addx -2 22 | addx 4 23 | noop 24 | noop 25 | noop 26 | addx -37 27 | noop 28 | addx 3 29 | addx 2 30 | addx 5 31 | addx 2 32 | addx 10 33 | addx -9 34 | noop 35 | addx 1 36 | addx 4 37 | addx 2 38 | noop 39 | addx 3 40 | addx 2 41 | addx 5 42 | addx 2 43 | addx 3 44 | addx -2 45 | addx 2 46 | addx 5 47 | addx -40 48 | addx 25 49 | addx -22 50 | addx 2 51 | addx 5 52 | addx 2 53 | addx 3 54 | addx -2 55 | noop 56 | addx 23 57 | addx -18 58 | addx 2 59 | noop 60 | noop 61 | addx 7 62 | noop 63 | noop 64 | addx 5 65 | noop 66 | noop 67 | noop 68 | addx 1 69 | addx 2 70 | addx 5 71 | addx -40 72 | addx 3 73 | addx 8 74 | addx -4 75 | addx 1 76 | addx 4 77 | noop 78 | noop 79 | noop 80 | addx -8 81 | noop 82 | addx 16 83 | addx 2 84 | addx 4 85 | addx 1 86 | noop 87 | addx -17 88 | addx 18 89 | addx 2 90 | addx 5 91 | addx 2 92 | addx 1 93 | addx -11 94 | addx -27 95 | addx 17 96 | addx -10 97 | addx 3 98 | addx -2 99 | addx 2 100 | addx 7 101 | noop 102 | addx -2 103 | noop 104 | addx 3 105 | addx 2 106 | noop 107 | addx 3 108 | addx 2 109 | noop 110 | addx 3 111 | addx 2 112 | addx 5 113 | addx 2 114 | addx -5 115 | addx -2 116 | addx -30 117 | addx 14 118 | addx -7 119 | addx 22 120 | addx -21 121 | addx 2 122 | addx 6 123 | addx 2 124 | addx -1 125 | noop 126 | addx 8 127 | addx -3 128 | noop 129 | addx 5 130 | addx 1 131 | addx 4 132 | noop 133 | addx 3 134 | addx -2 135 | addx 2 136 | addx -11 137 | noop 138 | noop 139 | noop 140 | -------------------------------------------------------------------------------- /2022/input_files/day11: -------------------------------------------------------------------------------- 1 | Monkey 0: 2 | Starting items: 89, 95, 92, 64, 87, 68 3 | Operation: new = old * 11 4 | Test: divisible by 2 5 | If true: throw to monkey 7 6 | If false: throw to monkey 4 7 | 8 | Monkey 1: 9 | Starting items: 87, 67 10 | Operation: new = old + 1 11 | Test: divisible by 13 12 | If true: throw to monkey 3 13 | If false: throw to monkey 6 14 | 15 | Monkey 2: 16 | Starting items: 95, 79, 92, 82, 60 17 | Operation: new = old + 6 18 | Test: divisible by 3 19 | If true: throw to monkey 1 20 | If false: throw to monkey 6 21 | 22 | Monkey 3: 23 | Starting items: 67, 97, 56 24 | Operation: new = old * old 25 | Test: divisible by 17 26 | If true: throw to monkey 7 27 | If false: throw to monkey 0 28 | 29 | Monkey 4: 30 | Starting items: 80, 68, 87, 94, 61, 59, 50, 68 31 | Operation: new = old * 7 32 | Test: divisible by 19 33 | If true: throw to monkey 5 34 | If false: throw to monkey 2 35 | 36 | Monkey 5: 37 | Starting items: 73, 51, 76, 59 38 | Operation: new = old + 8 39 | Test: divisible by 7 40 | If true: throw to monkey 2 41 | If false: throw to monkey 1 42 | 43 | Monkey 6: 44 | Starting items: 92 45 | Operation: new = old + 5 46 | Test: divisible by 11 47 | If true: throw to monkey 3 48 | If false: throw to monkey 0 49 | 50 | Monkey 7: 51 | Starting items: 99, 76, 78, 76, 79, 90, 89 52 | Operation: new = old + 7 53 | Test: divisible by 5 54 | If true: throw to monkey 4 55 | If false: throw to monkey 5 56 | -------------------------------------------------------------------------------- /2022/input_files/day12: -------------------------------------------------------------------------------- 1 | abccccccccccccccccccccccccccaaaaaaaaacccccccccccaaacccccccccccccccccccccccccaaaaaaaaccccccccaaaaaaccaaccccccccccccccccccccccccaaaaacaacaaaacccccccccccccccccccccccccccccccccccccaaaaa 2 | abccaaacccccccccccccccccccccaaaaaaaaacccccccccaaaaaacccccccccccccccccccccaaaaaaaaaaaccccccccaaaaaaccaaaaaacccaacaaccccccccccccaaaaaaaacaaaaaaccccccccccccccccccccccccccccccccccaaaaaa 3 | abccaaaaccccccccccccccccccccaaaaaaaaccccccccccaaaaaaccccaaaaaccccccccccccaaaaaaaaaaacccccccccaaaaaccaaaaaccccaaaacccccccccccccccaaaaacccaaaaaccccccccccccccccccccaaccccccccccccaaaaaa 4 | abccaaaacccccccaaaccccccccccaaaaaaacccccccccccaaaaaaccccaaaaaccccccccccccacaaaaaaaaaacccccccaaaaacaaaaaaacccaaaaaccccccccccccccaaaaacccaaaaaccccccccccccccccccccaaaaccccccccccccccaaa 5 | abccaaaccccccaaaaaacccccccccaccaaaccccccccccccaaaaacccccaaaaaaccccaaaacccccaaaaaaaaaaaccccccaaaaacaaaaaaacccaaaaaacccccccccccccaacaaaccaccaacccccccccccccccaaaccaaaaccccccccccccccaaa 6 | abcccccccccccaaaaaacccccccccccccaaacccccccccccaaaaacccccaaaaaaccccaaaaccccccaaaaacaaaaccccccccccccccaaaaaaccacaaaaccccaaaaacccccccaaccccccccccccccccccccccaaaackkkaccccccccccccccccaa 7 | abcccccccccccaaaaaacccccccccccccccaaacccccccccccccccccccaaaaaaccccaaaacccccaaaaaccccaaccccccccccccccaaccaaccccaaccccccaaaaaccccccccccccccccccccccccccccccccaakkkkkkkccccccccccccccccc 8 | abaccccccccccaaaaaccccccccccccccccaaaaccccccccccccccccccccaaaccccccaaccccccccaaaccccccccccccccccccccaacccccccccccccccaaaaaacccccccccccccccccccccaaacccccccccjkkkkkkkkccccccccaacccccc 9 | abaccccccccccaaaaacccccaacccccccccaaaaccccccccccccaacccccccccccccccccccccccccaaacccccccccccccccccccccaaccccccaccaccccaaaaaaaaaccaccccccccccccccaaaaccccccccjjkkoopkkkkaccaacaaacccccc 10 | abaccccccccccccccccaaaaaacccccccccaaacccccccccccccaaaaaacccccccccccccccccccccccccccccccccccccccccccccaaaaaaccaaaaccccaaaaaaaaacaaccccccccccccccaaaacccccccjjjkoooppkkkaccaaaaaaaacccc 11 | abcccccccccccccccccaaaaaaaaccccccccccccccccaccccccaaaaaaccccccccccccccccccccccccaaccaacccccccccccccccaaaaaacaaaaacccccaaacccaaaaacccccccccccccccaaacccccjjjjjoooppppkklccaaaaaaaacccc 12 | abcccccccccccccccccaaaaaaaacccccccccccccccaaacccaaaaaaaccccaacccacccccccccccccccaaaaaaccccccccaaaccaaaaaaaccaaaaaaccccccccaaaaaacccccccccccccccccccccjjjjjjjoooouuppplllccaccaaaacccc 13 | abccccccccccccccccccaaaaaaaccccaacccccaaacaaacccaaaaaaaccccaaacaacccccccccccccccaaaaaacccccccccaaaaaaaaaaaacaaaaaaccccccccaaaaaaaaccccccccccccccccciijjjjjjooouuuupppllllcccccccccccc 14 | abccccccccccccccccccaaaaaccccccaacccccaaaaaaaaaaccaaaaaaccccaaaaaccccccccccccccaaaaaaacccccccaaaaaaaaaaaaaacccaaccccccccccaacaaaaacccccccccccccccciiiijoooooouuuuuuppplllllcccccccccc 15 | abcccccccccccccccccaaaaaacccaacaaaaacccaaaaaaaaaccaaccaaccaaaaaacccccccccccccccaaaaaaaaccccccaaaaacccaaaaaacccaccccccccccccccaacccccccccccccccccciiiinnoooooouuxuuuupppplllllcccccccc 16 | abcccccccccccccccccccccaacccaaaaaaaaccccaaaaaaccccaaccccccaaaaaaaaccaaaccccccccaaaaaaaacccccccaaaaaccaacaaaaaaaacccaaccccccccacccccccccaaaccccccciiinnnnntttuuuxxuuuppppqqllllccccccc 17 | abccccccccccccaacccccccccccccaaaaaccccccaaaaaacccccaaaccccaaaaaaaaccaaaacccccccccaaaccccccccccaaccaccccccaaaaaacccaaaaaaccccccccccccccaaaaccccaaiiinnnntttttuuxxxxuuvpqqqqqllmmcccccc 18 | abccccccccccaaaaaaccccccccccccaaaaaccccaaaaaaacccccaaacccccccaacccccaaaaccccaaccccaacccccccccccccccccccccaaaaaaccccaaaaaccccccccccccccaaaaccccaaiiinnnttttxxxxxxxyuvvvvvqqqqmmmcccccc 19 | abccaaacccccaaaaaacccccccccccaaacaaccccaaacaaacccccaaaaaaacccaccccccaaaccccaaaacccccccccccccccccccccccccaaaaaaaacaaaaaaacccccccccaaacccaaaccccaaaiinnntttxxxxxxxxyyyyvvvvqqqmmmcccccc 20 | abcaaaacccccaaaaaccccccccccccaaaccaccccccccccacccaaaaaaaaaaccccccccccccccccaaaaccccccccccccccccccccccccaaaaaaaaaaaaaaaaaaccccccccaaaaaacccccaaaaaiiinnnttxxxxxxxyyyyyyvvvqqqmmmcccccc 21 | SbcaaaaccccccaaaaacccccaaaccccccaaacccccccccaaccaaaaaaaaaaaacccccccccccccccaaaaccccccccccccccccccccccccaaaaaaaaaaaaaaaaaacccccccaaaaaaacccccaaaaaiiinnntttxxxxEzzyyyyvvvqqqmmmdddcccc 22 | abccaaaccccccaaaaacccccaaaaccccaaaaaaccccccaaaaccaaaaaaacaaacccccaaccccccccccccccccccccccccccccccccccccacaaaaacccccaaacacccccccaaaaaaaccccccaaaaaahhhnnntttxxxyyyyyyvvvvqqmmmmdddcccc 23 | abcccccccccccccccccccccaaaaccccaaaaaaccccccaaaaccccaaaaaaaaaaaaaaaacacccccccccccccccccccccccccccccccccccccaaaacccccaaccccccccccaaaaaaaccccccccaaaahhhnnnnttxxxyyyyyvvvqqqqmmmdddccccc 24 | abcccccccccccccccaacaacaaacccccaaaaaaccccccaaaacccaaaaaaaaaaaaaaaaaaacccccccccccccccccaacaaccccccccccccccccaaccccccccccccccccccccaaaaaacccccccaaccchhhmmmttxwyyyyyyvvrqqqmmmddddccccc 25 | abcccccccccccccccaaaacccccccccccaaaaacccccccccccaaaaaaaaaaaaaaccaaaaccccaacccccaacccccaaaaaccccccccccccccccccccccccccccccccaaaaccaaaaaacccccccaaccahhhmmssswwywwwyyyvvrqmmmmdddcccccc 26 | abccccccccccccccaaaaacccccccccccaacaacccccccccccaaaaaacaaaaaacccaaaaaaacaaccccaaaccccccaaaaacccccccacccccccccccccccccccccccaaaaccaacccccccccccaaaaahhhmmsswwwwwwwwywwvrrnnmdddccccccc 27 | abccccccccccccccaaaaaaccaaccccccccccccccccccccccaaaaaaaaaaaaacccacaacaaaaaccccaaacaaacaaaaaacaaacaaacccccccacccaaccccaaccccaaaacccccccccaaaccccaaaahhhmmssswwwwswwwwwwrrnnndddccccccc 28 | abaaccccccccccccacaaaacaaaaaaaccccccccccaacccccccaaaaaaaacaaaccccccccaaaaaaaaaaaaaaaacaaaacccaaaaaaacccccccaacaaaaaaaaacccccaaccccccccccaaacccaaaaahhhmmsssswsssrrwwwrrrnneddaccccccc 29 | abaaccccccccaaccccaaccccaaaaacccccccccccaacccccccaaaacccccccacccccccaaaaaaaaaaaaaaaaacccaaccccaaaaaacccccccaaaaacaaaaaaacccccccccccccaaaaaaaaaaaaaahhhmmssssssssrrrrrrrrnneedaaaacccc 30 | abacccccccccaaaaccccccaaaaaaaccccccccaaaaaaaacccccccccccccccccccccccaaaaaaaacaaaaaacccaaacccccaaaaaaaacccccaaaaaacaaaaaaaccccccccccccaaaaaaaaaaaaaahhhmmmsssssllrrrrrrrnnneeeaaaacccc 31 | abaaacccccaaaaaaccccccaaaaaaaacccaaccaaaaaaaaccccaaaaaccccccccccccccaaaaaacccaaaaaaccccaaaccaaaaaaaaaaccccaaaaaaaaaaaaaaaccccccccccccccaaaaaccccaachhgmmmmmlllllllrrrrrnnneeeaaaacccc 32 | abaaacccccaaaaaccccaccaaaaaaaacaaaaaaccaaaaccccccaaaaacccccccccccccccccaaacccaaaaaaaccaaaaaaaaaaaaaaaaccccaaaaaaaaaaaaacccccccccccccccaaaaaaccccaaccgggmmmllllllllllnnnnneeeaaaaccccc 33 | abcccccccccaaaaacccaaacaaaacaacaaaaaacaaaaaccccccaaaaaaccccccccccccccccccccccaaacaaacccaaaaaaaacaaaccccccccccaaccaaaaaacccccccccccccccaaaaaacaacccccgggggmlllfffflllnnnnneeeaaaaccccc 34 | abcccccccccaaccacccaaaaaaacccccaaaaaacaacaaacccccaaaaaaccccccccccccccccccccccaccaaccaaaaaaaaacccaaaccccccccccaaccccccaacccccaaaaccccccaccaaaaaaccccccggggggggfffffflnnneeeeeacaaacccc 35 | abaaaccccccccccccccaaaaaacccccccaaaaacacccaaaacccaaaaaacccccccccccccccccccaaacccaaccaaaaaaaaacccaaccccccccccccccccccccccccccaaaaccccaaaccaaaaaacccccccgggggggfffffffffeeeeeaacccccccc 36 | abaaaaacccccccccccaaaaaaaaccccccaaaacccccccaaacccccaacccccccaaacccccccccccaaaacaaacccaaaaaaaacccccccccccccccccccccccccccccccaaaaccccaaacccaaaaaaacccccccccgccaaaafffffeeeeccccccccccc 37 | abaaaaaccccccaaccaaaaaaaaaacccccaaacaaaaaacaaaccccccccccccaaaaaccccccccccaaaaacaaacccccaaaaaaacccccccccccccccccccccccccccccccaacccccaaaaaaaaaaaaaccccccccccccaaaacaafffecccccccccccaa 38 | abaaaacccaaacaaccaaaaaaaaaacccccaaaaaaaaaaaaaaaaacccccccccaaaaaaccccccccccaaaaaaaaaaacaaacccacccaacccccccccaaaaccccaaacccccccccccaaaaaaaaaaaaaaacccccccccccccaaaccccaaccccccccccccaaa 39 | abaaaaacccaaaaacccccaaacaaacccccaaaaaaccaaaaaaaaacccccccccaaaaaaccaaccacccaaaaaaaaaaaaaaaccccccaaacccccccccaaaaccccaaaaccccccccccaaaaaaaaaaaaaaccccccccccccccaaaccccccccccccccccccaaa 40 | abaaaaacccaaaaaaacccaaaccccccccaaaaaaaaccaaaaaaaccccccccccaaaaacccaaaaaccccaaaaaaaaaaaaacccccaaaaaaaaccccccaaaaccccaaaacccccccccccaaaaaaacccaaaccccccccccccccaaacccccccccccccccaaaaaa 41 | abcccccccaaaaaaaaccccaacccccccaaaaaaaaaaaaaaaaacccccccccccaaaaaccaaaaaacccccaaaaaaaaaaaaaccccaaaaaaaacccccccaacccccaaacccccccccccccaaaaaaacccccccccccccccccccccccccccccccccccccaaaaaa 42 | -------------------------------------------------------------------------------- /2024/day01.py: -------------------------------------------------------------------------------- 1 | from collections import Counter 2 | 3 | with open("input_files/day01", "r") as f: 4 | data = [line.strip().split() for line in f] 5 | 6 | list1 = sorted(int(e[0]) for e in data) 7 | list2 = sorted(int(e[1]) for e in data) 8 | list2_freq = Counter(list2) 9 | 10 | differences = sum(abs(e0 - e1) for e0, e1 in zip(list1, list2)) 11 | similarity = sum(e * list2_freq[e] for e in list1) 12 | 13 | print(differences) 14 | print(similarity) 15 | -------------------------------------------------------------------------------- /2024/day02.py: -------------------------------------------------------------------------------- 1 | from collections.abc import Iterator 2 | from itertools import pairwise 3 | 4 | 5 | def dampened(report: list[int]) -> Iterator[list[int]]: 6 | for i in range(len(report)): 7 | yield report[:i] + report[i + 1:] 8 | 9 | 10 | def is_safe(report: list[int]) -> bool: 11 | differences = [e1 - e2 for e1, e2 in pairwise(report)] 12 | return ( 13 | all(0 < d <= 3 for d in differences) 14 | or all(-3 <= d < 0 for d in differences) 15 | ) 16 | 17 | 18 | with open("input_files/day02", "r") as f: 19 | data = [[int(e) for e in line.split()] for line in f] 20 | 21 | naive_safety = sum(is_safe(r) for r in data) 22 | dampened_safety = sum(any(is_safe(r1) for r1 in dampened(r)) for r in data) 23 | 24 | print(naive_safety) 25 | print(dampened_safety) 26 | -------------------------------------------------------------------------------- /2024/day03.py: -------------------------------------------------------------------------------- 1 | import re 2 | 3 | instruction_regex = re.compile(r"mul\(\d+,\d+\)|do\(\)|don't\(\)") 4 | 5 | with open("input_files/day03", "r") as f: 6 | instructions = instruction_regex.findall(f.read()) 7 | 8 | total = 0 9 | switched_total = 0 10 | 11 | do_multiply = True 12 | for instruction in instructions: 13 | if instruction == "do()": 14 | do_multiply = True 15 | elif instruction == "don't()": 16 | do_multiply = False 17 | else: 18 | left, right = instruction[4:-1].split(",") 19 | product = int(left) * int(right) 20 | total += product 21 | if do_multiply: 22 | switched_total += product 23 | 24 | print(total) 25 | print(switched_total) 26 | -------------------------------------------------------------------------------- /2024/day04.py: -------------------------------------------------------------------------------- 1 | with open("input_files/day04", "r") as f: 2 | data = f.read() 3 | 4 | width = data.find("\n") + 1 5 | 6 | xmasses = 0 7 | mas_crosses = 0 8 | for i in range(len(data)): 9 | runs = [ 10 | data[i:i + 4], 11 | data[i:i + width * 3 + 1:width], 12 | data[i:i + width * 3 + 4:width + 1], 13 | data[i:i + width * 3 - 2:width - 1], 14 | ] 15 | falling = data[i:i + width * 2 + 3:width + 1] 16 | rising = data[i + 2:i + width * 2 + 1:width - 1] 17 | 18 | xmasses += runs.count("XMAS") + runs.count("SAMX") 19 | mas_crosses += falling in ("MAS", "SAM") and rising in ("MAS", "SAM") 20 | 21 | print(xmasses) 22 | print(mas_crosses) 23 | -------------------------------------------------------------------------------- /2024/day05.py: -------------------------------------------------------------------------------- 1 | from collections import defaultdict 2 | from functools import cmp_to_key 3 | from itertools import combinations 4 | 5 | with open("input_files/day05", "r") as f: 6 | rule_data, update_data = f.read().split("\n\n") 7 | update_data = update_data.splitlines() 8 | rule_data = rule_data.splitlines() 9 | 10 | updates = [[int(e) for e in line.split(",")] for line in update_data] 11 | 12 | rules = defaultdict(set) 13 | for rule in rule_data: 14 | pre, post = rule.split("|") 15 | rules[int(pre)].add(int(post)) 16 | 17 | rule_key = cmp_to_key(lambda l, r: -1 if r in rules[l] else 1) 18 | 19 | correct_total = 0 20 | incorrect_total = 0 21 | for update in updates: 22 | mid = len(update) // 2 23 | if all(r in rules[l] for l, r in combinations(update, 2)): 24 | correct_total += update[mid] 25 | else: 26 | incorrect_total += sorted(update, key=rule_key)[mid] 27 | 28 | print(correct_total) 29 | print(incorrect_total) 30 | -------------------------------------------------------------------------------- /2024/day06.py: -------------------------------------------------------------------------------- 1 | from collections import defaultdict 2 | 3 | with open("input_files/day06", "r") as f: 4 | data = f.read() 5 | 6 | start_idx = data.find("^") 7 | grid = data.splitlines() 8 | width, height = len(grid[0]), len(grid) 9 | start = start_idx // (width + 1), start_idx % (width + 1) 10 | 11 | 12 | def run(block=None): 13 | seen = defaultdict(set) 14 | di, dj = -1, 0 15 | i, j = start 16 | while 0 <= i < width and 0 <= j < height and (di, dj) not in seen[(i, j)]: 17 | seen[(i, j)].add((di, dj)) 18 | i1, j1 = i + di, j + dj 19 | if (0 <= i1 < height and 0 <= j1 < width 20 | and (grid[i1][j1] == "#" or (i1, j1) == block)): 21 | di, dj = dj, -di 22 | else: 23 | i, j = i1, j1 24 | return seen, 0 <= i < width and 0 <= j < height 25 | 26 | 27 | blocks, _ = run() 28 | total = sum(run(b)[1] for b in blocks) 29 | 30 | print(len(blocks)) 31 | print(total) 32 | -------------------------------------------------------------------------------- /2024/day07.py: -------------------------------------------------------------------------------- 1 | import re 2 | from operator import add, mul 3 | 4 | 5 | def run(equations, ops): 6 | result = 0 7 | for target, first, *rest in equations: 8 | queue = [first] 9 | for value in rest: 10 | queue = [ 11 | op(total, value) 12 | for total in queue 13 | for op in ops 14 | if total <= target 15 | ] 16 | if target in queue: 17 | result += target 18 | return result 19 | 20 | 21 | def concat(a, b): 22 | i = 10 23 | while i <= b: 24 | i *= 10 25 | return a * i + b 26 | 27 | 28 | with open("input_files/day07", "r") as f: 29 | data = [re.findall(r"(\d+)", line) for line in f] 30 | data = [[int(e) for e in line] for line in data] 31 | 32 | print(run(data, (add, mul))) 33 | print(run(data, (add, mul, concat))) 34 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Advent of Code 2 | 3 | My solutions to the [Advent of Code](https://adventofcode.com/) challenges. 4 | 5 | Note: it is unlikely I will complete all days this year. 6 | --------------------------------------------------------------------------------