Compare commits

..

2 Commits

Author SHA1 Message Date
37c2786336 spacing 2025-12-08 22:16:53 -10:00
bcffe4e5bf golf 2025-12-08 22:14:19 -10:00

View File

@ -21,30 +21,31 @@
last last
(apply area)) (apply area))
;; wikipedia maths
(defn normalize [x] (min 1 (max -1 x))) (defn normalize [x] (min 1 (max -1 x)))
(defn orientation (defn orientation
"returns a value indicating if point A is to the left or right (or on) BC" "returns a value indicating if point A is to the left, right, or on the line BC"
[[ax ay] [bx by] [cx cy]] [[ax ay] [bx by] [cx cy]]
(normalize (- (* (- by ay) (- cx bx)) (normalize (- (* (- by ay) (- cx bx))
(* (- bx ax) (- cy by))))) (* (- bx ax) (- cy by)))))
(defn intersect? [[ax ay] [bx by]] (defn intersect?
(let [o1 (orientation ax ay bx) "Lines AB and CD intersect if points A and B falls on different sides of CD
o2 (orientation ax ay by) and if C and D fall on different sides of AB"
o3 (orientation bx by ax) [[a b] [c d]]
o4 (orientation bx by ay)] (let [o1 (orientation a b c)
o2 (orientation a b d)
o3 (orientation c d a)
o4 (orientation c d b)]
(and (not= o1 o2) (not= o3 o4)))) (and (not= o1 o2) (not= o3 o4))))
;; part 2 ;; part 2
(def line-segments (map vector input (conj (vec (rest input)) (first input)))) (def line-segments (map vector input (conj (vec (rest input)) (first input))))
(->> furthest-points (->> furthest-points
(filter (fn [[a b]] (filter (fn [[a b]]
(let [segments (filter (fn [[seg-a seg-b]] (let [segments (filter (fn [[seg-a seg-b]] (and (not= a seg-a)
(and (not= a seg-a) (not= a seg-b)
(not= a seg-b) (not= b seg-a)
(not= b seg-a) (not= b seg-b)))
(not= b seg-b)))
line-segments) line-segments)
[[cx cy] [dx dy]] [a b]] [[cx cy] [dx dy]] [a b]]
(and (not (some #(intersect? [a b] %) segments)) (and (not (some #(intersect? [a b] %) segments))