src/2021/days/day-06.lisp @ e41337e3b59b

Accessors
author Steve Losh <steve@stevelosh.com>
date Wed, 15 Dec 2021 23:10:57 -0500
parents b8ca529c9228
children (none)
(advent:defpackage* :advent/2021/06)
(in-package :advent/2021/06)

(defun parse (stream)
  (mapcar #'parse-integer (str:split #\, (alexandria:read-stream-content-into-string stream))))

(defun simulate (data days)
  (let ((curr (make-array 9 :initial-element 0))
        (next (make-array 9)))
    (dolist (fish data)
      (incf (aref curr fish)))
    (do-repeat days
      (loop :for i :from 8 :downto 0
            :for n = (aref curr i)
            :do (if (zerop i)
                  (progn (setf (aref next 8) n)
                         ;; downto is important to make sure 6 is already set
                         (incf (aref next 6) n))
                  (setf (aref next (1- i)) n)))
      (rotatef curr next))
    curr))

(define-problem (2021 6) (data read-comma-separated-integers)
    (371379 1674303997472)
  (values
    (summation (simulate data 80))
    (summation (simulate data 256))))


#; Scratch --------------------------------------------------------------------