diff options
| author | James Smith <js5@sanger.ac.uk> | 2023-03-20 10:54:31 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-03-20 10:54:31 +0000 |
| commit | 3530508680653f52aba943e27292b68d6005d996 (patch) | |
| tree | 460bf8f9b1fd7d7cfd64816d45929bbbd3891ef3 | |
| parent | 5f43b20d334b56392e36810c85bedea9f5196751 (diff) | |
| download | perlweeklychallenge-club-3530508680653f52aba943e27292b68d6005d996.tar.gz perlweeklychallenge-club-3530508680653f52aba943e27292b68d6005d996.tar.bz2 perlweeklychallenge-club-3530508680653f52aba943e27292b68d6005d996.zip | |
Create ch-2.pl
| -rw-r--r-- | challenge-209/james-smith/perl/ch-2.pl | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/challenge-209/james-smith/perl/ch-2.pl b/challenge-209/james-smith/perl/ch-2.pl new file mode 100644 index 0000000000..458f0b80ca --- /dev/null +++ b/challenge-209/james-smith/perl/ch-2.pl @@ -0,0 +1,57 @@ +#!/usr/local/bin/perl + +use strict; +use warnings; +use feature qw(say); +use Test::More; +use Benchmark qw(cmpthese timethis); +use Data::Dumper qw(Dumper); + +my @ACC = ( + [ ['A', 'a1@a.com', 'a2@a.com'], + ['B', 'b1@b.com'], + ['A', 'a3@a.com', 'a1@a.com'] ], + [ ['A', 'a1@a.com', 'a2@a.com'], + ['B', 'b1@b.com'], + ['A', 'a3@a.com'], + ['B', 'b2@b.com', 'b1@b.com'] ], + [ ['A', 'a1@a.com', 'a2@a.com'], + ['A', 'a3@a.com', 'a4@a.com'], + ['A', 'a2@a.com', 'a4@a.com'] ], + [ ['A', 'a1@a.com', 'a2@a.com'], + ['A', 'a2@a.com', 'a3@a.com'], + ['A', 'a3@a.com', 'a4@a.com'], + ['A', 'a4@a.com', 'a5@a.com'], + ['A', 'a5@a.com', 'a6@a.com'] ], + [ ['A', 'a1@a.com', 'a2@a.com'], + ['A', 'a3@a.com', 'a4@a.com'], + ['A', 'a5@a.com', 'a6@a.com'], + ['A', 'a7@a.com', 'a8@a.com'], + ['A', 'a1@a.com', 'a3@a.com'], + ['A', 'a5@a.com', 'a7@a.com'], + ['A', 'a1@a.com', 'a5@a.com'] ], +); + +say Dumper(merge_accounts( $_ )) for @ACC; + +sub merge_accounts { + my($in,$out,%seen,$t) = ([],shift); + while(@{$out}!=@{$in}) { + ($in,$out,%seen) = ($out,[]); + O: for my $acc (@{$in}) { + my( $name, @e )=@{ $acc }; + for(@e) { + if( exists $seen{$_} ) { + my( $m, @f ) = @{ $out->[ $t = $seen{$_} ] }; + my %T = map { $_=>1 } @e, @f; + $seen{$_} = $t for keys %T; + $out->[ $t ] = [ $m, keys %T ]; + next O; + } + } + $seen{$_} = @{$out} for @e; + push @{$out},$acc; + } + } + $out +} |
