In een toernooi strijden $$2^n$$ ($$n \in \mathbb{N}$$) landen om de overwinning. Er wordt gewerkt met een knock-outsysteem dat loopt over $$n$$ ronden. In elke ronde worden alle landen aan een ander land gekoppeld: het eerst land speelt een wedstrijd tegen het tweede land, het derde land tegen het vierde land, enzoverder. De winnaar van elke wedstrijd gaat door naar de volgende ronde en voor de verliezer is het toernooi voorbij. Op die manier wordt het aantal landen bij elke ronde gehalveerd, en blijft er na $$n$$ ronden nog één land over. Dat land wint het toernooi.
In een knock-outsysteem moet elke wedstrijd een winnaar opleveren. Tijdens de reguliere speeltijd van een wedstrijd behaalt elk land een score: hoe hoger de score hoe beter. Als er na de reguliere speeltijd nog geen winnaar is, dan kunnen beide landen in de extra speeltijd hun score nog verhogen. Als er na de extra speeltijd nog altijd geen winnaar is, dan moeten penalties uitmaken wie de wedstrijd wint.
In onderstaand voorbeeld wordt de score na de reguliere speeltijd van elke wedstrijd aangegeven in het geel, en de score na de extra speeltijd in het grijs. In dit geval werd geen enkele wedstrijd beslist na het nemen van penalties.
Als land $$a$$ (met hoofdstad $$h_a$$) een wedstrijd speelt tegen land $$b$$ (met hoofdstad $$h_b$$) dan gebruiken we een vaste procedure om de winnaar te bepalen. Na de reguliere speeltijd is de score voor land $$a$$ gelijk aan het aantal overeenkomstige letters met hoofdstad $$h_b$$. Analoog is de score voor land $$b$$ gelijk aan het aantal overeenkomstige letters met hoofdstad $$h_a$$. Dit is inclusief dubbele letters. Enkele voorbeelden:
Switzerland (Bern) tegen Estonia (Tallinn). Switzerland scoort 5 doelpunten want de vijf vetgedrukte letters in Switzerland zitten ook in Tallinn. Estonia scoort 2 doelpunten omdat alleen de E en de N overeenkomen met de letters van Bern. De score na de reguliere speeltijd is dus 5–2 en Switzerland is de winnaar.
Saudi Arabia (Riyadh) tegen Bangladesh (Dhaka). Saudi Arabia scoort 3 doelpunten want we kunnen drie overeenkomstige letters vinden in Dhaka. Vetgedrukt ziet dat er zo uit: Saudi Arabia en Dhaka. Merk dus op dat de derde en vierde A in Saudi Arabia niet meegeteld worden, omdat de letter A slechts tweemaal voorkomt in Dhaka. Ook Bangladesh scoort 3 doelpunten, want alleen de letters A, D en H komen enkelvoudig voor in Riyadh. De score na de reguliere speeltijd is dus 3–3 en er volgt extra speeltijd.
In de extra speeltijd doen alle letters die potentieel overeenkomstig zijn ook mee. Dat is het makkelijkst uit te leggen aan de hand van enkele voorbeelden:
Saudi Arabia (Riyadh) tegen Bangladesh (Dhaka). Saudi Arabia en Dhaka hebben A en D als gemeenschappelijke letters. De letter A komt vier keer voor in Saudi Arabia en twee keer in Dhaka, waardoor de bijdrage van de letter A gelijk is aan $$4 \times 2 = 8$$. De letter D komt aan beide kanten maar één keer voor, en heeft dus een bijdrage van $$1 \times 1 = 1$$. Saudi Arabia heeft aan het einde van de extra speeltijd dus $$8 + 1 = 9$$ doelpunten gescoord. Bangladesh scoort een extra doelpunt vanwege de dubbele A en komt dus op een totaal van 4 doelpunten. De score na de extra speeltijd is dus 9–4 en Saudi Arabia is de winnaar.
Australia (Canberra) tegen Grenada (Saint George's) eindigt op 5–5 na de reguliere speeltijd. De letters A, E, N en R komen zowel in Grenada als in Canberra voor. De letter A komt tweemaal voor aan beide kanten en heeft dus een bijdrage $$2 \times 2$$. De letters E en N komen elk eenmaal voor aan beide kanten en hebben dus elk een bijdrage van $$1 \times 1$$. De letter R komt eenmaal voor in Grenada en tweemaal in Canberra en draagt dus $$1 \times 2$$ bij. Dit levert dus een score op van $$2 \times 2 + 1 \times 1 + 1 \times 1 + 1 \times 2 = 8$$. Andersom scoort Australia ook 8 punten in de extra speeltijd omwille van vijf gemeenschappelijk letters met Saint George's: A ($$3 \times 1$$), I ($$1 \times 1$$), R ($$1 \times 1$$), S ($$1 \times 2$$) en T ($$1 \times 1$$). Dit geeft een score van 8–8 na de extra speeltijd, en dus volgen er penalties.
Bij de penalties wint het land dat alfabetisch het eerst komt. In het laatste voorbeeld wint Australia dus op penalties tegen Grenada.
Definieer een functie letterfrequenties waaraan een string $$s$$ (String) moet doorgegeven worden. De functie moet een object (Object) teruggeven dat alle letters die voorkomen in $$s$$ afbeeldt op hun aantal voorkomens. Bij het tellen van het aantal voorkomens mag geen onderscheid gemaakt worden tussen hoofdletters en kleine letters, en in het object moeten de letters als hoofdletter voorgesteld worden. Als $$s$$ karakters bevat die geen letter zijn (A–Z), dan moeten die genegeerd worden.
Definieer daarnaast ook nog een klasse Knockout waarmee de knock-outfase van een landentoernooi kan gesimuleerd worden op basis van het scoresysteem uit de inleiding. Bij het aanmaken van een nieuw landentoernooi (Knockout) moeten geen argumenten doorgegeven worden.
Voorts moet je op een landentoernooi $$k$$ (Knockout) minstens de volgende methoden kunnen aanroepen:
Een methode landToevoegen waaraan een land aan toernooi
$$k$$ kan toegevoegd worden en waarmee meteen ook de hoofdstad van het
land vastgelegd wordt. De volgorde waarmee de landen aan toernooi
$$k$$ toegevoegd worden, bepaalt meteen de volgorde van de landen in
de eerste ronde van toernooi $$k$$. Aan de methode moeten twee
argumenten doorgegeven worden: i) een land (String)
en ii) de hoofdstad van het land (String). De
methode moet geen resultaat teruggeven.
Een methode hoofdstad waaraan de naam van een land
$$l$$ (String) moet doorgegeven worden. De methode moet
de naam van de hoofdstad van land $$l$$ teruggeven zoals die eerder
werd vastgelegd bij het aanroepen van de methode landToevoegen.
Een methode reguliereSpeeltijd waaraan twee landen $$l_1$$ en $$l_2$$ (String) moeten doorgegeven worden. De methode moet de score (Array) teruggeven na de reguliere speeltijd van een wedstrijd tussen de twee landen $$l_1$$ en $$l_2$$ in toernooi $$k$$.
Een methode extraSpeeltijd waaraan twee landen $$l_1$$ en $$l_2$$ (String) moeten doorgegeven worden. De methode moet de score (Array) teruggeven na de extra speeltijd van een wedstrijd tussen de twee landen $$l_1$$ en $$l_2$$.
Een methode wedstrijd waaraan twee landen $$l_1$$ en $$l_2$$ (String) moeten doorgegeven worden. De methode moet de winnaar (String) teruggeven in een wedstrijd tussen de twee landen $$l_1$$ en $$l_2$$.
Een methode winnaar waaraan geen argumenten moeten doorgegeven worden. Als er geen $$2^n$$ landen aan toernooi $$k$$ toegevoegd werden voor een zekere $$n \in \mathbb{N}$$, dan moet een Error opgeworpen worden met de boodschap ongeldig aantal landen. Anders moet de winnaar (String) van toernooi $$k$$ teruggegeven worden, waarbij de landen met een knock-outsysteem tegen elkaar strijden.
Als er aan de methoden hoofdstad, reguliereSpeeltijd, extraSpeeltijd of wedstrijd een land $$l$$ wordt doorgegeven dat niet eerder aan toernooi $$k$$ werd toegevoegd via de methode landToevoegen, dan moet een Error opgeworpen worden met de boodschap onbekend land.
> letterfrequenties("Russia")
{"A": 1, "I": 1, "R": 1, "S": 2, "U": 1}
> letterfrequenties("Moscou")
{"C": 1, "M": 1, "O": 2, "S": 1, "U": 1}
> letterfrequenties("Puerto Rico")
{"C": 1, "E": 1, "I": 1, "O": 2, "P": 1, "R": 2, "T": 1, "U": 1}
> letterfrequenties("Guinea-Bissau")
{"A": 2, "B": 1, "E": 1, "G": 1, "I": 2, "N": 1, "S": 2, "U": 2}
> const toernooi = new Knockout();
> toernooi.landToevoegen("Switzerland", "Bern")
> toernooi.landToevoegen("Estonia", "Tallinn")
> toernooi.landToevoegen("Belgium", "Brussels")
> toernooi.landToevoegen("Denmark", "Copenhagen")
> toernooi.landToevoegen("Portugal", "Lisbon")
> toernooi.landToevoegen("Austria", "Vienna")
> toernooi.landToevoegen("Netherlands", "Amsterdam")
> toernooi.landToevoegen("Lithuania", "Vilnius")
> toernooi.hoofdstad("Switzerland")
"Bern"
> toernooi.hoofdstad("Estonia")
"Tallinn"
> toernooi.hoofdstad("Utopia")
Error: onbekend land
> toernooi.reguliereSpeeltijd("Switzerland", "Estonia")
[5, 2]
> toernooi.reguliereSpeeltijd("Belgium", "Denmark")
[2, 2]
> toernooi.reguliereSpeeltijd("Portugal", "Austria")
[1, 2]
> toernooi.reguliereSpeeltijd("Netherlands", "Lithuania")
[3, 3]
> toernooi.extraSpeeltijd("Belgium", "Denmark")
[3, 2]
> toernooi.extraSpeeltijd("Netherlands", "Lithuania")
[4, 5]
> toernooi.wedstrijd("Switzerland", "Estonia")
"Switzerland"
> toernooi.wedstrijd("Belgium", "Denmark")
"Belgium"
> toernooi.wedstrijd("Portugal", "Austria")
"Austria"
> toernooi.wedstrijd("Netherlands", "Lithuania")
"Lithuania"
> toernooi.winnaar()
"Switzerland"