Exemple #1
0
    chunked = chunk_aoc_data(data)

    if unique:
        sets_of_answers = get_unique_letters_in_chunks(chunked)
    else:
        sets_of_answers = get_common_letters_in_chunks(chunked)

    return sum([len(_) for _ in sets_of_answers])


def get_unique_letters_in_chunks(data: Tuple[Tuple[str]]) -> Iterable:
    '''Get set of unique individual letters in chunks.'''
    return (set(''.join(_)) for _ in data)


def get_common_letters_in_chunks(data: Tuple[Tuple[str]]) -> Iterable:
    '''Get set of common letters in chunks.'''
    sets = ((set(_) for _ in el) for el in data)

    return (reduce(lambda x, y: x & y, s) for s in sets)


if __name__ == '__main__':
    puzzle_data = get_aoc_data_for_challenge(__file__, filter_nulls=False)

    result = sum_of_responses(puzzle_data)
    print(result)  # 6534

    result = sum_of_responses(puzzle_data, unique=False)
    print(result)  # 3402
Exemple #2
0
        if c == 'L':
            low, high = bottom
        else:
            low, high = top
    return low


def get_bottom_top(low: int, high: int) -> Tuple[Tuple[int, int], ...]:
    range = high - low
    half = range // 2
    return ((low, low + half), (high - half, high))


def find_missing_middle_seat(data: str) -> int:
    all_ids = sorted([get_seat_id(_) for _ in data])
    all_ids_set = set(all_ids)

    for i in range(all_ids[0], all_ids[-1]):
        if i not in all_ids_set:
            return i


if __name__ == '__main__':
    puzzle_data = get_aoc_data_for_challenge(__file__)

    result = highest_id(puzzle_data)
    print(result)  # 928

    result = find_missing_middle_seat(puzzle_data)
    print(result)  # 610
'''
Demonstrates that code works for day 15.
'''
import pytest

from aoc_utils import get_aoc_data_for_challenge
from day_15 import part_1, part_2

PUZZLE_DATA = get_aoc_data_for_challenge(__file__, filter_nulls=False)


def test_part_1():
    data = [
        ['0,3,6', 436],
        ['1,3,2', 1],
        ['2,1,3', 10],
        ['1,2,3', 27],
        ['2,3,1', 78],
    ]
    for t in data:
        res = part_1([t[0]])
        assert res == t[1]


def test_part_1_pd():
    res = part_1(PUZZLE_DATA)
    assert res == 492


@pytest.mark.slow
def test_part_2():
Exemple #4
0

def get_non_overlapping_pattern_id(data):
    '''Return id of fabric pattern that is unique.'''
    dupes = get_dupes(data)

    for el in data:
        pattern_id, x, y, width, height = get_id_x_y_w_h(el)

        the_one = True
        for i in range(x, x + width):
            for j in range(y, y + height):
                coord = (i, j)
                if coord in dupes:
                    the_one = False

        if the_one:
            return pattern_id[1:]

    return None


if __name__ == '__main__':
    pattern_data = get_aoc_data_for_challenge(__file__)

    overlaps = get_overlapping_fabric(pattern_data)
    print(overlaps)  # 112418

    non_overlap_id = get_non_overlapping_pattern_id(pattern_data)
    print(non_overlap_id)  # 560
Exemple #5
0
    for i, label in enumerate(data):
        for compare_label in data:
            letter_diff, same_letters = letter_difference(label, compare_label)
            if letter_diff == 1:
                res.append(same_letters)
        data.pop(i)
    return res


def letter_difference(label_one, label_two):
    '''Return number of letters different, and the common letters.'''
    num_different = 0
    same_letters = ''
    for i, letter in enumerate(label_one):
        if letter != label_two[i]:
            num_different += 1
        else:
            same_letters += letter

    return num_different, same_letters


if __name__ == '__main__':
    label_data = get_aoc_data_for_challenge(__file__)

    checksum = checksum_generator(label_data)
    print(checksum)  # 454

    fabric_label_solutions = common_letters_in_correct_labels(label_data)
    print(fabric_label_solutions[0])  # lufjygedpvfbhftxiwnaorzmq
Exemple #6
0
from os.path import join, dirname, abspath

import pytest

from aoc_utils import get_aoc_data_for_challenge
from day_1 import get_end_frequency, get_repeated_frequency

EXPECTED_FREQUENCY_LIST = get_aoc_data_for_challenge(__file__)


