# # Load the Data # fname = 'test-input.txt' # Test data fname = 'input.txt' # Production data import aocutils as aoc data = [(ingr.split(' '), allerg.split(', ')) for ingr, allerg in [line.rstrip(')').split(' (contains ') for line in aoc.load_1D(fname)]] # # Part 1 # ingredients = {ingredient for food in data for ingredient in food[0]} allergens = {allergen for food in data for allergen in food[1]} allerg_ingr = set.union(*[ set.intersection(*[set(food[0]) for food in data if allergen in food[1]]) for allergen in allergens ]) print( 'Part 1:', sum([ len([ingr for food in data if ingr in food[0]]) for ingr in ingredients - allerg_ingr ])) # # Part 2
fname = 'test-input.txt' # Test data fname = 'input.txt' # Production data monster_fname = 'input-monster.txt' # Monster data import aocutils as aoc import numpy as np tilesdata = [ dict(zip(('id', 'data'), tiledata.lstrip('Tile: ').split(':'))) for tiledata in aoc.load_1D(fname, sep='\n\n') ] tilesdata = [{ 'id': tile['id'], 'data': np.array([list(line) for line in tile['data'].lstrip('\n').split('\n')]) } for tile in tilesdata] monster = np.array(aoc.load_2D(monster_fname, l_strip=False, r_strip=False)) # # Part 1 # import copy edge = { 'N': (lambda tile: tile['data'][0]), 'E': (lambda tile: tile['data'][:, 9]),
# # Load the data # fname = 'test-input.txt' # Test data fname = 'input.txt' # Production data import aocutils as aoc data = aoc.load_1D(fname) # # Part 1 # def compute(expr): left = expr[0] if type(expr[0]) != tuple else compute(expr[0]) right = expr[2] if type(expr[2]) != tuple else compute(expr[2]) reduced = left + right if expr[1] == '+' else left * right return compute((reduced, *expr[3:])) if len(expr) > 3 else reduced expression_trees = [ eval(''.join([("'%s'" % sym) if sym in {'+', '*'} else sym for sym in expr.replace(' ', ',')])) for expr in data ] print('Part 1:', sum([compute(expr) for expr in expression_trees])) # # Part 2
#fname = 'test-input.txt' # Test data fname = 'test2-input.txt' # Test data, part 2 fname = 'input.txt' # Test data import aocutils as aoc import math data = aoc.load_1D(fname, sep = '\n\n') fields = {field[:field.index(':')]: set.union(*[(lambda start, stop: set(range(start, stop + 1)))(*[int(num) for num in rng.split('-')]) for rng in field[field.index(':') + 2:].split(' or ')]) for field in data[0].split('\n')} my_ticket, tickets = [[[int(num) for num in line.split(',')] for line in section.split('\n')[1:]] for section in data[1:]] my_ticket = my_ticket[0] # # Part 1 # all_fields_values = set().union(*fields.values()) print('Part 1:', sum(v for ticket in tickets for v in ticket if v not in all_fields_values)) # # Part 2 # valid_tickets = [ticket for ticket in tickets if not any(v not in set().union(*fields.values()) for v in ticket)] col_field_matches = {i: {fname for fname, fvalues in fields.items() if {ticket[i] for ticket in valid_tickets}.issubset(fvalues)} for i in range(len(fields))} final_columns = {}
# # Load the data # fname = 'test-input.txt' # Test data fname = 'test2-input.txt' # Test data, part 2 fname = 'input.txt' # Production data import aocutils as aoc data = [line.split(' = ') for line in aoc.load_1D(fname)] # # Part 1 # def cmd_mask(mask_str): return [(len(mask_str) - i, int(mask_str[i])) for i in range(len(mask_str)) if mask_str[i] != 'X'] # 123456789012345678901234567890123456 neg_bit_mask = int('111111111111111111111111111111111111', 2) def cmd_setmem(addr_str, value_str, mask, mem): global neg_bit_mask addr = int(addr_str.split('[')[1][:-1]) mem[addr] = int(value_str)
# # Load the data # fname = 'test-input.txt' # Test data fname = 'input.txt' # Production data import aocutils as aoc card_pubkey, door_pubkey = aoc.load_1D(fname, to_int=True) # # Part 1 # def find_loop_size(pubkey): mod_val = 20201227 subject_num = 7 value = 1 loop_size = 0 while value != pubkey: value = (value * subject_num) % mod_val loop_size += 1 return loop_size def find_encryption_key(loop_size, pubkey): mod_val = 20201227 subject_num = pubkey value = 1
# # Load the data # # Test data: fname = 'test-input.txt' fname = 'test2-input.txt' # Production data: fname = 'input.txt' import aocutils as aoc rulesdata, messages = (section.split('\n') for section in aoc.load_1D(fname, sep='\n\n')) rules = {} for rule in rulesdata: id, subrules = rule.split(': ') rules[id] = subrules[1] if subrules[1].isalpha() else [ option.split(' ') for option in subrules.split(' | ') ] # # Part 1 # def check_option(rules, option, message, orule_idx=0): rule_results = check_rule(rules, option[orule_idx], message) if orule_idx == len(option) - 1: return rule_results
# Load the data: # # Test data: fname = 'test-input.txt' #fname = 'test2-input.txt' # Production data fname = 'input.txt' import aocutils as aoc data = [[ int(card) for card in player.replace('Player 1:\n', '').replace( 'Player 2:\n', '').split('\n') ] for player in aoc.load_1D(fname, sep='\n\n')] # # Part 1 # import copy player1, player2 = copy.deepcopy(data) while player1 and player2: p1, p2 = player1.pop(0), player2.pop(0) assert (p1 != p2) if p1 > p2: player1.append(p1) player1.append(p2)