De vierkleurenstelling is een stelling uit de wiskunde die zegt dat het mogelijk is om elke willekeurige landkaart waarin de landen elk een geheel vormen (dus zonder exclaves), met behulp van slechts vier kleuren zo kunnen ingekleurd worden dat geen twee aangrenzende landen dezelfde kleur krijgen. Twee landen gelden hierbij als aangrenzend als ze een stuk grens gemeen hebben, niet als ze slechts met een punt aan elkaar verbonden zijn. Dat het met minder dan vier kleuren niet mogelijk is, zie je direct in onderstaande kaart met Luxemburg, Duitsland, Frankrijk en Belgiƫ. Elk land grenst aan alle andere landen, dus zijn er minstens vier kleuren nodig.
Definieer een klasse Landkaart waarmee ingekleurde landkaarten kunnen voorgesteld worden. De objecten van deze klasse moeten minstens over de volgende methoden beschikken:
Een initialisatiemethode die toelaat om objecten te initialiseren op basis van twee gegeven tekstbestanden. De bestandslocaties van deze twee bestanden moeten doorgegeven worden bij het aanmaken van een nieuw object. Het eerste bestand bevat een lijst van alle landen en de kleur waarmee de landen werden ingekleurd. Elke regel van het bestand bevat de naam van een land en de naam van een kleur, van elkaar gescheiden door een tab. Het tweede bestand bevat een lijst van alle buurlanden. Elke regel van het bestand bevat de namen van twee buurlanden, van elkaar gescheiden door een tab.
Een methode aantalLanden die teruggeeft hoeveel verschillende landen er op de landkaart voorkomen. Er moeten geen argumenten aan deze methode doorgegeven worden.
Een methode aantalKleuren die teruggeeft hoeveel verschillende kleuren er gebruikt werden om de landen op de landkaart in te kleuren. Er moeten geen argumenten aan deze methode doorgegeven worden.
Een methode kleur waaraan de naam van een land moet doorgegeven worden. De methode moet de kleur teruggeven waarmee het land op de kaart werd ingekleurd.
Een methode buren waaraan de naam van een land moet doorgegeven worden. De methode moet een verzameling teruggeven die alle buurlanden bevat van het opgegeven land.
Een methode zijnBuren waaraan de namen van twee landen moeten doorgegeven worden. De methode moet een Booleaanse waarde teruggeven, die aangeeft of de twee landen al dan niet buurlanden zijn op de kaart.
Een methode ongeldigeBuren waaraan geen argumenten moeten doorgegeven worden. De methode moet een lijst van alle buurlanden teruggeven die met dezelfde kleur werden ingekleurd op de kaart. Elk element van deze lijst is een tuple van drie elementen, waarvan de eerste twee elementen namen van buurlanden voorstellen die met dezelfde kleur werden ingekleurd. Deze kleur is dan het derde element van het tuple. De namen van de buurlanden moeten alfabetisch gerangschikt staan in de tuples, en de lijst moet gesorteerd zijn, eerst op naam van het eerste land en vervolgens op naam van het tweede land.
Telkens wanneer de naam van een land als argument aan een methode doorgegeven wordt, moet de methode nagaan of die naam voorkwam in de lijst van landen uit het eerste tekstbestand dat werd doorgegeven bij het aanmaken van het object van de klasse Landkaart. Indien dit niet het geval is, dan moet de methode een AssertionError opwerpen met de tekst onbekend land.
Bij onderstaande voorbeeldsessie gaan we ervan uit dat de tekstbestanden kleuren1.txt1, kleuren2.txt2 en buurlanden.txt3 zich in de huidige directory bevinden.
>>> kaart = Landkaart('kleuren1.txt', 'buurlanden.txt')
>>> kaart.aantalLanden()
208
>>> kaart.aantalKleuren()
5
>>> kaart.kleur('Belgium')
'rood'
>>> kaart.buren('Belgium')
{'Netherlands', 'Germany', 'Luxembourg', 'France'}
>>> kaart.zijnBuren('Belgium', 'Germany')
True
>>> kaart.zijnBuren('Belgium', 'Italy')
False
>>> kaart.ongeldigeBuren()
[]
>>> kaart = Landkaart('kleuren2.txt', 'buurlanden.txt')
>>> kaart.ongeldigeBuren()
[('Angola', 'Democratic Republic of the Congo', 'blauw'), ('Democratic Republic of the Congo', 'Uganda', 'blauw')]
>>> kaart.kleur('Oz')
Traceback (most recent call last):
AssertionError: onbekend land
>>> kaart.buren('Oz')
Traceback (most recent call last):
AssertionError: onbekend land
>>> kaart.zijnBuren('Belgium', 'Oz')
Traceback (most recent call last):
AssertionError: onbekend land
>>> kaart.zijnBuren('Oz', 'Belgium')
Traceback (most recent call last):
AssertionError: onbekend land