Day 1 - Calorie Counting
went a bit overboard because it was fun to give all elves names and a "proper" inventory.main
							parent
							
								
									f1e287a3cf
								
							
						
					
					
						commit
						0a735eb84b
					
				
											
												Binary file not shown.
											
										
									
								
											
												Binary file not shown.
											
										
									
								
											
												Binary file not shown.
											
										
									
								| @ -0,0 +1,48 @@ | |||||||
|  | import os | ||||||
|  | 
 | ||||||
|  | from entities.items.food import Food | ||||||
|  | from entities.elf import Elf | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class CalorieList: | ||||||
|  |     """ | ||||||
|  |     Day 1 - Calorie List | ||||||
|  | 
 | ||||||
|  |     The Elves take turns writing down the number of Calories contained by the various meals, snacks, rations, etc. that they've brought with them, one item per line. | ||||||
|  |     Each Elf separates their own inventory from the previous Elf's inventory (if any) by a blank line. | ||||||
|  |     """ | ||||||
|  | 
 | ||||||
|  |     def __init__(self, path: str): | ||||||
|  |         if not os.path.isfile(path): | ||||||
|  |             raise FileNotFoundError(f"File was not found or isn't a file: {path}") | ||||||
|  | 
 | ||||||
|  |         self.file_path = path | ||||||
|  | 
 | ||||||
|  |     def parse_file(self): | ||||||
|  |         """ | ||||||
|  |         read the file and parse its contents | ||||||
|  |         :return: | ||||||
|  |         """ | ||||||
|  |         elf_invs = [] | ||||||
|  |         with open(self.file_path, "r") as file: | ||||||
|  |             curr_elf_inventory = [] | ||||||
|  |             for line in file: | ||||||
|  |                 line = line.replace("\n", "") | ||||||
|  |                 if line.isnumeric(): | ||||||
|  |                     curr_elf_inventory.append(int(line)) | ||||||
|  |                 elif len(line) == 0:  # line is empty, next inventory | ||||||
|  |                     elf_invs.append(curr_elf_inventory) | ||||||
|  |                     curr_elf_inventory = list() | ||||||
|  |                 else: | ||||||
|  |                     raise ValueError(f"Unexpected line encountered in calorie list file: {line}") | ||||||
|  |         elf_invs.append(curr_elf_inventory) | ||||||
|  | 
 | ||||||
|  |         elves = [] | ||||||
|  |         for inv in elf_invs: | ||||||
|  |             elf = Elf() | ||||||
|  |             for calories in inv: | ||||||
|  |                 elf.add_to_inventory(Food(calories)) | ||||||
|  |             elves.append(elf) | ||||||
|  | 
 | ||||||
|  |         return elves | ||||||
|  | 
 | ||||||
											
												Binary file not shown.
											
										
									
								
											
												Binary file not shown.
											
										
									
								| @ -0,0 +1,47 @@ | |||||||
|  | from entities.items.item import Item | ||||||
|  | from entities.items.food import Food | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class Elf: | ||||||
|  |     """ | ||||||
|  |     The absolute overkill, because I can. | ||||||
|  |     """ | ||||||
|  |     ELF_COUNT = 0 | ||||||
|  | 
 | ||||||
|  |     def __init__(self): | ||||||
|  |         self.__number = Elf.ELF_COUNT | ||||||
|  |         Elf.ELF_COUNT += 1 | ||||||
|  |         self.__name = Elf.fetch_elf_name(self.__number) | ||||||
|  |         self.__inventory = [] | ||||||
|  | 
 | ||||||
|  |     @staticmethod | ||||||
|  |     def fetch_elf_name(i: int) -> str: | ||||||
|  |         name_list = ["Dash", "Evergreen", "Sugarplum", "Pixie", "Pudding", "Perky", "Candycane", "Glitter-toes", | ||||||
|  |                      "Happy", "Angel-Eyes", "Sugar-Socks", "McJingles", "Frost", "Tinsel", "Twinkle", "Jingle", "Ginger", | ||||||
|  |                      "Joy", "Merry", "Pepper", "Sparkle", "Tinsel", "Winter", "Trinket", "Buddy", "Noel", "Snowball", | ||||||
|  |                      "Tiny", "Elfin", "Candy", "Carol", "Angel", "Nick", "Plum", "Holly", "Snow", "Pine", "Garland", | ||||||
|  |                      "Joseph", "Gabriel", "Hope", "Cedar"] | ||||||
|  |         return name_list[i % len(name_list)] | ||||||
|  | 
 | ||||||
