def part2(): msg = read_data_file(sys.argv[1], convert=int) invalid = None for i in range(preamble, len(msg)): found = False for j in range(i - preamble, i): for k in range(i - preamble, i): if not msg[j] == msg[k] and (msg[j] + msg[k]) == msg[i]: found = True if not found: invalid = i print('Part 2: invalid sum at index', i, msg[i]) end = invalid - 1 while end: sum = 0 smallest = 9999999999999 largest = 0 for i in range(end, -1, -1): sum += msg[i] if msg[i] > largest: largest = msg[i] elif msg[i] < smallest: smallest = msg[i] if sum == msg[invalid]: print('Contiguous set range:', smallest, largest, '... sum:', smallest + largest) return elif sum > msg[invalid]: end -= 1 break
def part1(): msg = read_data_file(sys.argv[1], convert=int) for i in range(preamble, len(msg)): found = False for j in range(i - preamble, i): for k in range(i - preamble, i): if not msg[j] == msg[k] and (msg[j] + msg[k]) == msg[i]: found = True if not found: print('Part 1: invalid sum at index', i, msg[i])
def part1(): passwords = list(map(formatEntry, read_data_file(sys.argv[1]))) validCount = 0 # print(passwords) for entry in passwords: count = entry['password'].count(entry['letter']) if (count in range(entry['min'], entry['max'] + 1)): validCount = validCount + 1 print('Part 1:', validCount)
def part1(): seats = read_data_file(sys.argv[1], method='char') seat_ids = [] for seat in seats: row = seat[0:7] col = seat[7:10] # print(row, binary_slice(0, 127, row)) # print(col, binary_slice(0, 7, col)) seat_ids.append((binary_slice(0, 127, row) * 8) + binary_slice(0, 7, col)) seat_ids.sort() return seat_ids
def part2(): passwords = list(map(formatEntry, read_data_file(sys.argv[1]))) validCount = 0 # print(passwords) for entry in passwords: firstPos = entry['password'][entry['min'] - 1] == entry['letter'] secondPos = entry['password'][entry['max'] - 1] == entry['letter'] if ((firstPos and secondPos) or (not firstPos and not secondPos)): continue else: validCount = validCount + 1 print('Part 2:', validCount)
def part2(): instr = read_data_file(sys.argv[1], splitStr=' ', convert=[str, int]) switchers = [] for loc in range(len(instr)): if instr[loc][0] == 'nop' or instr[loc][0] == 'jmp': switchers.append(loc) for loc in switchers: switched = instr[:] if switched[loc] == 'nop': switched[loc] = ['jmp', switched[loc][1]] else: switched[loc] = ['nop', switched[loc][1]] # print('trying', switched) run(switched)
def part1(): mountain = read_data_file(sys.argv[1], method='char') trees = 0 pos = [0, 0] # print(mountain) while pos[0] < len(mountain): if (pos[1] > len(mountain[0]) - 1): pos[1] = pos[1] - len(mountain[1]) # print('checking:', pos) #, mountain[pos[1]][pos[0]]) if (mountain[pos[0]][pos[1]] == '#'): trees += 1 pos[1] += 3 pos[0] += 1 print('Part 1:', trees)
def part2(): mountain = read_data_file(sys.argv[1], method='char') slopes = ((1, 1), (1, 3), (1, 5), (1, 7), (2, 1)) treeMultiplier = 1 for slope in slopes: trees = 0 pos = [0, 0] while pos[0] < len(mountain): if (pos[1] > len(mountain[0]) - 1): pos[1] = pos[1] - len(mountain[1]) # print('checking:', pos) #, mountain[pos[1]][pos[0]]) if (mountain[pos[0]][pos[1]] == '#'): trees += 1 pos[1] += slope[1] pos[0] += slope[0] treeMultiplier *= trees print('Part 2:', treeMultiplier)
def get_bag_rules(): lines = read_data_file(sys.argv[1]) graph = {} for line in lines: bags = line.split(' bags contain ') if not bags[0] in graph: graph[bags[0]] = {} for bag in bags[1].split(', '): contents = re.match(r'^(\d+) (\w+ \w+) bags?\.?$', bag) if contents is None: continue if contents.group(2) in graph: if bags[0] in graph[contents.group(2)]: graph[contents.group(2)][bags[0]] += int(contents.group(1)) else: graph[contents.group(2)][bags[0]] = int(contents.group(1)) else: graph[contents.group(2)] = { bags[0]: int(contents.group(1)) } return graph
import sys from copy import deepcopy from helpers import read_data_file print('\n************* Day 21 *************\n') products = read_data_file(sys.argv[1]) possile_allergens = {} all_ingredients = set() product_ingredients = [] for product in products: parts = product.split(' (contains ') ingredients = set(parts[0].split(' ')) all_ingredients = all_ingredients.union(ingredients) product_ingredients.append(ingredients) for allergen in parts[1][0:-1].split(', '): if not allergen in possile_allergens: possile_allergens[allergen] = set(ingredients) else: possile_allergens[allergen] = possile_allergens[ allergen].intersection(set(ingredients)) allergens_copy = deepcopy(possile_allergens) def find_next_single(): for allergen in allergens_copy: if len(allergens_copy[allergen]) == 1: return allergen return None
import sys import copy from helpers import read_data_file print('\n************* Day 11 *************\n') start_room = read_data_file(sys.argv[1], method='char') def check_adj_seat(i, j, room, limit): if room[i][j] == '.': return '.' adj_ocupied = 0 for adj_i in range(i-1,i+2): for adj_j in range(j-1,j+2): if adj_i == i and adj_j == j: continue elif adj_i in range(0,len(start_room)) and adj_j in range(0,len(start_room[0])) and room[adj_i][adj_j] == '#': adj_ocupied += 1 if adj_ocupied == 0: return '#' elif adj_ocupied >= limit: return 'L' else: return room[i][j] def check_seat_view(i, j, room, limit): if room[i][j] == '.': return '.' adj_ocupied = 0 for adj_i in range(i-1,i+2): for adj_j in range(j-1,j+2):
import sys import re from helpers import read_data_file print('\n************* Day 16 *************\n') info = read_data_file(sys.argv[1]) rules = {} mine = [] nearby = [] for line in info: match = re.match(r'^([a-z ]+): (\d+)-(\d+) or (\d+)-(\d+)$', line) if match: rules[match.group(1)] = [ range(int(match.group(2)), int(match.group(3)) + 1), range(int(match.group(4)), int(match.group(5)) + 1) ] # rules[match.group(1)] = [[int(match.group(2)), int(match.group(3))], [int(match.group(4)), int(match.group(5))]] match = re.match(r'^your ticket: ([\d,]+)$', line) if match: mine = list(map(int, match.group(1).split(','))) match = re.match(r'^([\d,]+)$', line) if match: nearby.append(list(map(int, match.group(1).split(',')))) # print(rules, '\n', mine, '\n', nearby)
import sys import copy from helpers import read_data_file print('\n************* Day 18 *************\n') formulas = read_data_file(sys.argv[1]) def eval_group(start, f): op = '+' group_total = 0 # print('group', f[start:]) i = start while i < len(f): # print('looking at index', i) if f[i] == '(': result = eval_group(i + 1, f) # print('performing:', group_total, op, result[0]) if op == '+': group_total += result[0] else: group_total *= result[0] if result[1] == None: break else: i = result[1] elif f[i] == ')': # print('end group', group_total, 'at index', i) return [group_total, i] elif f[i] == '+':
import sys from copy import deepcopy from helpers import read_data_file print('\n************* Day 20 *************\n') lines = read_data_file(sys.argv[1]) tiles = {} curr_id = None tile_rows = [] for line in lines: if line.startswith('Tile'): if curr_id != None: tiles[curr_id] = tile_rows tile_rows = [] curr_id = line[5:9] elif line.startswith('.') or line.startswith('#'): tile_rows.append(line) tiles[curr_id] = tile_rows # catch last tile # print(tiles) edges = {} def set_tile_edges(tile_id): left = '' right = '' for row in tiles[tile_id]: left += row[0] right += row[9] edges[tile_id] = [
import sys from helpers import read_data_file print('\n************* Day 01 *************\n') expenses = read_data_file(sys.argv[1], convert=int) answer = None for i in range(len(expenses)): j = i + 1 while j < len(expenses): k = j + 1 while k < len(expenses): if ((expenses[i] + expenses[j] + expenses[k]) == 2020): answer = expenses[i] * expenses[j] * expenses[k] k = k + 1 j = j + 1 print(answer)
import sys import signal from helpers import read_data_file print('\n************* Day 15 *************\n') starting = read_data_file(sys.argv[1], method='comma', convert=int)[0] def find_last_spoken(top): try: spoken = {} for i in range(len(starting)): spoken[starting[i]] = [i] last = starting[-1] for turn in range(len(starting),top): # if not last in spoken: # print('turn', turn, last, 'is new (0)') # spoken[0] = [spoken[0][0],turn] # last = 0 # else: new = turn - 1 - spoken[last][0] # print('turn', turn, last, 'spoken at', spoken[last][0], 'setting', new) if new in spoken: spoken[new] = [spoken[new][-1], turn] else: spoken[new] = [turn] last = new except KeyboardInterrupt: print('turn:', turn)
def part1(): instr = read_data_file(sys.argv[1], splitStr=' ', convert=[str, int]) run(instr)
import sys from copy import deepcopy from helpers import read_data_file print('\n************* Day 23 *************\n') cups = read_data_file(sys.argv[1], method='char', convert=int)[0] print('start:', cups) def next_index(i, length): next_i = i + 1 if next_i >= length: next_i = 0 return next_i def possible_dest(curr, turn): next_cup = curr - 1 if next_cup < 1: next_cup = 9 if not next_cup in turn: return possible_dest(next_cup, turn) return next_cup def place_cup(index, cup, turn): if index >= len(cups): return place_cup(0, cup, turn) else: turn.insert(index, cup) return turn def part1():
import sys from copy import deepcopy from helpers import read_data_file print('\n************* Day 24 *************\n') paths = read_data_file(sys.argv[1]) def get_position(path): pos = [0, 0] i = 0 while i < len(path): if path[i] == 'e': pos[0] += 1 elif path[i] == 'w': pos[0] -= 1 else: name = path[i] + path[i + 1] if name == 'se': if pos[1] % 2 == 1: pos[0] += 1 pos[1] += 1 elif name == 'sw': if pos[1] % 2 == 0: pos[0] -= 1 pos[1] += 1 elif name == 'ne': if pos[1] % 2 == 1: pos[0] += 1 pos[1] -= 1
import sys from helpers import read_data_file print('\n************* Day 10 *************\n') all_adapters = read_data_file(sys.argv[1], convert=int) all_adapters.sort() # print(all_adapters) def find_smallest_next(current, adapters): next_index = 999999999 next_num = 9999999999 for i in range(len(adapters)): if adapters[i] - current < 4 and adapters[i] < next_num: next_num = adapters[i] next_index = i del adapters[next_index] return next_num def part1(): last_adapter = 0 diffs = {1: 0, 3: 0} adapters = all_adapters[:] while len(adapters): next_num = find_smallest_next(last_adapter, adapters) diffs[next_num - last_adapter] += 1 last_adapter = next_num