/usr/share/emacs/site-lisp/chess/chess-random.el is in emacs-chess 2.0b6-1.1ubuntu1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; Generate Fischer Random style positions
;;
;; Just call `chess-fischer-random-position' to generate such a
;; position.
;;
(require 'chess-pos)
(defvar pieces-vector [?r ?n ?b ?q ?k ?b ?n ?r])
(defun chess-shuffle-vector (vector)
"Randomly permute the elements of VECTOR (all permutations equally likely)"
(let ((i 0)
j
temp
(len (length vector)))
(while (< i len)
(setq j (+ i (random (- len i))))
(setq temp (aref vector i))
(aset vector i (aref vector j))
(aset vector j temp)
(setq i (1+ i))))
vector)
;;;###autoload
(defun chess-fischer-random-position ()
"Generate a Fischer Random style position."
(let (pieces position)
(while (null position)
(setq pieces (chess-shuffle-vector pieces-vector))
(let (first-bishop first-rook king)
(catch 'retry
(dotimes (i 8)
(let ((piece (aref pieces i)))
(cond
((= ?b piece)
(if first-bishop
(if (= (mod i 2) first-bishop)
(throw 'retry t))
(setq first-bishop (mod i 2))))
((= ?k piece)
(if (null first-rook)
(throw 'retry t))
(setq king i))
((= ?r piece)
(if first-rook
(if (null king)
(throw 'retry t))
(setq first-rook i))))))
(setq position (chess-pos-create)))))
;; set the home row pieces
(dotimes (i 8)
(chess-pos-set-piece position (chess-rf-to-index 0 i)
(aref pieces i))
(chess-pos-set-piece position (chess-rf-to-index 7 i)
(upcase (aref pieces i))))
position))
(provide 'chess-random)
;;; chess-random.el ends here
|