summaryrefslogtreecommitdiffstats
path: root/2/sol.py
diff options
context:
space:
mode:
Diffstat (limited to '2/sol.py')
-rw-r--r--2/sol.py45
1 files changed, 45 insertions, 0 deletions
diff --git a/2/sol.py b/2/sol.py
new file mode 100644
index 0000000..901f9fe
--- /dev/null
+++ b/2/sol.py
@@ -0,0 +1,45 @@
+from dataclasses import dataclass
+from typing import List
+
+@dataclass
+class Box:
+ w: int
+ h: int
+ d: int
+
+ @staticmethod
+ def from_string(s: str) -> 'Box':
+ w, h, d = map(int, s.split('x'))
+ return Box(w, h, d)
+
+ def surface_area(self) -> int:
+ return 2 * self.w * self.h + 2 * self.h * self.d + 2 * self.d * self.w
+
+ def smallest_side_area(self) -> int:
+ return min(self.w * self.h, self.h * self.d, self.d * self.w)
+
+ def wrapping_paper_area(self) -> int:
+ return self.surface_area() + self.smallest_side_area()
+
+ def smallest_perimeter(self) -> int:
+ return 2 * (self.w + self.h + self.d - max(self.w, self.h, self.d))
+
+ def ribbon_length(self) -> int:
+ """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."""
+ return self.smallest_perimeter() + self.w * self.h * self.d
+
+def part1(boxes: List[Box]) -> int:
+ return sum(box.wrapping_paper_area() for box in boxes)
+
+def part2(boxes: List[Box]) -> int:
+ return sum(box.ribbon_length() for box in boxes)
+
+if __name__ == '__main__':
+ with open('2/input') as f:
+ boxes = [Box.from_string(line.strip()) for line in f]
+ print(part1(boxes))
+ print(part2(boxes)) \ No newline at end of file