Cool. Here is generalization for "n dimensions", e.g. I want an exhaustive list of combinations to build Perl variable names according to some pattern (silly example):
use strict;
use warnings;
use feature 'say';
use Algorithm::Combinatorics 'variations_with_repetition';
use List::MoreUtils 'pairwise';
use Data::Dump 'dd';
my @subsets = (
[ qw/ $ @ % /],
[ qw/ p q r s /],
[ qw/ 0 1 /],
);
my $base = shift @subsets;
my $var_len = @$base;
my @solutions = [ map [$_], @$base ];
for my $subset ( @subsets ) {
my @variations = variations_with_repetition( $subset, $var_len );
@solutions = map {
my $sol = $_;
map [ pairwise { [ @$a, $b ] } @$sol, @$_ ], @variations
} @solutions;
}
dd \@solutions;
Output:
[["\$", "p", 0], ["\@", "p", 0], ["%", "p", 0]],
[["\$", "p", 0], ["\@", "p", 0], ["%", "p", 1]],
[["\$", "p", 0], ["\@", "p", 1], ["%", "p", 0]],
[["\$", "p", 0], ["\@", "p", 1], ["%", "p", 1]],
[["\$", "p", 1], ["\@", "p", 0], ["%", "p", 0]],
[["\$", "p", 1], ["\@", "p", 0], ["%", "p", 1]],
[["\$", "p", 1], ["\@", "p", 1], ["%", "p", 0]],
[["\$", "p", 1], ["\@", "p", 1], ["%", "p", 1]],
[["\$", "p", 0], ["\@", "p", 0], ["%", "q", 0]],
[["\$", "p", 0], ["\@", "p", 0], ["%", "q", 1]],
[["\$", "p", 0], ["\@", "p", 1], ["%", "q", 0]],
[["\$", "p", 0], ["\@", "p", 1], ["%", "q", 1]],
[["\$", "p", 1], ["\@", "p", 0], ["%", "q", 0]],
[["\$", "p", 1], ["\@", "p", 0], ["%", "q", 1]],
[["\$", "p", 1], ["\@", "p", 1], ["%", "q", 0]],
[["\$", "p", 1], ["\@", "p", 1], ["%", "q", 1]],
[["\$", "p", 0], ["\@", "p", 0], ["%", "r", 0]],
...
... total 512 solutions
|