* All Possible Combinations @ 2009-06-03 9:09 Nordlöw 2009-06-03 9:53 ` Pascal J. Bourguignon ` (2 more replies) 0 siblings, 3 replies; 9+ messages in thread From: Nordlöw @ 2009-06-03 9:09 UTC (permalink / raw) To: help-gnu-emacs Hey! I want a function that generates all possible combinations (ordering) of the elements in a list (or sequence if possible). Here is my mockup: (defun all-combinations (n) "Generate a listing of all the possible combinations of the elements in the sequence N. Time-Complexity is N!" (let (all) all)) For example (all-combinations '(a b c)) should return '((a b c) (a c b) (b a c) (b c a) (c a b) (c b a)) Has somebody written such a function, preferrably in an iterative rather than recursive way. Thanks in advance, Nordlöw ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: All Possible Combinations 2009-06-03 9:09 All Possible Combinations Nordlöw @ 2009-06-03 9:53 ` Pascal J. Bourguignon 2009-06-03 13:36 ` B. T. Raven 2009-06-03 9:55 ` Lennart Borgman 2009-06-03 18:50 ` Marc Tfardy 2 siblings, 1 reply; 9+ messages in thread From: Pascal J. Bourguignon @ 2009-06-03 9:53 UTC (permalink / raw) To: help-gnu-emacs Nordlöw <per.nordlow@gmail.com> writes: > Hey! > > I want a function that generates all possible combinations (ordering) > of the elements in a list (or sequence if possible). Here is my > mockup: > > (defun all-combinations (n) > "Generate a listing of all the possible combinations of the > elements in the sequence N. Time-Complexity is N!" > (let (all) > all)) > > For example (all-combinations '(a b c)) should return '((a b c) (a c > b) (b a c) (b c a) (c a b) (c b a)) > > Has somebody written such a function, preferrably in an iterative > rather than recursive way. It's called permutations. Combinations are when you take a smaller number of elements amongst the set. Now notice that (permutations '()) = (()) that is, the set of permutations of the empty set contains only the empty set (there's no other way to order no elements) and notice that (permutations '(a)) = ((a)) (there's only one way to order one element). Now, knowing that (permutations '(a)) = ((a)) How can you compute (permutations '(b a))? That is, how many ways can you put b in the permutations of (a), for example, in (a)? Yes, there's two ways: before or after a: (b a) or (a b). So now we know that (permutations '(b a)) = ((b a) (a b)) Then, how can you compute (permutations '(c b a))? That is, how many ways can you put c in the permutations of (b a), for example, in (a b)? ... So now we know that (permutations '(x ...)) = ((x ...) ... (... x)) Then, how can you compute (permutations '(y x ...))? That is, how many ways can you put y in the permutations of (x ...), for example, in (... x)? -- __Pascal Bourguignon__ ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: All Possible Combinations 2009-06-03 9:53 ` Pascal J. Bourguignon @ 2009-06-03 13:36 ` B. T. Raven 0 siblings, 0 replies; 9+ messages in thread From: B. T. Raven @ 2009-06-03 13:36 UTC (permalink / raw) To: help-gnu-emacs Pascal J. Bourguignon wrote: > Nordlöw <per.nordlow@gmail.com> writes: > >> Hey! >> >> I want a function that generates all possible combinations (ordering) >> of the elements in a list (or sequence if possible). Here is my >> mockup: >> >> (defun all-combinations (n) >> "Generate a listing of all the possible combinations of the >> elements in the sequence N. Time-Complexity is N!" >> (let (all) >> all)) >> >> For example (all-combinations '(a b c)) should return '((a b c) (a c >> b) (b a c) (b c a) (c a b) (c b a)) >> >> Has somebody written such a function, preferrably in an iterative >> rather than recursive way. > > It's called permutations. Combinations are when you take a smaller > number of elements amongst the set. Both permutations and combinations can deal with n things taken r at a time where r can equal n: nPr = n! / (n-r)! nCr = n! / (n-r)! r! So in general (at least when r /= 1) the number of resultant sets is smaller with nCr > > Now notice that (permutations '()) = (()) > that is, the set of permutations of the empty set contains only the > empty set (there's no other way to order no elements) > > and notice that (permutations '(a)) = ((a)) > (there's only one way to order one element). > > Now, knowing that (permutations '(a)) = ((a)) > How can you compute (permutations '(b a))? > That is, how many ways can you put b in the permutations of (a), for example, in (a)? > > Yes, there's two ways: before or after a: (b a) or (a b). > > > So now we know that (permutations '(b a)) = ((b a) (a b)) > Then, how can you compute (permutations '(c b a))? > That is, how many ways can you put c in the permutations of (b a), for example, in (a b)? > > ... > > So now we know that (permutations '(x ...)) = ((x ...) ... (... x)) > Then, how can you compute (permutations '(y x ...))? > That is, how many ways can you put y in the permutations of (x ...), for example, in (... x)? > > ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: All Possible Combinations 2009-06-03 9:09 All Possible Combinations Nordlöw 2009-06-03 9:53 ` Pascal J. Bourguignon @ 2009-06-03 9:55 ` Lennart Borgman 2009-06-03 18:50 ` Marc Tfardy 2 siblings, 0 replies; 9+ messages in thread From: Lennart Borgman @ 2009-06-03 9:55 UTC (permalink / raw) To: Nordlöw; +Cc: help-gnu-emacs On Wed, Jun 3, 2009 at 11:09 AM, Nordlöw <per.nordlow@gmail.com> wrote: > Hey! > > I want a function that generates all possible combinations (ordering) > of the elements in a list (or sequence if possible). Here is my > mockup: > > (defun all-combinations (n) > "Generate a listing of all the possible combinations of the > elements in the sequence N. Time-Complexity is N!" > (let (all) > all)) > > For example (all-combinations '(a b c)) should return '((a b c) (a c > b) (b a c) (b c a) (c a b) (c b a)) > > Has somebody written such a function, preferrably in an iterative > rather than recursive way. Would not that require building a stack to keep track of state just as recursion would do internally? ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: All Possible Combinations 2009-06-03 9:09 All Possible Combinations Nordlöw 2009-06-03 9:53 ` Pascal J. Bourguignon 2009-06-03 9:55 ` Lennart Borgman @ 2009-06-03 18:50 ` Marc Tfardy 2009-06-04 6:08 ` Nordlöw 2 siblings, 1 reply; 9+ messages in thread From: Marc Tfardy @ 2009-06-03 18:50 UTC (permalink / raw) To: help-gnu-emacs Nordlöw schrieb: > Hey! > > I want a function that generates all possible combinations (ordering) > of the elements in a list (or sequence if possible). Here is my > mockup: > > (defun all-combinations (n) > "Generate a listing of all the possible combinations of the > elements in the sequence N. Time-Complexity is N!" > (let (all) > all)) > > For example (all-combinations '(a b c)) should return '((a b c) (a c > b) (b a c) (b c a) (c a b) (c b a)) > > Has somebody written such a function, preferrably in an iterative > rather than recursive way. Here you find working common lisp version: http://www.perlmonks.org/?node_id=485066 (defun permutations (bag) "Return a list of all the permutations of the input." ;; If the input is nil, there is only one permutation: ;; nil itself (if (null bag) '(()) ;; Otherwise, take an element, e, out of the bag. ;; Generate all permutations of the remaining elements, ;; And add e to the front of each of these. ;; Do this for all possible e to generate all permutations. (mapcan #'(lambda (e) (mapcar #'(lambda (p) (cons e p)) (permutations (remove e bag :count 1)))) bag))) Now replace 'remove' with 'remove*' and this works in emacs lisp, too. regards Marc ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: All Possible Combinations 2009-06-03 18:50 ` Marc Tfardy @ 2009-06-04 6:08 ` Nordlöw 2009-06-04 7:20 ` Marc Tfardy 0 siblings, 1 reply; 9+ messages in thread From: Nordlöw @ 2009-06-04 6:08 UTC (permalink / raw) To: help-gnu-emacs On Jun 3, 8:50 pm, Marc Tfardy <tfar...@very-tfardol.com> wrote: > Nordlöw schrieb: > > > > > Hey! > > > I want a function that generates all possible combinations (ordering) > > of the elements in a list (or sequence if possible). Here is my > > mockup: > > > (defun all-combinations (n) > > "Generate a listing of all the possible combinations of the > > elements in the sequence N. Time-Complexity is N!" > > (let (all) > > all)) > > > For example (all-combinations '(a b c)) should return '((a b c) (a c > > b) (b a c) (b c a) (c a b) (c b a)) > > > Has somebody written such a function, preferrably in an iterative > > rather than recursive way. > > Here you find working common lisp version:http://www.perlmonks.org/?node_id=485066 > > (defun permutations (bag) > "Return a list of all the permutations of the input." > ;; If the input is nil, there is only one permutation: > ;; nil itself > (if (null bag) > '(()) > ;; Otherwise, take an element, e, out of the bag. > ;; Generate all permutations of the remaining elements, > ;; And add e to the front of each of these. > ;; Do this for all possible e to generate all permutations. > (mapcan #'(lambda (e) > (mapcar #'(lambda (p) (cons e p)) > (permutations > (remove e bag :count 1)))) > bag))) > > Now replace 'remove' with 'remove*' and this works in emacs lisp, too. > > regards > Marc This gives the error: "e is undefined" in Emacs: (defun all-combinations-gen (bag) "Return a list of all the permutations of the input." (if (null bag) '(()) ;; Otherwise, take an element, e, out of the bag. ;; Generate all permutations of the remaining elements, ;; And add e to the front of each of these. ;; Do this for all possible e to generate all permutations. (mapcan #'(lambda (e) (mapcar #'(lambda (p) (cons e p)) (permutations (remove* e bag :count 1)))) bag))) (all-combinations-gen '(a b c)) /Per ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: All Possible Combinations 2009-06-04 6:08 ` Nordlöw @ 2009-06-04 7:20 ` Marc Tfardy 2009-06-04 16:25 ` B. T. Raven 2009-06-05 15:49 ` Thierry Volpiatto 0 siblings, 2 replies; 9+ messages in thread From: Marc Tfardy @ 2009-06-04 7:20 UTC (permalink / raw) To: help-gnu-emacs Nordlöw schrieb: > On Jun 3, 8:50 pm, Marc Tfardy <tfar...@very-tfardol.com> wrote: >> Nordlöw schrieb: >> >> >> >>> Hey! >>> I want a function that generates all possible combinations (ordering) >>> of the elements in a list (or sequence if possible). Here is my >>> mockup: >>> (defun all-combinations (n) >>> "Generate a listing of all the possible combinations of the >>> elements in the sequence N. Time-Complexity is N!" >>> (let (all) >>> all)) >>> For example (all-combinations '(a b c)) should return '((a b c) (a c >>> b) (b a c) (b c a) (c a b) (c b a)) >>> Has somebody written such a function, preferrably in an iterative >>> rather than recursive way. >> Here you find working common lisp version:http://www.perlmonks.org/?node_id=485066 >> >> (defun permutations (bag) >> "Return a list of all the permutations of the input." >> ;; If the input is nil, there is only one permutation: >> ;; nil itself >> (if (null bag) >> '(()) >> ;; Otherwise, take an element, e, out of the bag. >> ;; Generate all permutations of the remaining elements, >> ;; And add e to the front of each of these. >> ;; Do this for all possible e to generate all permutations. >> (mapcan #'(lambda (e) >> (mapcar #'(lambda (p) (cons e p)) >> (permutations >> (remove e bag :count 1)))) >> bag))) >> >> Now replace 'remove' with 'remove*' and this works in emacs lisp, too. >> >> regards >> Marc > > This gives the error: "e is undefined" in Emacs: > > (defun all-combinations-gen (bag) > "Return a list of all the permutations of the input." > (if (null bag) '(()) > ;; Otherwise, take an element, e, out of the bag. > ;; Generate all permutations of the remaining elements, > ;; And add e to the front of each of these. > ;; Do this for all possible e to generate all permutations. > (mapcan #'(lambda (e) > (mapcar #'(lambda (p) (cons e p)) > (permutations > (remove* e bag :count 1)))) > bag))) > > (all-combinations-gen '(a b c)) Check all again, please. I've tested this code just now once again and here is everything working fine. I get: (all-combinations-gen '(a b c)) ((a b c) (a c b) (b a c) (b c a) (c a b) (c b a)) regards Marc ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: All Possible Combinations 2009-06-04 7:20 ` Marc Tfardy @ 2009-06-04 16:25 ` B. T. Raven 2009-06-05 15:49 ` Thierry Volpiatto 1 sibling, 0 replies; 9+ messages in thread From: B. T. Raven @ 2009-06-04 16:25 UTC (permalink / raw) To: help-gnu-emacs Marc Tfardy wrote: > Nordlöw schrieb: >> On Jun 3, 8:50 pm, Marc Tfardy <tfar...@very-tfardol.com> wrote: >>> Nordlöw schrieb: >>> >>> >>> >>>> Hey! >>>> I want a function that generates all possible combinations (ordering) >>>> of the elements in a list (or sequence if possible). Here is my >>>> mockup: >>>> (defun all-combinations (n) >>>> "Generate a listing of all the possible combinations of the >>>> elements in the sequence N. Time-Complexity is N!" >>>> (let (all) >>>> all)) >>>> For example (all-combinations '(a b c)) should return '((a b c) (a c >>>> b) (b a c) (b c a) (c a b) (c b a)) >>>> Has somebody written such a function, preferrably in an iterative >>>> rather than recursive way. >>> Here you find working common lisp >>> version:http://www.perlmonks.org/?node_id=485066 >>> >>> (defun permutations (bag) >>> "Return a list of all the permutations of the input." >>> ;; If the input is nil, there is only one permutation: >>> ;; nil itself >>> (if (null bag) >>> '(()) >>> ;; Otherwise, take an element, e, out of the bag. >>> ;; Generate all permutations of the remaining elements, >>> ;; And add e to the front of each of these. >>> ;; Do this for all possible e to generate all permutations. >>> (mapcan #'(lambda (e) >>> (mapcar #'(lambda (p) (cons e p)) >>> (permutations >>> (remove e bag :count 1)))) >>> bag))) >>> >>> Now replace 'remove' with 'remove*' and this works in emacs lisp, too. >>> >>> regards >>> Marc >> >> This gives the error: "e is undefined" in Emacs: >> >> (defun all-combinations-gen (bag) >> "Return a list of all the permutations of the input." >> (if (null bag) '(()) >> ;; Otherwise, take an element, e, out of the bag. >> ;; Generate all permutations of the remaining elements, >> ;; And add e to the front of each of these. >> ;; Do this for all possible e to generate all permutations. >> (mapcan #'(lambda (e) >> (mapcar #'(lambda (p) (cons e p)) >> (permutations >> (remove* e bag :count 1)))) >> bag))) >> >> (all-combinations-gen '(a b c)) > > Check all again, please. I've tested this code just now once again > and here is everything working fine. I get: > > > (all-combinations-gen '(a b c)) > ((a b c) (a c b) (b a c) (b c a) (c a b) (c b a)) > > regards > Marc > Also doesn't quite work here: Backtrace: Debugger entered--Lisp error: (void-function permutations) (permutations (remove* e bag :count 1)) (mapcar (function (lambda ... ...)) (permutations (remove* e bag :count 1))) ... I'm assuming that all I need is M-x load-library cl to get mapcan and remove* I tried on ver 22 but not 23 Okay, finally comes the light: defun has to be named either all-combinations-gen or permutations. Works if that renaming is made consistent. Should be permutations, since there is only one combination of elements a,b,c taken three at a time. All permutations collapse into one combination. Ed ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: All Possible Combinations 2009-06-04 7:20 ` Marc Tfardy 2009-06-04 16:25 ` B. T. Raven @ 2009-06-05 15:49 ` Thierry Volpiatto 1 sibling, 0 replies; 9+ messages in thread From: Thierry Volpiatto @ 2009-06-05 15:49 UTC (permalink / raw) To: help-gnu-emacs Marc Tfardy <tfardol@very-tfardol.com> writes: > Nordlöw schrieb: >> On Jun 3, 8:50 pm, Marc Tfardy <tfar...@very-tfardol.com> wrote: >>> Nordlöw schrieb: >>> >>> >>> >>>> Hey! >>>> I want a function that generates all possible combinations (ordering) >>>> of the elements in a list (or sequence if possible). Here is my >>>> mockup: >>>> (defun all-combinations (n) >>>> "Generate a listing of all the possible combinations of the >>>> elements in the sequence N. Time-Complexity is N!" >>>> (let (all) >>>> all)) >>>> For example (all-combinations '(a b c)) should return '((a b c) (a c >>>> b) (b a c) (b c a) (c a b) (c b a)) >>>> Has somebody written such a function, preferrably in an iterative >>>> rather than recursive way. >>> Here you find working common lisp version:http://www.perlmonks.org/?node_id=485066 >>> >>> (defun permutations (bag) >>> "Return a list of all the permutations of the input." >>> ;; If the input is nil, there is only one permutation: >>> ;; nil itself >>> (if (null bag) >>> '(()) >>> ;; Otherwise, take an element, e, out of the bag. >>> ;; Generate all permutations of the remaining elements, >>> ;; And add e to the front of each of these. >>> ;; Do this for all possible e to generate all permutations. >>> (mapcan #'(lambda (e) >>> (mapcar #'(lambda (p) (cons e p)) >>> (permutations >>> (remove e bag :count 1)))) >>> bag))) >>> >>> Now replace 'remove' with 'remove*' and this works in emacs lisp, too. >>> >>> regards >>> Marc >> >> This gives the error: "e is undefined" in Emacs: >> >> (defun all-combinations-gen (bag) >> "Return a list of all the permutations of the input." >> (if (null bag) '(()) >> ;; Otherwise, take an element, e, out of the bag. >> ;; Generate all permutations of the remaining elements, >> ;; And add e to the front of each of these. >> ;; Do this for all possible e to generate all permutations. >> (mapcan #'(lambda (e) >> (mapcar #'(lambda (p) (cons e p)) >> (permutations >> (remove* e bag :count 1)))) >> bag))) >> >> (all-combinations-gen '(a b c)) > > Check all again, please. I've tested this code just now once again > and here is everything working fine. I get: > > > (all-combinations-gen '(a b c)) > ((a b c) (a c b) (b a c) (b c a) (c a b) (c b a)) Work fine for me too, very nice code :-) Would be nice if the same function accept an extra arg to specify the number of elements of the combinations we want, something like: (all-combinations-gen '(a b c) 2) ==> ((a b) (a c) (b c) ....) Don't find yet how to do that ... -- A + Thierry Volpiatto Location: Saint-Cyr-Sur-Mer - France ^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2009-06-05 15:49 UTC | newest] Thread overview: 9+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2009-06-03 9:09 All Possible Combinations Nordlöw 2009-06-03 9:53 ` Pascal J. Bourguignon 2009-06-03 13:36 ` B. T. Raven 2009-06-03 9:55 ` Lennart Borgman 2009-06-03 18:50 ` Marc Tfardy 2009-06-04 6:08 ` Nordlöw 2009-06-04 7:20 ` Marc Tfardy 2009-06-04 16:25 ` B. T. Raven 2009-06-05 15:49 ` Thierry Volpiatto
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).