De decatlon of tienkamp is een gecombineerd atletieknummer dat bestaat uit tien verschillende disciplines. De term vindt zijn oorsprong in de samenstelling van de Griekse woorden δέκα (déka, wat "tien" betekent) en ἄθλος (áthlos, of ἄθλον, áthlon, wat "daad, prestatie" betekent). Een tienkamp wordt doorgaans enkel door mannelijk atleten bestreden, terwijl vrouwelijke atleten elkaar bekampen in een heptatlon of zevenkamp.
De atletieknummers van een tienkamp worden afgewerkt over twee opeenvolgende dagen en de winnaars worden bepaald op basis van de prestaties over alle disciplines heen. De prestaties worden beoordeeld volgens een puntensysteem voor elke individuele discipline, en niet volgens de rangschikking voor de individuele nummers. Hierbij worden voor elke discipline drie parameters $$a$$, $$b$$ en $$c \in \mathbb{R}^{+}$$ vastgelegd, en wordt de score voor een prestatie $$p$$ voor die discipline berekend op basis van de volgende formules:
score = $$\left \lfloor{a(b - p)^c}\right \rfloor $$ voor loopnummers (snellere tijd resulteert in een hogere score)
score = $$\left \lfloor{a(p - b)^c}\right \rfloor $$ voor sprong- en werpnummers (grotere afstand of hoogte resulteert in een hogere score)
Hierbij staat $$\left \lfloor{x}\right \rfloor \in \mathbb{N}$$ voor het geheel deel van $$x \in \mathbb{R}^{+}$$ en wordt de prestatie $$p$$ voor een bepaalde discipline uitgedrukt in seconden (loopnummers), meters (werpnummers) of centimeters (sprongnummers). Voor de olympische tienkamp wordt bijvoorbeeld gebruikgemaakt van de volgende parameters:
discipline | $$a$$ | $$b$$ | $$c$$ |
---|---|---|---|
100 m | 25.4347 | 18 | 1.81 |
verspringen | 0.14354 | 220 | 1.4 |
kogelstoten | 51.39 | 1.5 | 1.05 |
hoogspringen | 0.8465 | 75 | 1.42 |
400 m | 1.53775 | 82 | 1.81 |
110 m horden | 5.74352 | 28.5 | 1.92 |
discuswerpen | 12.91 | 4 | 1.1 |
polsstokspringen | 0.2797 | 100 | 1.35 |
speerwerpen | 10.14 | 7 | 1.08 |
1500 m | 0.03768 | 480 | 1.85 |
De traditie wil dat de atleet die de olympische tienkamp wint voor vier jaar de titel van "Beste Atleet ter Wereld1" mag dragen. Aan de basis hiervoor lag de uitspraak van koning Gustav V van Zweden bij de overwinning van Jim Thorpe in de tienkamp tijdens de olympische spelen van 1912 in Stockholm: "You, sir, are the world's greatest athlete". De huidige wereldrecordhouder in de tienkamp is de Amerikaan Ashton Eaton, die 9045 punten behaalde bij het IAAF Wereldkampioenschap in 2015.
In deze opgave werken we met twee soorten tekstbestanden, die regels bevatten met velden die van elkaar gescheiden worden door komma's (,). Tekstbestanden met parameters voor disciplines beschrijven de parameters die gebruikt worden voor de berekening van de score voor een bepaalde discipline. Elke regel bevat de naam van een discipline, de parameters $$a$$, $$b$$ en $$c \in \mathbb{R}^{+}$$, en een veld met daarin de tekst ja indien het een loopnummer betreft en de tekst neen indien het een sprong- of werpnummer betreft. Voor de disciplines van de tienkamp ziet het tekstbestand er bijvoorbeeld als volgt uit.
100 m,25.4347,18,1.81,ja verspringen,0.14354,220,1.4,neen kogelstoten,51.39,1.5,1.05,neen hoogspringen,0.8465,75,1.42,neen 400 m,1.53775,82,1.81,ja 110 m horden,5.74352,28.5,1.92,ja discuswerpen,12.91,4,1.1,neen polsstokspringen,0.2797,100,1.35,neen speerwerpen,10.14,7,1.08,neen 1500 m,0.03768,480,1.85,ja
Tekstbestanden met prestaties voor disciplines beschrijven de prestaties die een atleet geleverd heeft voor een aantal disciplines van een meerkamp (bijvoorbeeld een decatlon of een heptatlon). Elke regel bevat de naam van een discipline en de prestatie van de atleet voor die discipline. De prestaties worden uitgedrukt in seconden (loopnummers), meters (werpnummers) of centimeters (sprongnummers). Voor een reeks extreem goede prestaties voor de disciplines van de tienkamp (alle huidige wereldrecords van de individuele nummers) ziet het tekstbestand er bijvoorbeeld als volgt uit.
100 m,9.58 verspringen,895 kogelstoten,23.12 hoogspringen,245 400 m,43.18 110 m horden,12.87 discuswerpen,74.08 polsstokspringen,614 speerwerpen,98.48 1500 m,206.00
Gevraagd wordt:
Schrijf een functie parameters waaraan de locatie van een tekstbestand met parameters voor disciplines moet doorgegeven worden. De functie moet een dictionary teruggeven die de naam van elke discipline uit het bestand afbeeldt op een tuple met de parameters voor die discipline: de waarden $$a$$, $$b$$ en $$c$$ als drie floating point getallen en een Booleaanse waarde die aangeeft of de discipline een loopnummer is.
Schrijf een functie score waaraan drie argumenten moeten doorgegeven worden: de naam van een discipline (een string), een prestatie voor die discipline (een int of een float) en een dictionary die de namen van een aantal disciplines afbeeldt op tuples met de parameters voor die disciplines (conform de dictionaries die teruggegeven worden door de functie parameters). De functie moet de score (een int) teruggeven die bekomen wordt op basis van de gegeven prestatie voor de gegeven discipline, berekend volgens de scoreberekening die voor de tienkamp gebruikt wordt. Hiervoor moet de functie gebruikmaken van de parameters voor de disciplines uit de gegeven dictionary. Indien de gegeven dictionary de parameters van de gegeven discipline niet bevat, dan moet de functie een AssertionError opwerpen met de boodschap ongeldige discipline.
Schrijf een functie eindscore waaraan de locaties van twee tekstbestanden moeten doorgegeven worden: een bestand met prestaties voor disciplines en een bestand met parameters voor disciplines. De functie moet de totale score (een int) teruggeven op basis van alle prestaties voor de disciplines uit het eerste tekstbestand. Indien dit tekstbestand een discipline bevat waarvan de parameters niet worden beschreven in het tweede tekstbestand, dan moet de functie een AssertionError opwerpen met de boodschap ongeldige discipline.
Bij onderstaande voorbeeldsessie gaan we ervan uit dat de tekstbestanden parameters.txt2 en prestaties.txt3 zich in de huidige directory bevinden.
>>> params = parameters('parameters.txt')
>>> params['100 m']
(25.4347, 18.0, 1.81, True)
>>> params['polsstokspringen']
(0.2797, 100.0, 1.35, False)
>>> score('100 m', 9.58, params)
1202
>>> score('polsstokspringen', 614, params)
1277
>>> score('diepzeeduiken', 614, params)
Traceback (most recent call last):
AssertionError: ongeldige discipline
>>> eindscore('prestaties.txt', 'parameters.txt')
12544