Working code:
#!/usr/bin/perl
use warnings;
use strict;
use feature qw{ say };
use constant MAX => 20;
use constant EMPTY => "\0" x ((MAX / 8) + 1);
my @AoA = map [ map int rand 1 + MAX, 1 .. 4 ], 0 .. 1000;
my @vectors = (EMPTY) x (MAX + 1);
for my $num (0 .. MAX) {
for my $pos (0 .. $#AoA) {
vec($vectors[$num], $pos, 1) = grep($num == $_, @{ $AoA[$pos]
+}) ? 1 : 0;
}
}
print "@$_; " for @AoA;
print "\n";
my $subarray = $AoA[0];
say "Selecting: @$subarray.";
my $result = EMPTY;
for my $num (@$subarray) {
$result |= $vectors[$num];
}
for my $i (0 .. $#AoA) {
say "@{ $AoA[$i] }" unless vec($result, $i, 1);
}
Update: Runs under 0.3s for 10_000 quadruples.