Day 1 - Calorie Counting

went a bit overboard because it was fun to give all elves names and a "proper" inventory.
main
Peery 2 years ago
parent f1e287a3cf
commit 0a735eb84b

@ -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

@ -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()))])

@ -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…
Cancel
Save