25 lines
949 B
Clojure
25 lines
949 B
Clojure
(defn isin? [x li]
|
|
(not= [] (filter #(= x %) li)))
|
|
|
|
(defn options [movements pmoves n]
|
|
(let [x (first (last movements)) y (second (last movements))
|
|
op (vec (map #(vector (+ x (first %)) (+ y (second %))) pmoves))
|
|
vop (filter #(and (>= (first %) 0) (>= (last %) 0)) op)
|
|
vop1 (filter #(and (< (first %) n) (< (last %) n)) vop)]
|
|
(vec (filter #(not (isin? % movements)) vop1))))
|
|
|
|
(defn next-move [movements pmoves n]
|
|
(let [op (options movements pmoves n)
|
|
sp (map #(vector % (count (options (conj movements %) pmoves n))) op)
|
|
m (apply min (map last sp))]
|
|
(first (rand-nth (filter #(= m (last %)) sp)))))
|
|
|
|
(defn jumps [n pos]
|
|
(let [movements (vector pos)
|
|
pmoves [[1 2] [1 -2] [2 1] [2 -1]
|
|
[-1 2] [-1 -2] [-2 -1] [-2 1]]]
|
|
(loop [mov movements x 1]
|
|
(if (= x (* n n))
|
|
mov
|
|
(let [np (next-move mov pmoves n)]
|
|
(recur (conj mov np) (inc x)))))))
|