(def mizu (waters) (let index (indexing waters) (if (is index nil) nil (with (lcr '((2 -1 -1) (-1 2 -1) (-1 -1 2)) n1 (index 0) n2 (index 1) aw (index 2)) ((rfn lp (w step) ; (prn w) (if (is (w n1) (w n2) 0) step (is (w n1) 0) (lp (map + (lcr n1) w) (+ step 1)) (< (w aw) (/ (- (w n2) (w n1)) 3)) (lp (map + (lcr aw) w) (+ step 1)) (isnt (w n2) (w n1)) (lp (map + (lcr n1) w) (+ step 1)) (lp (map + (lcr aw) w) (+ step 1)))) waters 0))))) (def indexing (ls) (withs (mm (map [pos _ ls] (sort < ls)) min (ls (mm 0)) mid (ls (mm 1)) max (ls (mm 2))) (if (is 0 (mod (- mid min) 3)) (list (mm 0) (mm 1) (mm 2)) (is 0 (mod (- max min) 3)) (list (mm 0) (mm 2) (mm 1)) (is 0 (mod (- max mid) 3)) (list (mm 1) (mm 2) (mm 0)) nil)))