day25.lisp (1222B)
1 (defpackage #:adventofcode2022/day25 2 (:use #:cl #:adventofcode2022)) 3 (in-package #:adventofcode2022/day25) 4 5 (defun parse-snafu (string) 6 (loop with n = 0 7 for digit across (reverse string) 8 for m = 1 then (* m 5) 9 do (incf n (* m (case digit 10 (#\2 2) 11 (#\1 1) 12 (#\- -1) 13 (#\= -2) 14 (otherwise 0)))) 15 finally (return n))) 16 17 (defun %format-snafu (number) 18 (when (zerop number) 19 (return-from %format-snafu nil)) 20 (let* ((m (mod number 5)) 21 (l (case m 22 (3 #\=) 23 (4 #\-) 24 (otherwise (code-char (+ m 48))))) 25 (r (cond 26 ((or (= m 0)) 27 (%format-snafu (/ number 5))) 28 ((or (= m 1) (= m 2)) 29 (%format-snafu (floor number 5))) 30 ((or (= m 3) (= m 4)) 31 (%format-snafu (floor (+ number 2) 5)))))) 32 (cons l r))) 33 34 (defun format-snafu (number) 35 (coerce (reverse (%format-snafu number)) 'string)) 36 37 (defun task1 (inputs) 38 (format-snafu 39 (loop for input in inputs 40 sum (parse-snafu input)))) 41 42 (define-day 25 43 () 44 #'task1 45 nil)