36 lines
998 B
Common Lisp
36 lines
998 B
Common Lisp
;; // https://adventofcode.com/2022/day/21
|
|
(defpackage :day-21
|
|
(:use :cl))
|
|
(in-package :day-21)
|
|
|
|
(ql:quickload 'cl-ppcre)
|
|
|
|
(defun parse-integer-or-symbol (str)
|
|
(let ((maybe-int (parse-integer str :junk-allowed t)))
|
|
(if maybe-int
|
|
maybe-int
|
|
(intern (string-upcase str)))))
|
|
|
|
|
|
(defun line-to-quoted-operation (line)
|
|
(let* ((words (ppcre:split " " (ppcre:regex-replace ":" line "")))
|
|
(symbols (mapcar #'parse-integer-or-symbol words)))
|
|
(cond
|
|
((= 4 (length symbols))
|
|
;; with operation
|
|
(destructuring-bind (name operand1 op operand2)
|
|
symbols
|
|
`(defparameter ,name '(,op (eval ,operand1) (eval ,operand2)))))
|
|
|
|
((= 2 (length symbols))
|
|
;; just number
|
|
(destructuring-bind (name value)
|
|
symbols
|
|
`(defparameter ,name ,value))))))
|
|
|
|
(defun load-file-defs (filename)
|
|
(loop
|
|
for line in (uiop:read-file-lines filename)
|
|
for definition = (line-to-quoted-operation line)
|
|
do (eval definition)))
|