in reply to Re^2: Finding Combinations of Pairs
in thread Finding Combinations of Pairs
It doesn't look too much like homework to me but another idea would be to use code obviously beyond that of the course?
#!/usr/bin/perl use strict; use warnings; my $file = $ARGV[0] or die "Usage: $0 <input_file>"; open(my $fh, '<', $file) or die "Unable to open '$file' for reading: $ +!"; my %pair; while (<$fh>) { tr/\r\n//d; my @word = sort split ' '; my $next = combo(2, @word); while (my @combo = $next->()) { my $key = join "\0", @combo; ++$pair{$key}; } } my $comp = sub { return $pair{$_[0]} > $pair{$_[1]} ? $_[0] : undef; } +; my $maxval = gen_reduce(compare => $comp); $maxval->($_) for keys %pair; print $maxval->(), "\n"; # taken from [id://393064] sub combo { my $by = shift; return sub { () } if ! $by || $by =~ /\D/ || @_ < $by; my @list = @_; my @position = (0 .. $by - 2, $by - 2); my @stop = @list - $by .. $#list; my $end_pos = $#position; my $done = undef; return sub { return () if $done; my $cur = $end_pos; { if ( ++$position[ $cur ] > $stop[ $cur ] ) { $position[ --$cur ]++; redo if $position[ $cur ] > $stop[ $cur ]; my $new_pos = $position[ $cur ]; @position[ $cur .. $end_pos ] = $new_pos .. $new_pos + + $by; } } $done = 1 if $position[0] == $stop[0]; return @list[ @position ]; } } # Taken from [id://492651] sub gen_reduce { my $usage = 'Usage: gen_reduce("initial" => $val, "compare" => $co +de_ref)'; die $usage if @_ % 2; my %opt = @_; die $usage if ! defined $opt{compare} || ref $opt{compare} ne 'COD +E'; my $compare = $opt{compare}; my $val = $opt{initial}; return sub { for ( @_ ) { $val = $_ if ! defined $val || $compare->($_, $val); } return $val; }; }
Cheers - L~R
|
---|