Permutations: Difference between revisions

→‎{{header|Common Lisp}}: CL is about not repeating yourself
(→‎{{header|Common Lisp}}: CL is about not repeating yourself)
Line 770:
 
Lexicographic next permutation:
<lang lisp>(defun next-perm (list cmp)
(defun next-perm (vec cmp) ; modify vector
;; coerce is debatable
(declare (type (simple-array * (*)) vec))
(let ((ll (coerce list 'vector)) i (len (1- (length list))))
(macrolet ((el (i) `(aref vec ,i))
(loop for i from (1- len) downto 0 do
(when (funcall cmp (elt list (cmp (i j) `(eltfuncall listcmp (1+el ,i) (el ,j))))
(loop for k fromwith len downto= i(1- (length dovec))
(when (funcall cmp (elt list for i) from (elt1- listlen) k))downto 0
(rotatef (elt ll i)when (eltcmp lli k(1+ i)) do
(setfloop for k (1+from len)) downto i
(loop while (< (incf i) when (decfcmp i k)) do
(rotatef (elt llel i) (elt llel k)))
(setf k (1+ len))
(return-from next-perm ll)))))))
(loop while (< (incf i) (decf k)) do
(rotatef (el i) (el k)))
(return-from next-perm ll))vec)))))
 
;;; test code
(setfloop for a = "1234" then (next-perm a #'char<))))</lang> while a do
(let ((a "ABCD") (cnt 0))
(write-line a))
(loop while a do
</lang>
(write-line a)
(setf a (next-perm a #'char<))))</lang>
 
=={{header|D}}==
Anonymous user