Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- (defn calc-dist [[x y] [a b]]
- (+ (abs (- x a)) (abs (- y b))))
- (defn manhattan-spread [[[sensorx sensory :as sensor] beacon] line]
- (let [width (- (calc-dist sensor beacon) (abs (- line sensory)))]
- (if
- (neg? width) []
- [(- sensorx width) (+ sensorx width)])))
- (defn calc-uncovered [[a b] [c d]]
- (cond
- (< b c) (+ 1 (- d c))
- (= b c) (- d c)
- (< b d) (- d b)
- :else 0))
- (defn find-total [y pairs]
- (reduce
- (fn [[total old undetected] spread]
- (let [increase (calc-uncovered (peek old) spread)]
- [(+ total increase) (if (zero? increase) old (conj old spread))]))
- [0 [[Long/MIN_VALUE Long/MIN_VALUE]]]
- (->> pairs
- (map #(manhattan-spread % y))
- (remove empty?)
- (sort-by first))))
- (defn find-spots [y pairs coords]
- (- (first (find-total y pairs)) (->> coords (map second) (filter #(= y %)) count)))
- (defn find-gaps [y pairs minx maxx] (let [covers (second (find-total y pairs))]
- (reduce
- (fn [[res [a b :as latest]] [c d :as current]]
- (cond
- res [res current]
- (and (>= b minx) (<= c maxx) (< b (dec c))) [[(inc b) y] current]
- :else [nil current]))
- [nil (first covers)]
- (rest covers))))
- (with-open [rdr (clojure.java.io/reader "sensors.in")]
- (let [
- coords (->> rdr
- line-seq
- (map #(clojure.string/split % #"="))
- flatten
- (map #(clojure.string/split % #" "))
- flatten
- (map #(clojure.string/replace % #"[^0-9-]" ""))
- (remove clojure.string/blank?)
- (map #(Integer/parseInt %))
- (partition 2))
- pairs (partition 2 coords)
- coords (set (map vec coords))]
- (println (find-spots 2000000 pairs coords))
- (->>
- (range 4000000)
- (map #(find-gaps % pairs 0 4000000))
- (map first)
- (filter some?)
- first
- ((fn [[x y]] (+ y (* 4000000 x))))
- println)
- ))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement