aoc_omni/common_lisp/2015/2/problem.lisp

73 lines
2.2 KiB
Common Lisp
Raw Permalink Normal View History

2025-04-21 20:06:43 -04:00
(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)