# HG changeset patch # User Steve Losh # Date 1543701600 18000 # Node ID 0a6b6dba8b90d46f8b34deef3db9d082eb0675c2 # Parent d3799236a70dad6a698f61f10cca5b8d520b778a 2017-7/1 diff -r d3799236a70d -r 0a6b6dba8b90 advent.asd --- a/advent.asd Sat Dec 01 16:59:43 2018 -0500 +++ b/advent.asd Sat Dec 01 17:00:00 2018 -0500 @@ -5,7 +5,17 @@ :license "MIT" - :depends-on (:iterate :losh :split-sequence :str) + :depends-on ( + + :cl-digraph + :cl-digraph.dot + :cl-ppcre + :iterate + :losh + :split-sequence + :str + + ) :serial t :components ((:module "vendor" :serial t diff -r d3799236a70d -r 0a6b6dba8b90 src/2017/main.lisp --- a/src/2017/main.lisp Sat Dec 01 16:59:43 2018 -0500 +++ b/src/2017/main.lisp Sat Dec 01 17:00:00 2018 -0500 @@ -1,4 +1,5 @@ (in-package :advent) +(named-readtables:in-readtable :interpol-syntax) (define-problem (2017 1 1) (data read-file-of-digits) @@ -126,3 +127,29 @@ (for last-seen = (gethash banks seen)) (until last-seen) (finally (return (values cycle (- cycle last-seen)))))))) + + +(define-problem (2017 7) (data read-lines-from-file) + (labels + ((parse-line (line) + (ppcre:register-groups-bind + (name (#'parse-integer weight) ((curry #'str:split ", ") holding)) + (#?/(\w+) \((\d+)\)(?: -> (.+))?/ + line) + (values name weight holding))) + (insert-edge (digraph pred succ) + (digraph:insert-vertex digraph pred) + (digraph:insert-vertex digraph succ) + (digraph:insert-edge digraph pred succ)) + (build-tower (lines) + (iterate + (with tower = (digraph:make-digraph :test #'equal)) + (for line :in lines) + (for (values name weight holding) = (parse-line line)) + (collect-hash (name weight) :into weights :test #'equal) + (digraph:insert-vertex tower name) + (map nil (curry #'insert-edge tower name) holding) + (finally (return tower))))) + (let ((tower (build-tower data))) + ;; (digraph.dot:draw tower) + (first (digraph:roots tower))))) diff -r d3799236a70d -r 0a6b6dba8b90 src/utils.lisp --- a/src/utils.lisp Sat Dec 01 16:59:43 2018 -0500 +++ b/src/utils.lisp Sat Dec 01 17:00:00 2018 -0500 @@ -18,6 +18,11 @@ (with-open-file (s path) (read s))) +(defun read-lines-from-file (path) + "Read the lines in `path` into a list of strings." + (iterate (for line :in-file path :using #'read-line) + (collect line))) + (defun read-file-of-digits (path) "Read all the ASCII digits in `path` into a list of integers.