diff --git a/common_lisp/2015/2/problem.lisp b/common_lisp/2015/2/problem.lisp new file mode 100644 index 0000000..572be93 --- /dev/null +++ b/common_lisp/2015/2/problem.lisp @@ -0,0 +1,72 @@ +(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) +