in reply to Combinations / permutations... not even sure what this is called

perhaps an adaption of this idea may be of use:
#!/usr/bin/perl -w use strict; print "$_\n" for (glob "{red,blue}-{small,medium,large}-{1,2,3,4}") __END__ red-small-1 red-small-2 red-small-3 red-small-4 red-medium-1 red-medium-2 red-medium-3 red-medium-4 red-large-1 red-large-2 red-large-3 red-large-4 blue-small-1 blue-small-2 blue-small-3 blue-small-4 blue-medium-1 blue-medium-2 blue-medium-3 blue-medium-4 blue-large-1 blue-large-2 blue-large-3 blue-large-4
  • Comment on Re: Combinations / permutations... not even sure what this is called
  • Download Code

Replies are listed 'Best First'.
Re^2: Combinations / permutations... not even sure what this is called
by johngg (Canon) on Oct 29, 2011 at 11:44 UTC

    A little push in the right direction :-)

    knoppix@Microknoppix:~$ perl -Mstrict -MData::Dumper -we ' > my @arr; > push @{ $arr[ do { my $v = $1 - 1 if m{(\d+)$} } ] }, $_ > for glob q{{red,blue}-{small,medium,large}-{1,2,3,4}}; > print Data::Dumper->Dumpxs( [ \ @arr ], [ qw{ *arr } ] );' @arr = ( [ 'red-small-1', 'red-medium-1', 'red-large-1', 'blue-small-1', 'blue-medium-1', 'blue-large-1' ], [ 'red-small-2', 'red-medium-2', 'red-large-2', 'blue-small-2', 'blue-medium-2', 'blue-large-2' ], [ 'red-small-3', 'red-medium-3', 'red-large-3', 'blue-small-3', 'blue-medium-3', 'blue-large-3' ], [ 'red-small-4', 'red-medium-4', 'red-large-4', 'blue-small-4', 'blue-medium-4', 'blue-large-4' ] ); knoppix@Microknoppix:~$

    I hope this is of interest.

    Update: Looks like it might be the wrong direction as I've grouped from the wrong end. Oh well :-(

    Update 2: Amended to do things the right way around but it's a bit clunkier :-(

    knoppix@Microknoppix:~$ perl -Mstrict -MData::Dumper -we ' > my $idx; > my %idxHash = > map { $_ => $idx ++ } > glob q{{red,blue}-{small,medium,large}}; > my @arr; > push @{ $arr[ do { $idxHash{ $1 } if m{^(\w+-\w+)} } ] }, $_ > for glob q{{red,blue}-{small,medium,large}-{1,2,3,4}}; > print Data::Dumper->Dumpxs( [ \ @arr ], [ qw{ *arr } ] );' @arr = ( [ 'red-small-1', 'red-small-2', 'red-small-3', 'red-small-4' ], [ 'red-medium-1', 'red-medium-2', 'red-medium-3', 'red-medium-4' ], [ 'red-large-1', 'red-large-2', 'red-large-3', 'red-large-4' ], [ 'blue-small-1', 'blue-small-2', 'blue-small-3', 'blue-small-4' ], [ 'blue-medium-1', 'blue-medium-2', 'blue-medium-3', 'blue-medium-4' ], [ 'blue-large-1', 'blue-large-2', 'blue-large-3', 'blue-large-4' ] ); knoppix@Microknoppix:~$

    Update 3: Getting rid of the hash index look-up.

    knoppix@Microknoppix:~$ perl -Mstrict -MData::Dumper -we ' > my @arr; > my $idx = -1; > push @{ $arr [ $_->[ 0 ] ] }, $_->[ 1 ] for > map { $idx ++; map { [ $idx, $_ ] } glob qq{$_-{1,2,3,4}} } > glob q{{red,blue}-{small,medium,large}}; > print Data::Dumper->Dumpxs( [ \ @arr ], [ qw{ *arr } ] );' ...

    Cheers,

    JohnGG

      Or perhaps as a push in the same direction:
      #!/usr/bin/perl -w use strict; use Data::Dumper; my @array; foreach my $prefix (glob "{red,blue}-{small,medium,large}") { my @sub_array; push @sub_array, "$prefix-$_" for (1,2,3,4); push @array, \@sub_array; } print Dumper \@array; __END__ $VAR1 = [ [ 'red-small-1', 'red-small-2', 'red-small-3', 'red-small-4' ], [ 'red-medium-1', 'red-medium-2', 'red-medium-3', 'red-medium-4' ], [ 'red-large-1', 'red-large-2', 'red-large-3', 'red-large-4' ], [ 'blue-small-1', 'blue-small-2', 'blue-small-3', 'blue-small-4' ], [ 'blue-medium-1', 'blue-medium-2', 'blue-medium-3', 'blue-medium-4' ], [ 'blue-large-1', 'blue-large-2', 'blue-large-3', 'blue-large-4' ] ];
      Many variations are possible. I think there are some good ideas in this thread.