Esempio n. 1
0
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
Esempio n. 2
0
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])
Esempio n. 3
0
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)
Esempio n. 4
0
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
Esempio n. 5
0
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)
Esempio n. 6
0
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)
Esempio n. 7
0
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)
Esempio n. 8
0
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)
Esempio n. 9
0
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
Esempio n. 10
0
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
Esempio n. 11
0
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):
Esempio n. 12
0
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)

Esempio n. 13
0
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] == '+':
Esempio n. 14
0
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] = [
Esempio n. 15
0
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)
Esempio n. 16
0
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)
Esempio n. 17
0
def part1():
    instr = read_data_file(sys.argv[1], splitStr=' ', convert=[str, int])
    
    run(instr)
Esempio n. 18
0
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():
Esempio n. 19
0
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
Esempio n. 20
0
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