73 lines
2.2 KiB
Common Lisp
73 lines
2.2 KiB
Common Lisp
(require :uiop)
|
|
|
|
(defun input-string () (string-trim '(#\newline) (uiop:read-file-string "../../../data/2015/2/input.txt")))
|
|
|
|
(defun input-string-list () (uiop:split-string (input-string) :separator (list #\linefeed)))
|
|
|
|
(defun string-to-dimension-list (string)
|
|
(mapcar #'parse-integer
|
|
(uiop:split-string string :separator (list #\x))))
|
|
|
|
(defun dimension-list-to-surface-area (dimension-list)
|
|
(let ((length (first dimension-list))
|
|
(width (second dimension-list))
|
|
(height (third dimension-list)))
|
|
(+ (* 2 length width) (* 2 length height) (* 2 width height))))
|
|
|
|
(defun dimension-list-to-slack (dimension-list)
|
|
(let ((length (first dimension-list))
|
|
(width (second dimension-list))
|
|
(height (third dimension-list)))
|
|
(let ((top (* length width))
|
|
(front (* width height))
|
|
(side (* length height)))
|
|
(min top front side))))
|
|
|
|
(defun dimension-list-to-bow (dimension-list)
|
|
(let ((length (first dimension-list))
|
|
(width (second dimension-list))
|
|
(height (third dimension-list)))
|
|
(* length width height)))
|
|
|
|
(defun dimension-list-to-wrap-ribbon (dimension-list)
|
|
(let ((length (first dimension-list))
|
|
(width (second dimension-list))
|
|
(height (third dimension-list)))
|
|
(let ((top-perim (* 2 (+ length width)))
|
|
(front-perim (* 2 (+ width height)))
|
|
(side-perim (* 2 (+ length height))))
|
|
(min top-perim front-perim side-perim))))
|
|
|
|
(defun dimension-list-to-ribbon (dimension-list)
|
|
(+ (dimension-list-to-wrap-ribbon dimension-list) (dimension-list-to-bow dimension-list)))
|
|
|
|
(defun dimension-list-to-paper (dimension-list)
|
|
(+ (dimension-list-to-surface-area dimension-list) (dimension-list-to-slack dimension-list)))
|
|
|
|
(defun string-to-paper (string)
|
|
(dimension-list-to-paper (string-to-dimension-list string)))
|
|
|
|
(defun string-to-ribbon (string)
|
|
(dimension-list-to-ribbon (string-to-dimension-list string)))
|
|
|
|
(defun part-1 ()
|
|
(reduce (lambda (sfp string)
|
|
(+ (string-to-paper string) sfp))
|
|
(input-string-list)
|
|
:initial-value 0))
|
|
|
|
(defun part-2 ()
|
|
(reduce (lambda (sfp string)
|
|
(+ (string-to-ribbon string) sfp))
|
|
(input-string-list)
|
|
:initial-value 0))
|
|
|
|
(defun solution ()
|
|
(format t "Part 1: ~a" (part-1))
|
|
(terpri)
|
|
(format t "Part 2: ~a" (part-2))
|
|
(terpri))
|
|
|
|
(solution)
|
|
|