gimps-review/script.pl

92 lines
2.1 KiB
Perl
Raw Normal View History

2023-08-26 14:16:48 +00:00
use v5.32;
2023-08-26 14:20:14 +00:00
2023-08-26 14:16:48 +00:00
use HTML::TableExtract;
use File::Slurp;
use Data::Dumper;
use Text::SimpleTable::AutoWidth;
2023-08-26 14:20:14 +00:00
use WWW::Mechanize ();
2023-08-26 15:22:19 +00:00
use List::AllUtils qw/ sum pairmap /;
use List::UtilsBy qw/ nsort_by /;
2023-08-26 14:16:48 +00:00
use experimental qw/ signatures /;
unless(caller) {
my $ts = get_mersenne_results();
generate_output_table($ts)->draw;
}
sub get_mersenne_results() {
# log in to Mersenne.org and get results for the last year
# excluding everything but PHP and DD results
my $mech = WWW::Mechanize->new;
my $url =
'https://www.mersenne.org/results/?extf=1&exp1=1&execm=1&excert=1&exp_lo=2&exp_hi=&limit=10000';
$mech->get($url);
$mech->submit_form(
form_number => 1,
fields => {
user_login => $ENV{'MERSENNE_USER'},
user_password => $ENV{'MERSENNE_PASSWORD'},
} );
# load the results into a table object
my $html_string = $mech->content;
return extract_first_table($html_string);
}
sub extract_first_table($html) {
$html =~ s/\n//g;
my $te = HTML::TableExtract->new( depth => 0, count => 2 );
$te->parse($html);
return $te->first_table_found;
}
sub generate_output_table ($ts) {
2023-08-26 14:16:48 +00:00
# group GHZ Days results by computer, compute GHZ Days per Day (GHZ Days / Days)
my $list;
foreach my $row ( $ts->rows ) {
foreach my $cell ($row) {
2023-08-26 15:13:57 +00:00
my $machine = $cell->[0];
my $days = $cell->[4] =~ s/\s//gr;
my $ghz_days = $cell->[6] =~ s/\s//gr;
if ( $days > 0 ) {
my $perf = $ghz_days / $days;
2023-08-26 15:09:33 +00:00
push $list->{$machine}->@*, $perf;
}
2023-08-26 14:19:48 +00:00
}
}
2023-08-26 14:16:48 +00:00
2023-08-26 16:14:28 +00:00
# create hash with each computer and its average GHz Days per day
2023-08-26 15:22:19 +00:00
my %ranks = pairmap {
my $mean = sum( @$b ) / @$b;
my $rounded = int( $mean + 0.5 );
2023-08-26 15:22:19 +00:00
$a => $rounded;
} %$list;
2023-08-26 14:16:48 +00:00
# sort hash by the average and print to screen
2023-08-26 16:50:48 +00:00
my $tbl = Text::SimpleTable::AutoWidth->new(
captions => [qw/ Computer GHZDaysPerDay /] );
2023-08-26 16:50:48 +00:00
2023-08-26 15:22:19 +00:00
$tbl->row( @$_ ) for
reverse
nsort_by { $_->[1] }
pairmap { [$a,$b] }
%ranks;
2023-08-26 16:50:48 +00:00
return $tbl;
2023-08-26 14:16:48 +00:00
}