def test_get_end_frequency():
    '''Sum numbers together to get result frequency.'''
    frequency_changes = ["+1", "-2", "+3", "+1"]
    result = get_end_frequency(frequency_changes)
    assert result == 3


def test_get_end_frequency_real_data():
    frequency_changes = EXPECTED_FREQUENCY_LIST
    result = get_end_frequency(frequency_changes)
    assert result == 454


def test_get_repeated_frequency_example_1():
    frequency_changes = ["+1", "-2", "+3", "+1"]
    result = get_repeated_frequency(frequency_changes)
    assert result == 2


def test_get_repeated_frequency_example_2():
    frequency_changes = [
from aoc_utils import get_aoc_data_for_challenge
from day_4 import get_product_of_guard_id_and_minute, get_product_of_guard_id_and_minute_2

PUZZLE_INPUT = get_aoc_data_for_challenge(__file__)

data = [
    '[1518-11-01 00:00] Guard #10 begins shift',
    '[1518-11-01 00:05] falls asleep',
    '[1518-11-01 00:25] wakes up',
    '[1518-11-01 00:30] falls asleep',
    '[1518-11-01 00:55] wakes up',
    '[1518-11-01 23:58] Guard #99 begins shift',
    '[1518-11-02 00:40] falls asleep',
    '[1518-11-02 00:50] wakes up',
    '[1518-11-03 00:05] Guard #10 begins shift',
    '[1518-11-03 00:24] falls asleep',
    '[1518-11-03 00:29] wakes up',
    '[1518-11-04 00:02] Guard #99 begins shift',
    '[1518-11-04 00:36] falls asleep',
    '[1518-11-04 00:46] wakes up',
    '[1518-11-05 00:03] Guard #99 begins shift',
    '[1518-11-05 00:45] falls asleep',
    '[1518-11-05 00:55] wakes up',
]


def test_get_product_of_guard_id_and_minute():
    res = get_product_of_guard_id_and_minute(data)

    assert res == 240
Exemple #8
0
from aoc_utils import get_aoc_data_for_challenge
from day_3 import get_trees_hit_part_1, get_trees_hit_part_2

PUZZLE_DATA = get_aoc_data_for_challenge(__file__)

data = [
    '..##.......',
    '#...#...#..',
    '.#....#..#.',
    '..#.#...#.#',
    '.#...##..#.',
    '..#.##.....',
    '.#.#.#....#',
    '.#........#',
    '#.##...#...',
    '#...##....#',
    '.#..#...#.#',
]


def test_get_trees_hit_part_1():
    res = get_trees_hit_part_1(data)
    assert res == 7


def test_get_trees_hit_part_1_puzzle_data():
    res = get_trees_hit_part_1(PUZZLE_DATA)
    assert res == 276


def test_get_trees_hit_part_2():
Exemple #9
0
from aoc_utils import get_aoc_data_for_challenge


def get_end_frequency(frequency_changes):
    '''Sum numbers together to get result frequency.'''
    return sum(int(num) for num in frequency_changes)


def get_repeated_frequency(frequency_changes):
    '''Returns first sum of cycled numbers that repeats.'''
    frequency = 0
    found_frequencies = set()
    frequency_changes_ints = [int(_) for _ in frequency_changes]

    for num in itertools.cycle(frequency_changes_ints):
        frequency += num
        if frequency in found_frequencies:
            return frequency
        found_frequencies.add(frequency)


if __name__ == '__main__':
    frequency_list = get_aoc_data_for_challenge(__file__)

    end_frequency = get_end_frequency(frequency_list)
    print(end_frequency)  # 454

    repeated_frequency = get_repeated_frequency(frequency_list)
    print(repeated_frequency)  # 566
Exemple #10
0
from aoc_utils import get_aoc_data_for_challenge
from day_2 import checksum_generator, common_letters_in_correct_labels

LABEL_DATA_PAYLOAD = get_aoc_data_for_challenge(__file__)


def test_checksum_generator():
    label_data = [
        'abcdef',
        'bababc',
        'abbcde',
        'abcccd',
        'aabcdd',
        'abcdee',
        'ababab',
    ]
    result = checksum_generator(label_data)
    assert result == 12


def test_checksum_generator_real_data():
    label_data = LABEL_DATA_PAYLOAD
    result = checksum_generator(label_data)
    assert result == 4712


def test_common_letters_in_correct_labels():
    label_data = [
        'abcde',
        'fghij',
        'klmno',