$ cat lists.pl #!/usr/bin/perl use strict; use warnings; use 5.10.0; # Build a few lists my @lists; for my $i (0 .. 1+int(3*rand)) { # several lists to compare push @{$lists[$i]}, int 16 * rand for 1 .. 15; print "LIST $i: ", join(", ", sort {$a<=>$b} @{$lists[$i]}), "\n"; } # Build a scoreboard of which items are in each list my %tally; my $bit=0; for my $list (@lists) { for my $item (@$list) { $tally{$item} |= 1<<$bit; } ++$bit; } # Show which items were in all lists my $all = (1<<$bit)-1; print "There were $bit lists. Items found:\n"; for my $item (sort {$a<=>$b} keys %tally) { print "Item $item: "; if ($tally{$item} == $all) { print "in *all* lists\n"; next; } my @present; for ($bit=0; $bit<@lists; $bit++) { push @present, $bit if $tally{$item} & 1<<$bit; } print "in lists: ", join(", ", @present), "\n"; } $ perl lists.pl LIST 0: 1, 3, 4, 6, 8, 8, 9, 9, 10, 10, 11, 11, 11, 13, 14 LIST 1: 0, 0, 0, 0, 0, 3, 3, 3, 5, 6, 8, 11, 11, 15, 15 LIST 2: 0, 1, 3, 4, 6, 6, 6, 8, 8, 9, 9, 9, 12, 13, 15 LIST 3: 1, 4, 4, 5, 5, 6, 8, 8, 8, 8, 9, 9, 12, 12, 13 There were 4 lists. Items found: Item 0: in lists: 1, 2 Item 1: in lists: 0, 2, 3 Item 3: in lists: 0, 1, 2 Item 4: in lists: 0, 2, 3 Item 5: in lists: 1, 3 Item 6: in *all* lists Item 8: in *all* lists Item 9: in lists: 0, 2, 3 Item 10: in lists: 0 Item 11: in lists: 0, 1 Item 12: in lists: 2, 3 Item 13: in lists: 0, 2, 3 Item 14: in lists: 0 Item 15: in lists: 1, 2 #### #!/usr/bin/perl use strict; use warnings; use 5.10.0; # Build a few lists my @lists; for my $i (0 .. 1+int(3*rand)) { # several lists to compare push @{$lists[$i]}, int 16 * rand for 1 .. 15; print "LIST $i: ", join(", ", @{$lists[$i]}), "\n"; } # Track the items found in each list, including the order in # which they appear my %tally; for my $listnum (0 .. $#lists) { # Get a list my $list=$lists{$listnum}; for my $itemnum (0 .. $#$list) { # Get next item from the list my $item = $$list[$itemnum]; # Each item slot (value in list) gets an array, # where each slot is associated with a list. # In that array is an array of indexes into the # list where each item is found push @{$tally{$item}[$listnum]}, $itemnum; } } # Show which items were in all lists my $all = (1<<$bit)-1; print "There were $bit lists. Items found:\n"; for my $item (sort {$a<=>$b} keys %tally) { print "Item $item: "; if ($tally{$item} == $all) { print "in *all* lists\n"; next; } my @present; for ($bit=0; $bit<@lists; $bit++) { push @present, $bit if $tally{$item} & 1<<$bit; } print "in lists: ", join(", ", @present), "\n"; } #### $ cat lists_2.pl #!/usr/bin/perl use strict; use warnings; use 5.10.0; # Build a few lists my @lists; for my $i (0 .. 1+int(3*rand)) { # several lists to compare push @{$lists[$i]}, int 16 * rand for 1 .. 15; print "LIST $i: ", join(", ", @{$lists[$i]}), "\n"; } # Track the items found in each list, including the order in # which they appear my %tally; for my $listnum (0 .. $#lists) { # Get a list my $list=$lists[$listnum]; for my $itemnum (0 .. $#$list) { # Get next item from the list my $item = $$list[$itemnum]; # Each item slot (value in list) gets an array, # where each slot is associated with a list. # In that array is an array of indexes into the # list where each item is found push @{$tally{$item}[$listnum]}, $itemnum; } } # Show which items were in all lists my $numlists = @lists; my $all = (1<<$numlists)-1; print "\nThere were $numlists lists.\n\n"; for my $item (sort {$a<=>$b} keys %tally) { if ($numlists == grep { $_ } @{$tally{$item}}) { print "Item $item in all lists:"; for my $idxlist (0 .. $#lists) { print " list $idxlist: ", join(", ", @{$tally{$item}[$idxlist]}), "\n"; } print "\n"; } $ perl lists_2.pl LIST 0: 5, 6, 9, 13, 3, 0, 1, 2, 5, 5, 10, 14, 15, 8, 4 LIST 1: 11, 5, 2, 12, 3, 4, 9, 13, 14, 14, 9, 15, 5, 2, 6 LIST 2: 6, 0, 7, 12, 11, 2, 13, 8, 14, 8, 13, 5, 0, 1, 7 LIST 3: 3, 14, 14, 11, 7, 10, 12, 8, 6, 15, 5, 6, 14, 6, 11 There were 4 lists. Item 5 in all lists: list 0: 0, 8, 9 list 1: 1, 12 list 2: 11 list 3: 10 Item 6 in all lists: list 0: 1 list 1: 14 list 2: 0 list 3: 8, 11, 13 Item 14 in all lists: list 0: 11 list 1: 8, 9 list 2: 8 list 3: 1, 2, 12