Isoraqathedh

betza wip 1

Feb 21st, 2014
188
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lisp 1.95 KB | None | 0 0
  1. (defun rook (&key (length :infinity) (directions '(:forward :backward :left :right)))
  2.   "Lists all possible destinations of a Rook.
  3.   Represents infinite-range moves as :n and :-n.
  4.   Betza equivalent /f?r?l?b?R[0-9]*/"
  5.   (if (eql length :infinity)
  6.       ;; Infinite-length items use :n
  7.       (loop
  8.      for dir     in '(:forward :backward :left     :right)
  9.      for vectors in '((0 . :n) (0 . :-n) (:-n . 0) (:n . 0))
  10.      if (member dir directions) collect vectors)
  11.       ;; Otherwise list them all.
  12.       (loop for dir in directions
  13.      for horizontal =     (member dir '(:forward :backward))
  14.      for relative   = (if (member dir '(:left :backward))    -1 1)
  15.      append (loop for i from 1 to length
  16.             collect (if horizontal
  17.                 (cons 0 (* i relative))
  18.                 (cons (* i relative) 0)))))
  19.  
  20. (defun bishop (&key (length :infinity) (directions '(:forward :backward :left :right)))
  21.   "Lists all possible destinations of a Bishop.
  22.   Represents infinite-range moves as :n and :-n.
  23.   Betza equivalent /\[[fb]?[rl]?\]B[0-9]*/"
  24.   (flet ((diagonal-directions (dirs)
  25.        (remove-duplicates
  26.         (loop
  27.            for dir in dirs
  28.            appending (cond
  29.                ((eql dir :forward ) (list :ne :nw))
  30.                ((eql dir :backward) (list :se :sw))
  31.                ((eql dir :left)     (list :nw :sw))
  32.                ((eql dir :right)    (list :ne :se))
  33.                ((member dir (list :ne :se :sw :nw)) (list dir))
  34.                (t nil))))))
  35.     (if (eql length :infinity)
  36.     (loop
  37.        for dir     in '(:ne :se :sw :nw)
  38.        for vectors in '((:n . :n) (:n . :-n) (:-n . :-n) (:-n . :n))
  39.        if (member dir (diagonal-directions directions)) collect vectors)
  40.     (loop
  41.           with calculated-dirs = (diagonal-directions directions)
  42.           for dirs in (list :ne :se :sw :nw)
  43.           for mult-x = (if (member dirs '(:nw :sw)) -1 1)
  44.           for mult-y = (if (member dirs '(:se :sw)) -1 1)
  45.           append (when (member dirs calculated-dirs)
  46.                (loop for i from 1 to length collect (cons (* mult-x i) (* mult-y i))))))))
Advertisement
Add Comment
Please, Sign In to add comment