adventofcode2022

My solutions for Advent of Code 2022
Log | Files | Refs

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)