示例#1
0
#
# 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
示例#2
0
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]),
示例#3
0
#
# 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
示例#4
0
#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 = {}
示例#5
0
#
# 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)
示例#6
0
#
# 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
示例#7
0
#
# 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
示例#8
0
# 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)