-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathday13.lisp
More file actions
48 lines (42 loc) · 1.29 KB
/
day13.lisp
File metadata and controls
48 lines (42 loc) · 1.29 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
(defpackage :aoc/2017/13 #.cl-user::*aoc-use*)
(in-package :aoc/2017/13)
(defstruct layer
depth
range
curr
dir)
(defun parse-layers (x)
(flet ((parse-layer (s)
(let* ((splits (split-sequence:split-sequence #\Space s))
(depth (parse-integer (first splits) :junk-allowed T))
(range (parse-integer (second splits))))
(make-layer :depth depth
:range range
:curr 0
:dir +1))))
(mapcar #'parse-layer x)))
(defun trip-severity (layers)
(loop
:for layer :in layers
:for depth = (layer-depth layer)
:for time-to-layer = depth
:for range = (layer-range layer)
:for period = (* (1- range) 2)
:when (dividesp period time-to-layer)
:sum (* depth range)))
(defun caughtp (layers delay)
(loop
:for layer :in layers
:for depth = (layer-depth layer)
:for time-to-layer = (+ delay depth)
:for range = (layer-range layer)
:for period = (* (1- range) 2)
:thereis (dividesp period time-to-layer)))
(define-solution (2017 13) (data parse-layers)
(values
(trip-severity data)
(loop
:for delay = 1 :then (1+ delay)
:unless (caughtp data delay)
:do (return delay))))
(define-test (2017 13) (2508 3913186))