Solution to problem 2 in Python

This commit is contained in:
David Doblas Jiménez 2022-02-28 10:38:53 +01:00
parent 7e012ad153
commit 7ea523c25e

81
src/Year_2015/P2.py Normal file
View File

@ -0,0 +1,81 @@
# --- Day 2: I Was Told There Would Be No Math ---
# The elves are running low on wrapping paper, and so they need to submit an
# order for more. They have a list of the dimensions (length l, width w, and
# height h) of each present, and only want to order exactly as much as they
# need.
# Fortunately, every present is a box (a perfect right rectangular prism),
# which makes calculating the required wrapping paper for each gift a little
# easier: find the surface area of the box, which is 2*l*w + 2*w*h + 2*h*l.
# The elves also need a little extra paper for each present: the area of the
# smallest side.
# For example:
# A present with dimensions 2x3x4 requires 2*6 + 2*12 + 2*8 = 52 square
# feet of wrapping paper plus 6 square feet of slack, for a total of 58 square
# feet.
# A present with dimensions 1x1x10 requires 2*1 + 2*10 + 2*10 = 42 square
# feet of wrapping paper plus 1 square foot of slack, for a total of 43 square
# feet.
# All numbers in the elves' list are in feet. How many total square feet of
# wrapping paper should they order?
from itertools import combinations
from math import prod
with open("files/P2.txt") as f:
boxes = [line for line in f.read().strip().split()]
def part_1() -> None:
wrapping_paper = 0
for box in boxes:
sides = list(combinations(box.split("x"), 2))
extra = min(int(dims[0]) * int(dims[1]) for dims in sides)
box_area = sum(2 * int(dims[0]) * int(dims[1]) for dims in sides)
wrapping_paper += box_area + extra
print(f"They will need {wrapping_paper} sqf. of wrapping paper")
# --- Part Two ---
# The elves are also running low on ribbon. Ribbon is all the same width, so
# they only have to worry about the length they need to order, which they would
# again like to be exact.
# The ribbon required to wrap a present is the shortest distance around its
# sides, or the smallest perimeter of any one face. Each present also requires
# a bow made out of ribbon as well; the feet of ribbon required for the perfect
# bow is equal to the cubic feet of volume of the present. Don't ask how they
# tie the bow, though; they'll never tell.
# For example:
# A present with dimensions 2x3x4 requires 2+2+3+3 = 10 feet of ribbon to
# wrap the present plus 2*3*4 = 24 feet of ribbon for the bow, for a total of
# 34 feet.
# A present with dimensions 1x1x10 requires 1+1+1+1 = 4 feet of ribbon to
# wrap the present plus 1*1*10 = 10 feet of ribbon for the bow, for a total of
# 14 feet.
# How many total feet of ribbon should they order?
def part_2() -> None:
ribbon = 0
for box in boxes:
sides = list(map(int, box.split("x")))
bow = prod(sides)
sides.remove(max(sides))
wrapping = 2 * sides[0] + 2 * sides[1]
ribbon += wrapping + bow
print(f"They will need {ribbon} sqf. of ribbon")
if __name__ == "__main__":
part_1()
part_2()