In haar Novembernummer van 2011 publiceerde NWT Magazine1 onderstaande Metrokaart der exacte wetenschap. De uitdaging van deze opgave bestaat erin om nieuwe gegevenstypes aan JavaScript toe te voegen die toelaten om dergelijke metrokaarten op te stellen, uit te breiden en te bevragen. Een metrokaart is opgebouwd uit een aantal metrolijnen die verschillende metrostations in een vaste volgorde met elkaar verbinden. Het verkeer op een metrolijn verloopt dus in één richting, en bij deze opgave vormen metrolijnen ook nooit een lus. Sommige metrostations kunnen wel op verschillende metrolijnen liggen, zodat daar van de ene op de andere lijn kan overgestapt worden.

metrokaart der exacte wetenschap
Metrokaart der exacte wetenschap

Opgave

Station

Definieer een klasse Station waarmee de metrostations op een metrokaart kunnen voorgesteld worden. Bij het aanmaken van een niuew metrostation (Station) moeten drie strings (String) doorgegeven worden die respectievelijk de naam, het jaartal van oprichting en een korte omschrijving van het metrostation aanduiden (het jaartal kan ook beschreven worden door bv. 6e eeuw v. Chr.). Deze argumenten moeten respectievelijk toegekend worden aan de attributen naam, jaar en omschrijving van het nieuw aangemaakte metrostation (Station).

Vanuit elk metrostation kan je vertrekken naar nul of meer andere metrostations, maar elk van deze uitgaande verbindingen liggen op een verschillende metrolijn. Hierdoor kan een metrostation (Station) schematisch voorgesteld worden als:

metrostation
Schematische voorstelling van de objecten van de klasse Station.

Voorts moeten op een metrostation $$s$$ (Station) minstens de volgende methoden kunnen aangeroepen worden:

Voorbeeld

> const station1 = new Station("James Watson", "1953", "opheldering DNA-structuur")
> station1.naam
"James Watson"
> station1.jaar
"1953"
> station1.omschrijving
"opheldering DNA-structuur"
> station1.toString()
"James Watson (1953, opheldering DNA-structuur)"
> station1.metrolijnen()
[]
> const station2 = new Station("Ernst Mayr", "1942", "biologische soorten")
> station2.toString()
"Ernst Mayr (1942, biologische soorten)"
> station1.verbind("biologie", station2)
> station1.metrolijnen()
["biologie"]
> station1.volgende("biologie").toString()
"Ernst Mayr (1942, biologische soorten)"
> station1.volgende("chemie")
> const station3 = new Station("Marshall Warren Nirenberg", "1962", "genetische code")
> const station4 = new Station("Ilya Prigogine", "1955", "zelf-organisatie en niet-evenwicht")
> station1.verbind("chemie", station3)
> station1.verbind("chemie", station4)
Error: station is reeds verbonden op lijn chemie
> station1.verbind("genomica", station4)
> station1.metrolijnen()
["biologie", "chemie", "genomica"]
> station1.volgende("chemie").toString()
"Marshall Warren Nirenberg (1962, genetische code)"
> station1.volgende("genomica").toString()
"Ilya Prigogine (1955, zelf-organisatie en niet-evenwicht)"

Metrokaart

Definieer ook nog een klasse Metrokaart waarmee metrokaarten kunnen voorgesteld worden. Metrokaarten zijn opgebouwd uit een aantal metrolijnen die verschillende metrostations in een vaste volgorde met elkaar verbinden. Bij het aanmaken van een nieuwe metrokaart (Metrokaart) moeten geen argumenten doorgegeven worden. Op een metrokaart $$k$$ (Metrokaart) moeten minstens de volgende methoden kunnen aangeroepen worden:

Voorbeeld

> const kaart = new Metrokaart()
> kaart.uitbreiden("genomica", new Station("James Watson", "1953", "opheldering DNA-structuur"))
> kaart.uitbreiden("genomica", new Station("Marshall Warren Nirenberg", "1962", "genetische code"))
> kaart.uitbreiden("genomica", new Station("Frederick Sanger", "1977", "sequencing"))
> kaart.beginstation("genomica").toString()
"James Watson (1953, opheldering DNA-structuur)"
> kaart.eindstation("genomica").toString()
"Frederick Sanger (1977, sequencing)"
> kaart.metrolijn("genomica")
["James Watson", "Marshall Warren Nirenberg", "Frederick Sanger"]
> kaart.uitbreiden("chemie", new Station("Robert Boyle", "1661", "The Sceptical Chymist"))
> kaart.beginstation("chemie").toString()
"Robert Boyle (1661, The Sceptical Chymist)"
> kaart.eindstation("chemie").toString()
"Robert Boyle (1661, The Sceptical Chymist)"
> kaart.metrolijn("chemie")
["Robert Boyle"]