import string from aocd.models import Puzzle from aocd import submit def eval_item_priority(rucksack: str) -> int: ''' evaluates the priority of a common item ''' # create a map of priority values priorities = dict(zip(string.ascii_letters, range(1,53))) # slize rucksack into compartments size = len(rucksack) a,b = rucksack[:size//2], rucksack[size//2:] # find the common item common = ''.join( set(a).intersection(b) ) # return the priority return priorities[common] def eval_badge_priority(rucksacks: list) -> int: ''' evaluate the priority of duplicate items over groups of three rucksacks ''' # create a map of priority values priorities = dict(zip(string.ascii_letters, range(1,53))) # find common item among three sets common = ''.join( set(rucksacks[0]) & set(rucksacks[1]) & set(rucksacks[2]) ) return priorities[common] def parse_input(data: list) -> list: ''' parses the input data and generates a list ''' # split move set into a list of rounds return [ move for move in data.split('\n')] if __name__ == "__main__": # get puzzle and parse data puzzle = Puzzle(year=2022, day=3) supplies = parse_input(puzzle.input_data) # part a: determine the priority of dupplicate items in compartments answer_a = sum([eval_item_priority(rucksack) for rucksack in supplies]) print(f'sum of priorities of all common items amongst compartments: {answer_a}') submit(answer_a, part='a', day=3, year=2022) # part b: determine the priority of common items in groups of three # split the supply list into groups of three rucksacks = [ supplies[i:i+3] for i in range(0,len(supplies),3) ] answer_b = sum([ eval_badge_priority(rucksack) for rucksack in rucksacks ]) print(f'sum of priorities of all common items amongst groups of three: {answer_b}') submit(answer_b, part='b', day=3, year=2022)