solved day 7 of 2018
This commit is contained in:
parent
f3ceb796b6
commit
7164df2132
3 changed files with 133 additions and 8 deletions
|
@ -1,5 +1,10 @@
|
|||
(defpackage :aoc/2018/07
|
||||
(:use :cl :aoc :alexandria :queues))
|
||||
(:use :cl :aoc :alexandria :queues)
|
||||
(:export
|
||||
#:sample-data
|
||||
#:part1
|
||||
#:step-time
|
||||
))
|
||||
(in-package :aoc/2018/07)
|
||||
|
||||
(defparameter sample-input
|
||||
|
@ -37,14 +42,91 @@ Step F must be finished before step E can begin."))
|
|||
if (not (member p produced))
|
||||
collect p))))
|
||||
|
||||
(defun available-steps (done dependencies)
|
||||
(remove-if
|
||||
(lambda (x) (member x done))
|
||||
(append
|
||||
(steps-without-dependencies dependencies)
|
||||
(loop for dep in dependencies
|
||||
if (and
|
||||
(member (first dep) done)
|
||||
(prerequisites-availablep done (second dep) dependencies))
|
||||
collect (second dep)))))
|
||||
|
||||
(defun next-step (done dependencies)
|
||||
(let ((available (available-steps done dependencies)))
|
||||
(first (sort available #'string-lessp))))
|
||||
|
||||
(defun assembly-order (dependencies &optional (done '()))
|
||||
(let ((next (next-step done dependencies)))
|
||||
(if (not next)
|
||||
(reverse done)
|
||||
(assembly-order dependencies (push next done)))))
|
||||
|
||||
(defun part1 (&optional (data input-data))
|
||||
(format nil "~{~A~}" (assembly-order data)))
|
||||
|
||||
;;; -------------------------------------------------------------------
|
||||
|
||||
(defun step-time (step &optional (offset 60))
|
||||
(+ offset (mod (char-code (character step)) 32)))
|
||||
|
||||
(defun available-timed-steps (time done dependencies &optional (offset 60))
|
||||
(map 'list
|
||||
(lambda (s) (list (+ time (step-time s offset)) s))
|
||||
(available-steps (map 'list #'second done) dependencies)))
|
||||
|
||||
(defun timed-step-lessp (a b)
|
||||
(cond
|
||||
((eq (first a) (first b)) (string-lessp (second a) (second b)))
|
||||
(t (< (first a) (first b)))))
|
||||
|
||||
(defun merge-timed-steps (steps add workers)
|
||||
(let ((new-steps steps))
|
||||
(loop for ev in (sort add #'timed-step-lessp)
|
||||
while (< (length new-steps) workers)
|
||||
if (not (member (second ev) (mapcar #'second new-steps)))
|
||||
do (setf new-steps (push ev new-steps)))
|
||||
(sort new-steps #'timed-step-lessp)))
|
||||
|
||||
(defun assembly-order-timed (dependencies &key (time 0) (done '()) (todo '()) (offset 60) (workers 5))
|
||||
|
||||
;; done is a sorted list of (ts step) pairs
|
||||
|
||||
(format t "todo: ~A with ~A at ~A~%" todo done time)
|
||||
(cond
|
||||
((and (not done) (not todo))
|
||||
(assembly-order-timed dependencies
|
||||
:time time
|
||||
:done done
|
||||
:todo (available-timed-steps time done dependencies offset)
|
||||
:offset offset
|
||||
:workers workers))
|
||||
((and done (not todo))
|
||||
(progn
|
||||
(format t "we're done : ~A~%" done)
|
||||
done))
|
||||
(t
|
||||
(let* ((next-done (append done (remove-if (lambda (x) (< time (first x))) todo)))
|
||||
(next-todo (merge-timed-steps
|
||||
(remove-if (lambda (x) (>= time (first x))) todo)
|
||||
(available-timed-steps time next-done dependencies offset)
|
||||
workers)))
|
||||
(format t "next todo: ~A, done: ~A ~%" next-todo next-done)
|
||||
(let* ((next-step (first next-todo))
|
||||
(nt (first next-step)))
|
||||
(format t "~A~%" next-todo)
|
||||
(assembly-order-timed
|
||||
dependencies
|
||||
:time nt
|
||||
:done next-done
|
||||
:todo next-todo
|
||||
:offset offset
|
||||
:workers workers))))))
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
(defun part2 ()
|
||||
(let ((finish (first (first (last (assembly-order-timed input-data))))))
|
||||
(format nil "~A" finish)))
|
||||
|
||||
|
||||
|
|
|
@ -3,6 +3,8 @@
|
|||
(:export
|
||||
#:split-lines
|
||||
#:test-input
|
||||
#:submit-part1
|
||||
#:submit-part2
|
||||
#:clear-data-cache))
|
||||
|
||||
(in-package :aoc)
|
||||
|
@ -49,6 +51,22 @@
|
|||
(split-lines body))))
|
||||
|
||||
|
||||
(defun submit-answer (year day level answer)
|
||||
(let ((url (format nil "~A/~D/day/~D/answer" *aoc-url* year day)))
|
||||
(multiple-value-bind
|
||||
(body)
|
||||
(dex:post url :cookie-jar *cookie-jar* :verbose t
|
||||
:content `(("level" . ,level)
|
||||
("answer" . ,answer)
|
||||
("submit" . "[Submit]")))
|
||||
body)))
|
||||
|
||||
(defun submit-part1 (year day answer)
|
||||
(submit-answer year day "1" answer))
|
||||
|
||||
(defun submit-part2 (year day answer)
|
||||
(submit-answer year day "2" answer))
|
||||
|
||||
(defvar *input-data-cache* (make-hash-table))
|
||||
|
||||
(defun clear-data-cache ()
|
||||
|
|
25
tests/2018/day07-test.lisp
Normal file
25
tests/2018/day07-test.lisp
Normal file
|
@ -0,0 +1,25 @@
|
|||
|
||||
(defpackage :aoc/2018/07/tests
|
||||
(:use :cl :aoc :aoc/tests :parachute :aoc/2018/07)
|
||||
(:export
|
||||
#:suite-2018-07
|
||||
#:test-part1
|
||||
#:test-step-size
|
||||
))
|
||||
|
||||
(in-package :aoc/2018/07/tests)
|
||||
|
||||
(define-test suite-2018-07
|
||||
;:parent suite-2018
|
||||
)
|
||||
|
||||
|
||||
(define-test test-part1
|
||||
:parent suite-2018-07
|
||||
(true (equal "CABDFE" (part1 sample-data))))
|
||||
|
||||
(define-test test-step-size
|
||||
:parent suite-2018-07
|
||||
(true (equal 63 (step-time 'C)))
|
||||
(true (equal 3 (step-time 'C 0)))
|
||||
)
|
Loading…
Reference in a new issue