;; Day 2 - Wrapping paper
;;
;; Part 1: How many totral square feet of wrapping paper should the elves order?
;;
;; ref. https://asdf.common-lisp.dev/uiop.html#index-split_002dstring
;;
(defun dimension (str)
  "split the 'lxwxh' encoding of present dimensions into a list of integers"
  (mapcar (lambda (str-number) (parse-integer str-number))
          (uiop:split-string str :separator "x")))

(defun side-areas (l w h)
  "areas of the three kinds of side of a cuboid"
  (list (* l w) (* w h) (* h l)))

(defun paper-area (l w h)
  "area of the whole present wrapping paper: the area of the lxwxh cuboid plus the smaller paper square"
  (let ((areas (side-areas l w h)))
    (let ((min-area (apply #'min areas)))
      (let ((present-area
              (reduce '+ (mapcar (lambda (area) (* 2 area)) areas))))
        (+ present-area min-area)))))

(defun paper-area-dimension (dimension)
  (paper-area (nth 0 dimension) (nth 1 dimension) (nth 2 dimension)))

#|
(paper-area 2 3 4) ;; 58
(paper-area 1 1 10) ;; 43
|#

(defparameter area-sum 0)

(with-open-file (in "./data/input")
  (do ((line (read-line in nil)
             (read-line in nil)))
      ((null line))
    (setf area-sum (+ area-sum
                      (paper-area-dimension
                       (dimension line))))))

(print area-sum)