# HG changeset patch # User Steve Losh # Date 1576202888 18000 # Node ID 8b272a80df179dc42d273a9e2618118fa3fede7d # Parent 32db20d16280cac991a4bc3af5fc404ee7a299b1 Ugh diff -r 32db20d16280 -r 8b272a80df17 src/2016/days/day-09.lisp --- a/src/2016/days/day-09.lisp Thu Dec 12 19:31:55 2019 -0500 +++ b/src/2016/days/day-09.lisp Thu Dec 12 21:08:08 2019 -0500 @@ -50,3 +50,63 @@ #; Scratch -------------------------------------------------------------------- + +(defun .letter () + (smug:.is #'alpha-char-p)) + +(defun .digit () + (smug:.is #'digit-char-p)) + +(defun .number () + (smug:.let* ((s (smug:.map 'string (.digit)))) + (smug:.identity (parse-integer s)))) + +(defun .header-guts () + (smug:.let* ((length (.number)) + (_ (smug:.char= #\x)) + (repetitions (.number))) + (smug:.identity (cons length repetitions)))) + +(defun .header () + (smug:.prog2 (smug:.char= #\left_parenthesis) + (.header-guts) + (smug:.char= #\right_parenthesis))) + +(defun .raw% (n) + (if (zerop n) + (smug:.identity nil) + (smug:.let* ((x (smug:.item)) + (more (.raw (1- n)))) + (smug:.identity (cons x more))))) + +(defun .raw (n &key (result-type 'list)) + (smug:.let* ((result (.raw% n))) + (smug:.identity (coerce result result-type)))) + +(defun .v1-compressed-chunk () + (smug:.let* ((header (.header)) + (contents (.raw (car header) :result-type 'string))) + (smug:.identity (vector (cdr header) contents)))) + +(defun .data () + (smug:.map 'string (.letter))) + +(defun .v1 () + (smug:.first + (smug:.map 'list (smug:.or (.v1-compressed-chunk) + (.data))))) + +(defun v1 (data) + (smug:parse (.v1) data)) + +(v1 "(10x2)(3x1)abcdefghijklmno") + +(defun v2 (data) + (recursively ((tree (v1 data))) + (etypecase tree + (list (mapcar #'recur tree)) + (string tree) + (vector (vector (aref tree 0) + (recur (v1 (aref tree 1)))))))) + +(v2 "(10x2)(3x1)abcdefghijkl(2x10)mno")