src/2017/day-09.lisp @ 908a77e311fa

2017/09
author Steve Losh <steve@stevelosh.com>
date Sun, 01 Dec 2019 16:01:05 -0500
parents (none)
children (none)
(defpackage :advent/2017/09 #.cl-user::*advent-use*)
(in-package :advent/2017/09)

(define-problem (2017 9) (stream) (15922 7314)
  (let ((garbage-total 0))
    (labels ((read-garbage-char ()
               (if (eql #\! (peek-char nil stream))
                 (progn (read-char stream)
                        (read-char stream))
                 (progn (incf garbage-total)
                        (read-char stream))))
             (read-garbage ()
               (read-char stream) ; <
               (iterate
                 (until (eql #\> (peek-char nil stream)))
                 (read-garbage-char))
               (read-char stream) ; >
               'garbage)
             (read-group ()
               (read-char stream) ; {
               (prog1 (read-group-contents)
                 (read-char stream))) ; }
             (read-group-contents (&aux result)
               (iterate
                 (case (peek-char nil stream)
                   (#\, (read-char stream))
                   (#\} (return (nreverse result)))
                   (#\{ (push (read-group) result))
                   (#\< (read-garbage))))))
      (values
        (recursively ((group (read-group))
                      (score 1))
          (+ score (loop :for g :in group :summing (recur g (1+ score)))))
        garbage-total))))