from aocd.models import Puzzle from aocd import submit class Elf: ''' object which holds a a list of calories carried by this particular elf ''' calories = list() def __init__(self, numbers: list) -> None: ''' constructor ''' self.calories = numbers.copy() def __lt__(self, other) -> bool: ''' compare if sum of calorie is less than other ''' return (self.sum_calories() < other.sum_calories()) def __repr__(self) -> str: ''' print string representation of object ''' return f'{str(self.calories)}' def sum_calories(self) -> int: ''' calculate the total calories carried by this elf ''' return sum(self.calories) def parse_input(data: list) -> list: ''' parses the input data and generates a list of elfs from the input data string ''' # split input string into list splits = data.split('\n') # split list into sublists numbers = list() tmp = list() for number in splits: if not number: numbers.append(tmp.copy()) tmp.clear() else: tmp.append(int(number)) # elf object for each sublist return [ Elf(data) for data in numbers ] if __name__ == "__main__": # get puzzle and parse data puzzle = Puzzle(year=2022, day=1) # get a list of elfs and sort based on calories elfs = parse_input(puzzle.input_data) elfs = sorted(elfs, reverse=True) # part a: submit biggest number of calories answer = elfs[0].sum_calories() print(f'answer part a: {answer}') submit(answer, part='a', day=1, year=2022) # part b: submit the calorie sum of the top 3 elfs answer = sum([ elf.sum_calories() for elf in elfs[:3]]) print(f'answer part b: {answer}') submit(answer, part='b', day=1, year=2022)