Advertisement
Guest User

AOC 2023 Day 2 (Common Lisp)

a guest
Dec 4th, 2023
138
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lisp 2.96 KB | None | 0 0
  1. (unless (find-package :cl-ppcre)
  2.   (ql:quickload "cl-ppcre"))
  3.  
  4. (defparameter *red-max*   12)
  5. (defparameter *green-max* 13)
  6. (defparameter *blue-max*  14)
  7.  
  8. (defun colour-totals (colour-list)
  9.   "Return a p-list of different 'hands' of colour cubes"
  10.   (let ((red '())
  11.         (blue '())
  12.         (green '()))
  13.     (dolist (item colour-list (list :red red :blue blue :green green))
  14.       (cond ((string= (second item) "red") (push (parse-integer (first item)) red))
  15.             ((string= (second item) "green") (push (parse-integer (first item)) green))
  16.             ((string= (second item) "blue") (push (parse-integer (first item)) blue))))))
  17.  
  18. (defun make-game-list (str)
  19.   (let ((game-num (multiple-value-bind (s match) (cl-ppcre:scan-to-strings "Game (\\d+):" str)
  20.                     (aref match 0)))
  21.         (colours (cl-ppcre:all-matches-as-strings "(\\d+)\\s(blue|green|red)" str))
  22.         (colour-list '())
  23.         (game-list '()))
  24.     (dolist (item colours)
  25.       (push (cl-ppcre:split "\\s" item) colour-list))
  26.     (setf game-list (colour-totals colour-list))
  27.     (setf (getf game-list :game) (parse-integer game-num))
  28.     game-list))
  29.  
  30. (defun extract-game-info-from-file (filename)
  31.   "Extract game number and totals of each colour cube"
  32.   (let ((result '()))
  33.     (with-open-file (stream filename)
  34.       (loop for line = (read-line stream nil)
  35.             while line do (push (make-game-list line) result)) )
  36.     result))
  37.  
  38.  
  39. (defun greater-than-limit (lst limit)
  40.   "Check if any value in a list is greater than a limit"
  41.   (some #'(lambda (val)
  42.             (> val limit))
  43.         lst))
  44.  
  45. (defun remove-impossible-games (games)
  46.   "Make a new list of games that are possible given max constraints above"
  47.   (remove-if #'(lambda (game)
  48.                  (or (greater-than-limit (getf game :red) *red-max*)
  49.                      (greater-than-limit (getf game :blue) *blue-max*)
  50.                      (greater-than-limit (getf game :green) *green-max*)))
  51.              games))
  52.  
  53. (defparameter *input* (extract-game-info-from-file "./input.txt"))
  54. ; (defparameter *input* (extract-game-info-from-file "./example1.txt"))
  55. ; (defparameter *input* (extract-game-info-from-file "./example2.txt"))
  56.  
  57. (defun solve-a (games)
  58.   ;; Example 1 answer: 8
  59.   (let ((answer 0))
  60.     (dolist (game (remove-impossible-games games) answer)
  61.       (incf answer (getf game :game)))))
  62.  
  63. (defun get-game-power (game)
  64.   (let ((fewest-red (reduce #'max (getf game :red)))
  65.         (fewest-blue (reduce #'max (getf game :blue)))
  66.         (fewest-green (reduce #'max (getf game :green))))
  67.     (* fewest-red fewest-blue fewest-green)))
  68.  
  69. (defun solve-b (games)
  70.   ;; Example 2 answer: 2286
  71.   (let ((list-of-powers '()))
  72.     (dolist (game games list-of-powers)
  73.       (push (get-game-power game) list-of-powers))
  74.     (reduce #'+ list-of-powers)))
  75.  
  76. (defun solutions ()
  77.   (format t "Part 1: ~A~%" (solve-a *input*))   ; My answer: 2207
  78.   (format t "Part 2: ~A~%" (solve-b *input*)))  ; My answer: 62241
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement