Permutations: Difference between revisions
Content added Content deleted
(→{{header|Common Lisp}}: lexico method) |
|||
Line 655: | Line 655: | ||
(print (permute '(A B Z)))</lang>output<lang>((A B Z) (A Z B) (B A Z) (B Z A) (Z A B) (Z B A))</lang> |
(print (permute '(A B Z)))</lang>output<lang>((A B Z) (A Z B) (B A Z) (B Z A) (Z A B) (Z B A))</lang> |
||
Lexicographic next permutation: |
|||
<lang lisp>(defun next-perm (list cmp) |
|||
;; coerce is debatable |
|||
(let ((ll (coerce list 'vector)) i (len (1- (length list)))) |
|||
(loop for i from (1- len) downto 0 do |
|||
(when (funcall cmp (elt list i) (elt list (1+ i))) |
|||
(loop for k from len downto i do |
|||
(when (funcall cmp (elt list i) (elt list k)) |
|||
(rotatef (elt ll i) (elt ll k)) |
|||
(setf k (1+ len)) |
|||
(loop while (< (incf i) (decf k)) do |
|||
(rotatef (elt ll i) (elt ll k))) |
|||
(return-from next-perm ll))))))) |
|||
;;; text code |
|||
(let ((a "ABCD") (cnt 0)) |
|||
(loop while a do |
|||
(write-line a) |
|||
(setf a (next-perm a #'char<))))<lang> |
|||
=={{header|D}}== |
=={{header|D}}== |
||
<lang d>import std.stdio: writeln; |
<lang d>import std.stdio: writeln; |