Solution to problem 2 in Python
This commit is contained in:
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()
|
||||||
Reference in New Issue
Block a user