Advertisement
luorduz

advent-22-15

Dec 15th, 2022 (edited)
511
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Clojure 1.98 KB | Source Code | 0 0
  1. (defn calc-dist [[x y] [a b]]
  2.   (+ (abs (- x a)) (abs (- y b))))
  3.  
  4. (defn manhattan-spread [[[sensorx sensory :as sensor] beacon] line]
  5.   (let [width (- (calc-dist sensor beacon) (abs (- line sensory)))]
  6.     (if
  7.       (neg? width) []
  8.       [(- sensorx width) (+ sensorx width)])))
  9.  
  10. (defn calc-uncovered [[a b] [c d]]
  11.   (cond
  12.     (< b c) (+ 1 (- d c))
  13.     (= b c) (- d c)
  14.     (< b d) (- d b)
  15.     :else 0))
  16.  
  17. (defn find-total [y pairs]
  18.   (reduce
  19.     (fn [[total old undetected] spread]
  20.       (let [increase (calc-uncovered (peek old) spread)]
  21.         [(+ total increase) (if (zero? increase) old (conj old spread))]))
  22.     [0 [[Long/MIN_VALUE Long/MIN_VALUE]]]
  23.     (->> pairs
  24.          (map #(manhattan-spread % y))
  25.          (remove empty?)
  26.          (sort-by first))))
  27.  
  28. (defn find-spots [y pairs coords]
  29.   (- (first (find-total y pairs)) (->> coords (map second) (filter #(= y %)) count)))
  30.  
  31. (defn find-gaps [y pairs minx maxx] (let [covers (second (find-total y pairs))]
  32.   (reduce
  33.     (fn [[res [a b :as latest]] [c d :as current]]
  34.       (cond
  35.         res [res current]
  36.         (and (>= b minx) (<= c maxx) (< b (dec c))) [[(inc b) y] current]
  37.         :else [nil current]))
  38.     [nil (first covers)]
  39.     (rest covers))))
  40.  
  41. (with-open [rdr (clojure.java.io/reader "sensors.in")]
  42.   (let [
  43.     coords (->> rdr
  44.                 line-seq
  45.                 (map #(clojure.string/split % #"="))
  46.                 flatten
  47.                 (map #(clojure.string/split % #" "))
  48.                 flatten
  49.                 (map #(clojure.string/replace % #"[^0-9-]" ""))
  50.                 (remove clojure.string/blank?)
  51.                 (map #(Integer/parseInt %))
  52.                 (partition 2))
  53.     pairs (partition 2 coords)
  54.     coords (set (map vec coords))]
  55.     (println (find-spots 2000000 pairs coords))
  56.     (->>
  57.       (range 4000000)
  58.       (map #(find-gaps % pairs 0 4000000))
  59.       (map first)
  60.       (filter some?)
  61.       first
  62.       ((fn [[x y]] (+ y (* 4000000 x))))
  63.       println)
  64. ))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement