in reply to weird array processing question
I want to take each element in an array and do something to it with each other element of the same array. [...] what is this called?
Permutations (if ordered) or combinations (if unordered). The latter in this case.
For choosing two from the list, one could simply use:
for my $y (0..$#list) { for my $x ($y+1..$#list) { ... } }
But that would be inefficient here. It's O(N**2), whereas the following is O(N):
my %counts; ++$counts{$_} for @list; my $dups = grep { $_ > 1 } values(%counts); die "Walrus Festival!" if $dups >= 3;
One can optimise the above to exit as soon as the answer is obvious:
my %counts; my $dups; for (@list) { if (++$counts{$_} == 2) { if (++$dups >= 3) { die "Walrus Festival!"; } } }
|
|---|