#!/usr/bin/perl -w use strict; my $data = read_input(); my $sets = scan($data); for (@$sets) { printf "{ %s }\n", join ' ', sort { $a <=> $b } @$_; } sub read_input { my @data; local $_; while () { push @data, [ grep defined, split /\s+/ ]; } \@data; } sub scan { my $data = shift; my(%matches, %results); for my $index (0 .. $#$data) { my @equal; my $these = $data->[$index]; for my $key (keys %matches) { my $compare = $matches{$key}; if (grep exists $compare->{$_}, @$these) { push @equal, $key; } } $results{$index} = [ $index, map @{ delete $results{$_} }, @equal ]; $matches{$index} = { map(($_ => 1), @$these), map %{ delete $matches{$_} }, @equal }; } [ values %results ]; } __END__ a b c d e f b g h i j k l m f