Permalink
Browse files

Implement tie breaks in overall rankings (part 1)

  • Loading branch information...
andreas-gruenbacher committed Oct 28, 2017
1 parent 24c7bb0 commit 03662742a70c586529938fe6f10f135bca4d4d37
Showing with 54 additions and 16 deletions.
  1. +13 −1 cgi-bin/ergebnisse/jahreswertung-ssi.pl
  2. +21 −6 create-db.sql
  3. +20 −9 lib/Jahreswertung.pm
@@ -263,6 +263,17 @@
$letzte_cfg->{wertungen}[$wertung - 1]{bezeichnung} = $row[0];
}
my $tie_break = {};
$sth = $dbh->prepare(q{
SELECT number, tie_break
FROM series_tie_break
WHERE serie = ?
});
$sth->execute($vareihe);
while (my @row = $sth->fetchrow_array) {
$tie_break->{$row[0]} = $row[1];
}
doc_h1 "$bezeichnung";
doc_h2 "Jahreswertung";
jahreswertung veranstaltungen => $veranstaltungen,
@@ -272,7 +283,8 @@
$klassenfarben ? (klassenfarben => $klassenfarben) : (),
spalten => [ @spalten ],
nach_relevanz => 1,
@klassen ? (klassen => \@klassen ) : ();
@klassen ? (klassen => \@klassen ) : (),
tie_break => $tie_break;
print "<p>Letzte Änderung: $mtime</p>\n"
if $mtime;
View
@@ -1,8 +1,8 @@
-- MySQL dump 10.16 Distrib 10.1.21-MariaDB, for Linux (x86_64)
-- MySQL dump 10.16 Distrib 10.1.26-MariaDB, for Linux (x86_64)
--
-- Host: localhost Database: localhost
-- Host: trialinfo Database: trialinfo
-- ------------------------------------------------------
-- Server version 10.1.21-MariaDB
-- Server version 10.1.26-MariaDB
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
@@ -259,8 +259,8 @@ DROP TABLE IF EXISTS `result_columns`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `result_columns` (
`id` int(11) NOT NULL,
`n` int(11) NOT NULL,
`id` int(11) NOT NULL DEFAULT '0',
`n` int(11) NOT NULL DEFAULT '0',
`name` varchar(20) DEFAULT NULL,
PRIMARY KEY (`id`,`n`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
@@ -486,6 +486,21 @@ CREATE TABLE `series_groups` (
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `series_tie_break`
--
DROP TABLE IF EXISTS `series_tie_break`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `series_tie_break` (
`serie` int(11) NOT NULL,
`number` int(11) NOT NULL,
`tie_break` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`serie`,`number`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `skipped_zones`
--
@@ -587,4 +602,4 @@ CREATE TABLE `zones` (
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-- Dump completed on 2017-06-12 20:19:11
-- Dump completed on 2017-10-28 22:07:04
View
@@ -50,13 +50,21 @@ sub wertungsrang_cmp($$) {
return $a <=> $b;
}
sub jahreswertung_cmp($$;$) {
my ($aa, $bb, $rang_zuweisen) = @_;
sub jahreswertung_cmp($$$;$) {
my ($aa, $bb, $tie_break, $rang_zuweisen) = @_;
# Höhere Gesamtpunkte (nach Abzug der Streichpunkte) gewinnen
return $bb->{gesamtpunkte} <=> $aa->{gesamtpunkte}
if $aa->{gesamtpunkte} != $bb->{gesamtpunkte};
if (%$tie_break) {
my $tie_aa = $tie_break->{$aa->{startnummer}};
my $tie_bb = $tie_break->{$bb->{startnummer}};
return $tie_aa <=> $tie_bb
if $tie_aa && $tie_bb;
}
# Laut Telefonat am 22.10.2014 mit Martin Suchy (OSK): Wenn Fahrer
# punktegleich sind, werden sie in der Ergebnisliste anhand der besseren
# Platzierungen gereiht. Der Rang wird allerdings nur dann "aufgelöst",
@@ -108,15 +116,18 @@ sub jahreswertung_cmp($$;$) {
$aa->{streichpunkte_wichtig}++
if $bb->{streichpunkte_wichtig};
# TODO: Ist auch dann noch keine Differenzierung möglich, wird der
# Folgende Regel ist nicht implementiert, und muss als explizite Reihung
# definiert werden (Tabelle series_tie_break):
#
# Ist auch dann noch keine Differenzierung möglich, wird der
# OSK-Prädikatstitel dem Fahrer zuerkannt, der den letzten wertbaren Lauf
# zu dem entsprechenden Bewerb gewonnen hat.
return $cmp;
}
sub jahreswertung_berechnen($$$) {
my ($jahreswertung, $laeufe_gesamt, $streichresultate) = @_;
sub jahreswertung_berechnen($$$$) {
my ($jahreswertung, $laeufe_gesamt, $streichresultate, $tie_break) = @_;
foreach my $klasse (keys %$jahreswertung) {
foreach my $startnummer (keys %{$jahreswertung->{$klasse}}) {
@@ -153,10 +164,10 @@ sub jahreswertung_berechnen($$$) {
# Gesamtrang berechnen
my $gesamtrang = 1;
my $vorheriger_fahrer;
foreach my $fahrer (sort { jahreswertung_cmp($a, $b) } @$fahrer_in_klasse) {
foreach my $fahrer (sort { jahreswertung_cmp($a, $b, $tie_break) } @$fahrer_in_klasse) {
$fahrer->{gesamtrang} =
$vorheriger_fahrer &&
jahreswertung_cmp($vorheriger_fahrer, $fahrer, 1) == 0 ?
jahreswertung_cmp($vorheriger_fahrer, $fahrer, $tie_break, 1) == 0 ?
$vorheriger_fahrer->{gesamtrang} : $gesamtrang;
$gesamtrang++;
$vorheriger_fahrer = $fahrer;
@@ -200,7 +211,7 @@ sub jahreswertung_zusammenfassung($$$$) {
sub jahreswertung(@) {
# veranstaltungen wertung laeufe_gesamt streichresultate klassenfarben
# spalten klassen nach_relevanz
# spalten klassen nach_relevanz tie_break
my %args = (
klassenfarben => $Auswertung::klassenfarben,
@_,
@@ -330,7 +341,7 @@ sub jahreswertung(@) {
my $letzte_cfg = $args{veranstaltungen}[@{$args{veranstaltungen}} - 1][0];
jahreswertung_berechnen $jahreswertung, $args{laeufe_gesamt}, $args{streichresultate};
jahreswertung_berechnen $jahreswertung, $args{laeufe_gesamt}, $args{streichresultate}, $args{tie_break};
my $zusammenfassung;
foreach my $klasse (keys %$jahreswertung) {

0 comments on commit 0366274

Please sign in to comment.