Solution to problem 2 in Python
This commit is contained in:
parent
7e012ad153
commit
7ea523c25e
81
src/Year_2015/P2.py
Normal file
81
src/Year_2015/P2.py
Normal 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()
|
Loading…
Reference in New Issue
Block a user