(import enum [Enum]) (defclass Direction [Enum] (setv UP "UP") (setv DOWN "DOWN") (setv LEFT "LEFT") (setv RIGHT "RIGHT") (defn [staticmethod] from-move [move] #((.x-from-move Direction move) (.y-from-move Direction move))) (defn [staticmethod] x-from-move [move] (if (>= (get move 0) 0) Direction.RIGHT Direction.LEFT)) (defn [staticmethod] y-from-move [move] (if (>= (get move 0) 0) Direction.DOWN Direction.UP)) (defn [staticmethod] x-between-points [point1 point2] (let [delta-x (abs (- (get point1 0) (get point2 0)))] (if (>= delta-x 0) Direction.RIGHT Direction.LEFT)))) (defn neg [value] (* -1 value)) (defn invert [move] #((neg (get move 0)) (neg (get move 1)))) (defn merge-moves [moves] (let [end-move #(0 0)] (for [move moves] (setv end-move #((+ (get end-move 0) (get move 0)) (+ (get end-move 1) (get move 1))))) end-move)) (defn sub-points [point1 point2] #((- (get point2 0) (get point1 0)) (- (get point2 1) (get point2 1))))