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