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