src/2017/days/day-16.lisp @ e41337e3b59b

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

(defparameter *initial* "abcdefghijklmnop")

(defun spin (dancers n)
  (alexandria:rotate dancers n))

(defun exchange (dancers i j)
  (rotatef (aref dancers i)
           (aref dancers j)))

(defun partner (dancers a b)
  (rotatef (aref dancers (position a dancers))
           (aref dancers (position b dancers))))

(defun dance (dancers steps &key (repeat 1))
  (do-repeat repeat
    (iterate
      (for step :in steps)
      (ecase (char step 0)
        (#\s (spin dancers (parse-integer step :start 1)))
        (#\x (destructuring-bind (i j) (read-numbers-from-string step)
               (exchange dancers i j)))
        (#\p (partner dancers (char step 1) (char step 3))))))
  dancers)

(defun find-cycle (steps)
  (iterate
    (with dancers = (copy-seq *initial*))
    (dance dancers steps)
    (counting t)
    (until (string= dancers *initial*))))

(define-problem (2017 16) (data read-comma-separated-values)
    ("ionlbkfeajgdmphc" "fdnphiegakolcmjb")
  (values
    (dance (copy-seq *initial*) data)
    (dance (copy-seq *initial*) data :repeat (mod 1000000000 (find-cycle data)))))