* 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: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: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
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).