-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathday13.clj
47 lines (39 loc) · 1.08 KB
/
day13.clj
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
(ns adventofcode2017.day13
(:require [clojure.string :as str]
[clojure.java.io :as io]))
(def input (slurp (io/resource "2017/day13")))
;(def input "0: 3\n1: 2\n4: 4\n6: 4")
(def data (->> (str/split-lines input)
(map #(let [[depth range] (str/split % #": ")]
[(read-string depth) (read-string range)]))
(into {})))
(def last-layer (apply max (keys data)))
(defn scanner-pos [depth step]
(if-let [range (some-> (data depth) dec)]
(if (even? (long (/ step range)))
(rem step range)
(- range (rem step range)))
-1))
;; part 1
(def caught-layers
(reduce (fn [caught layer]
(if (zero? (scanner-pos layer layer))
(conj caught layer)
caught))
[]
(range (inc last-layer))))
(->> caught-layers
(map #(* % (data %)))
(apply +))
; 1844
;; part 2
(loop [delay 1
layer 0]
(cond
(> layer last-layer)
delay
(zero? (scanner-pos layer (+ delay layer)))
(recur (inc delay) 0)
:else
(recur delay (inc layer))))
; 3897604