|  |     def __str__(self): | ||||||
|  |         return f"#{self.__number} {self.__name}" | ||||||
|  | 
 | ||||||
|  |     def get_inventory(self) -> list: | ||||||
|  |         return self.__inventory | ||||||
|  | 
 | ||||||
|  |     def add_to_inventory(self, item: Item): | ||||||
|  |         self.__inventory.append(item) | ||||||
|  | 
 | ||||||
|  |     def remove_from_inventory(self, slot: int): | ||||||
|  |         """ | ||||||
|  |         Removes item of the given slot number from the inventory using pop(). | ||||||
|  |         That means there are no empty spaces. | ||||||
|  | 
 | ||||||
|  |         Starts with 0. | ||||||
|  |         :param slot: | ||||||
|  |         :return: | ||||||
|  |         """ | ||||||
|  |         self.__inventory.pop(slot) | ||||||
|  | 
 | ||||||
|  |     def get_inventory_calories(self) -> int: | ||||||
|  |         return sum([x.calorie_value for x in list(filter(lambda x: isinstance(x, Food), self.get_inventory()))]) | ||||||
											
												Binary file not shown.
											
										
									
								
											
												Binary file not shown.
											
										
									
								
											
												Binary file not shown.
											
										
									
								| @ -0,0 +1,8 @@ | |||||||
|  | from entities.items.item import Item | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class Food(Item): | ||||||
|  | 
 | ||||||
|  |     def __init__(self, calorie: int): | ||||||
|  |         super().__init__(name="") | ||||||
|  |         self.calorie_value = calorie | ||||||
| @ -0,0 +1,5 @@ | |||||||
|  | 
 | ||||||
|  | class Item: | ||||||
|  | 
 | ||||||
|  |     def __init__(self, name: str): | ||||||
|  |         self.name = name | ||||||
| @ -0,0 +1,14 @@ | |||||||
|  | 1000 | ||||||
|  | 2000 | ||||||
|  | 3000 | ||||||
|  | 
 | ||||||
|  | 4000 | ||||||
|  | 
 | ||||||
|  | 5000 | ||||||
|  | 6000 | ||||||
|  | 
 | ||||||
|  | 7000 | ||||||
|  | 8000 | ||||||
|  | 9000 | ||||||
|  | 
 | ||||||
|  | 10000 | ||||||
											
												
													File diff suppressed because it is too large
													Load Diff
												
											
										
									
								| @ -0,0 +1,15 @@ | |||||||
|  | from calories.file.calorie_list import CalorieList | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | if __name__ == "__main__": | ||||||
|  |     elves = CalorieList("./input/day1/input.lst").parse_file() | ||||||
|  |     for elf in elves: | ||||||
|  |         print(f"Elf {elf} has calories: {elf.get_inventory_calories()}") | ||||||
|  |     elves.sort(key=lambda x: x.get_inventory_calories(), reverse=True) | ||||||
|  |     print(f"Most calories has: {elves[0]} with {elves[0].get_inventory_calories()} calories in their inventory!") | ||||||
|  | 
 | ||||||
|  |     print(f"The top 3 calorie elves are: {elves[0]} ({elves[0].get_inventory_calories()}), " | ||||||
|  |           f"{elves[1]} ({elves[1].get_inventory_calories()}) and " | ||||||
|  |           f"{elves[2]} ({elves[2].get_inventory_calories()})") | ||||||
|  |     print(f"Their total is: {sum([x.get_inventory_calories() for x in elves[:3]])}") | ||||||
|  | 
 | ||||||
					Loading…
					
					
				
		Reference in New Issue