X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=www%2Findex.pl;h=c7cfa40bd53c66e87d68193e2efa022b6cfb43d9;hb=109dc952389552095f89feb9550853d49848377a;hp=ecac609acdef31d01988f3e9edb7b7224bcf5b06;hpb=857cc32e56d1300592f7b285fca6b0c4b9381a2f;p=wloh diff --git a/www/index.pl b/www/index.pl index ecac609..c7cfa40 100755 --- a/www/index.pl +++ b/www/index.pl @@ -7,6 +7,9 @@ use CGI::Carp qw( fatalsToBrowser ); use DBI; use POSIX; use Devel::Peek; +use HTML::Entities; +use Encode; +use utf8; use locale; require '../config.pm'; @@ -23,14 +26,13 @@ binmode STDOUT, ':utf8'; my %players = (); my %ratings = (); +my %ratings_stddev = (); my @matches = (); my %parms = (); my $match_stddev; sub sanitize { - $_ = shift; - y/ \t\n<>&/_/; - return $_; + return HTML::Entities::encode_entities(shift); } sub color { @@ -39,7 +41,7 @@ sub color { } sub make_table { - my $used_ratings = shift; + my ($lowest_division, $used_ratings, $used_ratings_stddev) = @_; print <<"EOF"; @@ -58,11 +60,9 @@ EOF printf MCCALC "%d\n", scalar keys %players; for my $id (keys %players) { - if (exists($used_ratings->{$id})) { - printf MCCALC "%s %f\n", $id, $used_ratings->{$id}; - } else { - printf MCCALC "%s %f\n", $id, 1500.0; - } + my $rating = $used_ratings->{$id} // 1500.0; + my $rating_stddev = $used_ratings_stddev->{$id} // $parms{-3}; + printf MCCALC "%s %f %f\n", $id, $rating, $rating_stddev; } for my $match (@matches) { @@ -80,7 +80,7 @@ EOF chomp; my @x = split /\s+/; my $id = $x[0]; - my $player = $players{$id}; + my $player = sprintf "%s (%.0f ± %.0f)", $players{$id}, ($ratings{$id} // 1500.0), ($ratings_stddev{$id} // $parms{-3}); $prob{$player} = [ @x[1..$#x] ]; } close MCCALC; @@ -90,7 +90,7 @@ EOF for my $i (1..$num_games) { print " $i.\n"; } - print " NEDRYKK\n"; + print " NEDRYKK\n" unless ($lowest_division); print " \n"; for my $player (sort { $a cmp $b } keys %prob) { @@ -106,20 +106,20 @@ EOF if ($i == 1) { ($g, $b) = ($b, $g); - } elsif ($i >= $num_games - 1) { + } elsif ($i >= $num_games - 1 && !$lowest_division) { ($r, $b) = ($b, $r); } - printf " %.1f%%\n", $pn * 100.0; + printf " %.1f%%\n", $pn * 100.0; } - { + unless ($lowest_division) { my $pn = ($prob{$player}->[$num_games - 1] + $prob{$player}->[$num_games - 2]) / $trials; my $r = color(1.0); my $g = color(1.0 - $pn / 3); my $b = color(1.0 - $pn / 3); - printf " %.1f%%\n", $pn * 100.0; + printf " %.1f%%\n", $pn * 100.0; } print " \n"; } @@ -138,39 +138,30 @@ while (my $ref = $q->fetchrow_hashref) { } $match_stddev = $parms{-2} * sqrt(2.0); -my $season = $cgi->param('sesong') // -1; +my $season; my $division = $cgi->param('divisjon') // -1; my $subdivision = $cgi->param('avdeling') // -1; +my $last_division = 0; POSIX::setlocale(&POSIX::LC_ALL, 'nb_NO.UTF-8'); -print $cgi->header(-type=>'text/html; charset=utf-8', -expires=>'Thu, 01 Dec 1994 16:00:00 GMT'); +print $cgi->header(-type=>'text/html; charset=utf-8', -expires=>'now'); printf <<"EOF", $match_stddev; - + + + WLoH-plasseringsannsynlighetsberegning - +

WLoH-plasseringsannsynlighetsberegning

+

Dette er et hobbyprosjekt fra tredjepart, og ikke en offisiell del av + Wordfeud Leage of Honour.

+

Beregningen tar ikke hensyn til ujevn spillestyrke, ting som er sagt i forumet e.l.; den antar at samtlige uspilte kamper trekkes fra en normalfordeling med standardavvik %.1f poeng. Sannsynlighetene kan summere til andre tall enn 100%% pga. avrunding. @@ -179,40 +170,25 @@ td {

Spillerne er sortert etter nick.

-

Sesong: - - Divisjon: - EOF $q = $dbh->prepare('SELECT DISTINCT(divisjon) FROM fotballserier WHERE sesong=? ORDER BY divisjon'); $q->execute($season); my $found_division = 0; +my $max_division; while (my $ref = $q->fetchrow_hashref) { my $d = $ref->{'divisjon'}; @@ -222,6 +198,7 @@ while (my $ref = $q->fetchrow_hashref) { } else { print " \n"; } + $max_division = $d; } $division = 1 if (!$found_division); @@ -229,7 +206,7 @@ $division = 1 if (!$found_division); print <<"EOF"; Avdeling: - EOF $q = $dbh->prepare('SELECT DISTINCT(avdeling) FROM fotballserier WHERE sesong=? AND divisjon=? ORDER BY avdeling'); @@ -257,13 +234,14 @@ print <<"EOF"; EOF # Get players and ratings -$q = $dbh->prepare('SELECT fotballdeltagere.id,fotballdeltagere.navn,rating FROM fotballdeltagere JOIN fotballserier ON fotballdeltagere.serie=fotballserier.nr JOIN ratings ON fotballdeltagere.id=ratings.id AND sesong=? AND divisjon=? AND avdeling=?'); +$q = $dbh->prepare('SELECT fotballdeltagere.id,fotballdeltagere.navn,rating,rating_stddev FROM fotballdeltagere JOIN fotballserier ON fotballdeltagere.serie=fotballserier.nr LEFT JOIN ratings ON fotballdeltagere.id=ratings.id WHERE sesong=? AND divisjon=? AND avdeling=?'); $q->execute($season, $division, $subdivision); while (my $ref = $q->fetchrow_hashref) { my $id = $ref->{'id'}; - $players{$id} = sanitize($ref->{'navn'}); + $players{$id} = sanitize(Encode::decode_utf8($ref->{'navn'})); $ratings{$id} = $ref->{'rating'}; + $ratings_stddev{$id} = $ref->{'rating_stddev'}; } $q->finish; @@ -285,19 +263,17 @@ while (my $ref = $q->fetchrow_hashref) { } $q->finish; - -make_table({}); +my $lowest_division = ($division == $max_division); +make_table($lowest_division, {}, {}); print <<"EOF"; -

Under er en variant som prøver å ta relativ spillestyrke med i betraktningen. - Disse er basert på WLoH-data og oppdateres hver hele time (takk til Lobotommy for tilgang!), - men modellen er foreløpig ikke fullstendig tunet.

+

Under er en variant som tar relativ spillestyrke med i beregningen; + se ratingsiden.

EOF -make_table(\%ratings); +make_table($lowest_division, \%ratings, \%ratings_stddev); print << "EOF"; - EOF