Lispで、初期要素が99から0で始まる他の質問リストから初期要素を含むリストを作成するこの関数があります
(defun newList (&optional(n 100))
(loop for i from (- n 1) downto 0 collect i))
(defun board (newList &optional(n 10))
(cond
((null newList) nil)
(t (cons (subseq newList 0 n) (board (subseq newList n) n)))))
(defun show-board (board)
(format T "~%")
(mapcar (lambda (x) (format T " ~A ~%" x)) board)
(format nil "")
)
(show-board (board (newList)))
(99 98 97 96 95 94 93 92 91 90)
(89 88 87 86 85 84 83 82 81 80)
(79 78 77 76 75 74 73 72 71 70)
(69 68 67 66 65 64 63 62 61 60)
(59 58 57 56 55 54 53 52 51 50)
(49 48 47 46 45 44 43 42 41 40)
(39 38 37 36 35 34 33 32 31 30)
(29 28 27 26 25 24 23 22 21 20)
(19 18 17 16 15 14 13 12 11 10)
(9 8 7 6 5 4 3 2 1 0)
ここで結果を参照してください https://ideone.com/Paorct そして、この機能を使用して重複した番号を削除します
(defun remove-duplicate (pred l)
(cond ((null l) NIL)
((funcall pred (car l)) (remove-duplicate pred (cdr l)))
(T (cons (car l) (remove-duplicate pred (cdr l))))))
リストを受け取り、その番号をランダムに変更する関数を実装したいと思います。再帰関数を作成し、
n番目
関数、ランダム関数、および
重複削除
関数は、ランダムに見つかった番号と等しい番号をリストから削除する必要があります。
停止条件は、リストが空であることです。
を使用する必要があります
させて
次のステートメントを使用して、ランダムな位置で見つかった数値をローカルに格納するステートメント:
(nth (ランダム (長さ l)) l)
を使用して
重複削除
再帰関数の引数として渡されているリストから削除する必要がある関数、ランダムに検出され、ローカルに保存されている番号。私はこれを持っていますが、うまくいかず、アルゴリズムを理解しようとしました
私の疑問はここにあります。重複番号なしでリストをシャッフルする機能を実装する方法
(defun shuffle-list (l)
;; iterate 99 times
(dotimes (i (- (length l) 1))
;; store random number to n
(let ((n (nth (random (length l)) l)))
;; print value of n
(format t "~A ~%" n)
(cond
((null l) nil)
;; I have this but it´s not show the new list
(t (remove-duplicate #'(lambda (x) (= x n)) l))))))
たとえば、結果は次のようになります
(94 25 54 89 21 8 36 14 41 96)
(78 47 56 23 5 49 13 12 26 60)
(0 27 17 83 34 93 74 52 45 80)
(69 9 77 95 55 39 91 73 57 30)
(24 15 22 86 1 11 68 79 76 72)
(81 48 32 2 64 16 50 37 29 71)
(99 51 6 18 53 28 7 63 10 88)
(59 42 46 85 90 75 87 43 20 31)
(3 61 58 44 65 82 19 4 35 62)
(33 70 84 40 66 38 92 67 98 97)