--- 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
--- 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)))))
--- 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.