56 lines
1.2 KiB
Clojure
56 lines
1.2 KiB
Clojure
(ns day2
|
|
(:require [clojure.string :as s]))
|
|
|
|
(defn line->vec [steps]
|
|
(->>
|
|
(re-seq #"\d+" steps)
|
|
(mapv parse-long)))
|
|
|
|
(def input
|
|
(->> "inputs/day2"
|
|
slurp
|
|
s/split-lines
|
|
(map line->vec)))
|
|
|
|
(defn diff [steps]
|
|
(->>
|
|
(partition 2 1 steps)
|
|
(map (partial apply -))))
|
|
|
|
(defn safe? [steps]
|
|
(let [diffs (diff steps)
|
|
sign (pos? (first diffs))]
|
|
(loop [diffs diffs]
|
|
(if (empty? diffs)
|
|
true
|
|
(if (zero? (first diffs))
|
|
false
|
|
(if-not (= sign (pos? (first diffs)))
|
|
false
|
|
(if (> (abs (first diffs)) 3)
|
|
false
|
|
(recur (rest diffs)))))))))
|
|
|
|
(defn cut-nth [steps n]
|
|
(concat (subvec steps 0 n)
|
|
(subvec steps (inc n))))
|
|
|
|
(defn safe?-2 [steps]
|
|
(if (safe? steps)
|
|
true
|
|
(not-empty
|
|
(for [i (range (count steps))
|
|
:let [safe (safe? (cut-nth steps i))]
|
|
:when (true? safe)]
|
|
safe))))
|
|
|
|
(println "Number of safe reports:"
|
|
(->> (map safe? input)
|
|
(filter true?)
|
|
count))
|
|
|
|
(println "Number of safe reports (part 2):"
|
|
(->> (map safe?-2 input)
|
|
(remove nil?)
|
|
count))
|