;;; Copyright (C) 2025 Gene Pasquet ;;; ;;; This program is free software: you can redistribute it and/or modify ;;; it under the terms of the GNU General Public License as published by ;;; the Free Software Foundation, either version 3 of the License, or ;;; (at your option) any later version. ;;; ;;; This program is distributed in the hope that it will be useful, ;;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;;; GNU General Public License for more details. ;;; ;;; You should have received a copy of the GNU General Public License ;;; along with this program. If not, see . (import enum [Enum] math [sqrt]) (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)))) (defn distance [point1 point2] (sqrt (+ (** (- (get point1 0) (get point2 0)) 2) (** (- (get point1 1) (get point2 1)) 2))))