math is hard (to remember)

cabney cabney at
Thu Jul 12 21:40:47 CDT 2001

Anyone have a more succinct way to do this?  Or... faster?  I'm no compsci
guy, but my guess is this is O(NlogN).

#! /usr/bin/perl -w
# Finds all the different ways of combining N items, excluding the empty
# set.  So, 2**N - 1 combinations.

use strict;

my @elems = @ARGV;
my ( %elems );

for my $elem ( @elems )

for my $depth ( 2 .. scalar @elems )
	my @existing =	grep { length ($_) == $depth-1 } keys %elems;
	for my $key ( @existing )
		my $last = substr ($key, length($key)-1, 1);
		for my $elem (@elems)
			if ( ord($last) < ord($elem) ) {
				my $new = $key . $elem;

print "$_\n" for keys %elems;

There was a time
A wind that blew so young
For this could be the biggest sky
And I could have the faintest idea


The posting address is: san-diego-pm-list at

List requests should be sent to: majordomo at

If you ever want to remove yourself from this mailing list,
you can send mail to <majordomo at> with the following
command in the body of your email message:

    unsubscribe san-diego-pm-list

If you ever need to get in contact with the owner of the list,
(if you have trouble unsubscribing, or have questions about the
list itself) send email to <owner-san-diego-pm-list at> .
This is the general rule for most mailing lists when you need
to contact a human.

More information about the San-Diego-pm mailing list