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
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():
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
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
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
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():
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
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',