Een rangeerterrein is een stelplaats waar goederentreinen in delen gesplitst en opnieuw samengesteld kunnen worden. Dergelijke rangeerterreinen vind je doorgaans in de buurt van spoorwegknooppunten, industriegebieden en havens.

Het goederenvervoer per spoor onderging sinds de jaren zestig een schaalvergroting. Waar vroeger slechts één of enkele goederenwagons voldoende waren voor een levering, rijden bloktreinen tegenwoordig in hun geheel van herkomst naar bestemming. Daardoor is rangeren onderweg niet meer nodig. Samen met een algemene daling van goederenvervoer per spoor heeft dit wereldwijd geleid tot de sluiting van veel rangeerterreinen.
We modelleren een rangeerterrein naar het beeld van onderstaande figuur. Aan de linkerkant van het terrein bevindt zich een rangeerzone met een maximale capaciteit van $$c$$ rijtuigen. Uiterst links op het spoor van de rangeerzone staat altijd een locomotief, waarachter tot $$c - 1$$ wagons kunnen geplaatst worden. Aan de rechterkant van het terrein bevinden er zich twee of meer standplaatsen. De sporen van die standplaatsen worden van boven naar onder genummerd vanaf nul. Het spoor van elke standplaats heeft een maximale capaciteit van $$c$$ rijtuigen. Wagons worden altijd tegen elkaar geparkeerd aan de rechterkant van een standplaats. De rangeerzone wordt met elke standplaats verbonden via een systeem van wissels, die kunnen gebruikt worden om de samenstelling van de wagons achter de locomotief te wijzigen.

Via de wissels kan men $$n$$ wagons ophalen vanaf een bepaalde standplaats $$i$$. Daarbij worden de eerste $$n$$ wagons (aan de linkerkant) van de standplaats verplaatst naar de achterkant (aan de rechterkant) van de rangeerzone, waarbij de volgorde van de wagons niet wijzigt. Uiteraard kan het aantal wagons dat opgehaald wordt niet groter zijn dan het aantal wagons dat op standplaats $$i$$ geparkeerd stond. Ook de maximale capaciteit $$c$$ van de rangeerzone mag niet overschreden worden, rekening houdend met het feit dat daar al een locomotief en eventueel ook wagons stonden.
Via de wissels kan men ook $$n$$ wagons wegzetten naar een bepaalde standplaats $$i$$. Daarbij worden de laatste $$n$$ wagons (aan de rechterkant) van de rangeerzone verplaatst naar de voorkant (aan de linkerkant) van standplaats $$i$$, waarbij de volgorde van de wagons niet wijzigt. Uiteraard kan het aantal wagons dat weggezet wordt niet groter zijn dan het aantal wagons dat op de rangeerzone staat. De locomotief kan niet weggezet worden. Ook de maximale capaciteit $$c$$ van standplaats $$i$$ mag niet overschreden worden, rekening houdend met het feit dat daar eventueel al wagons geparkeerd stonden.
Definieer een klasse Rangeerterrein waarmee de samenstelling van de wagons achter een locomotief kan gewijzigd worden op een rangeerterrein naar bovenstaand model. Bij het aanmaken van een nieuw rangeerterrein (Rangeerterrein) moet een reeks (Array) doorgegeven worden met de wagons die op de standplaatsen van het terrein geparkeerd staan. Daarbij worden de standplaatsen van boven naar onder opgelijst, en geeft de lengte van de reeks meteen ook aan hoeveel standplaatsen er zijn. Het aantal wagons dat op een standplaats geparkeerd staat — en hun volgorde — wordt voorgesteld als een string (String) van hoofdletters. Daarbij stelt elke hoofdletter een wagon voor. Het is mogelijk dat meerdere wagons op het terrein door dezelfde hoofdletter voorgesteld worden. Er is ook een optionele parameter locomotief waaraan een string (String) kan doorgegeven worden die op dezelfde manier aangeeft hoeveel — en in welke volgorde — wagons er op de rangeerzone achter de locomotief staan. Als er niet expliciet een waarde wordt doorgegeven aan deze parameter, dan staan er geen wagons achter de locomotief. Er is ook een optionele parameter capaciteit waarmee de maximale capaciteit $$c$$ (Number; standaardwaarde: 10) van de rangeerzone en van de standplaatsen kan ingesteld worden. Als het nieuw aangemaakte rangeerterrein minder dan twee standplaatsen zou hebben, of als de capaciteit van de rangeerzone of één van de standplaatsen zou overschreden worden, dan moet een Error opgeworpen worden met de boodschap ongeldige configuratie.
Een rangeerterrein $$r$$ (Rangeerterrein) moet een getter (of eigenschap) bezetting hebben, die het aantal wagons (Number) teruggeeft die op de standplaatsen van rangeerterrein $$r$$ geparkeerd staan. De wagons die op de rangeerzone achter de locomotief staan, moeten daarbij dus niet meegeteld worden.
Daarnaast moet je op een rangeerterrein $$r$$ (Rangeerterrein) minstens de volgende methoden kunnen aanroepen:
Een methode toString waaraan geen argumenten moeten doorgegeven worden. De methode moet een stringvoorstelling (String) van rangeerterrein $$r$$ teruggeven. Het spoorsegment waarop de locomotief staat wordt aangeduid met een zwart vierkantje (■), een spoorsegment waarop een wagon staat door de hoofdletter die de wagon voorstelt, en een leeg spoorsegment (met de lengte van een rijtuig) van de rangeerzone of een standplaats door een horizontale streep (━). Er worden specifieke voorstellingen gebruikt voor de wissel ter hoogte van de bovenste standplaats (┳), de wissel ter hoogte van de onderste standplaats (┗) en de wissels ter hoogte van de tussenliggende standplaatsen (┣). De lege zone links van de standplaatsen 1, 2, … wordt ingevuld met spaties.
Een methode ophalen waaraan twee natuurlijke getallen $$n$$ en $$i$$ (Number) moeten doorgegeven worden. Als het niet mogelijk is om $$n$$ wagons op te halen vanaf standplaats $$i$$, dan moet een Error opgeworpen worden met de boodschap ongeldige actie, en mag de configuratie van terrein $$r$$ niet wijzigen. Anders moet de configuratie van terrein $$r$$ wijzigen naar de toestand nadat $$n$$ wagons opgehaald werden vanaf standplaats $$i$$, en moet er een verwijzing naar rangeerterrein $$r$$ teruggegeven worden.
Een methode wegzetten waaraan twee natuurlijke getallen $$n$$ en $$i$$ (Number) moeten doorgegeven worden. Als het niet mogelijk is om $$n$$ wagons weg te zetten naar standplaats $$i$$, dan moet een Error opgeworpen worden met de boodschap ongeldige actie, en mag de configuratie van terrein $$r$$ niet wijzigen. Anders moet de configuratie van terrein $$r$$ wijzigen naar de toestand nadat $$n$$ wagons weggezet werden naar standplaats $$i$$, en moet er een verwijzing naar rangeerterrein $$r$$ teruggegeven worden.
> const terrein = new Rangeerterrein(["OACHF", "HJN", "XGWCU", "DF"], locomotief="CMP")
> console.log(terrein.toString())
■CMP━━━━━━┳━━━━━OACHF
┣━━━━━━━HJN
┣━━━━━XGWCU
┗━━━━━━━━DF
> terrein.bezetting
15
> terrein.ophalen(3, 6)
Error: ongeldige actie
> console.log(terrein.ophalen(3, 2).toString())
■CMPXGW━━━┳━━━━━OACHF
┣━━━━━━━HJN
┣━━━━━━━━CU
┗━━━━━━━━DF
> terrein.bezetting
12
> terrein.ophalen(4, 0)
Error: ongeldige actie
> console.log(terrein.ophalen(3, 0).toString())
■CMPXGWOAC┳━━━━━━━━HF
┣━━━━━━━HJN
┣━━━━━━━━CU
┗━━━━━━━━DF
> terrein.bezetting
9
> terrein.wegzetten(8, 1)
Error: ongeldige actie
> console.log(terrein.wegzetten(7, 1).toString())
■CM━━━━━━━┳━━━━━━━━HF
┣PXGWOACHJN
┣━━━━━━━━CU
┗━━━━━━━━DF
> terrein.bezetting
16
> terrein.wegzetten(3, 3)
Error: ongeldige actie
> console.log(terrein.ophalen(4, 1).wegzetten(2, 3).wegzetten(3, 2).ophalen(4, 1).toString())
■COACH━━━━┳━━━━━━━━HF
┣━━━━━━━━JN
┣━━━━━MPXCU
┗━━━━━━GWDF
> terrein.bezetting
13
> Rangeerterrein(["ABC"])
Error: ongeldige configuratie
> Rangeerterrein(["ABC", "DEFGHI"], locomotief="", capaciteit=4)
Error: ongeldige configuratie
> Rangeerterrein(["ABC", "DEF"], locomotief="GHIJ", capaciteit=4)
Error: ongeldige configuratie
Een klassieke spoorwegpuzzel op een rangeerterrein. Op de standplaats bovenaan passen beide wagons, maar niet de locomotief. De wagons kunnen samengevoegd worden en de locomotief kan één van beide of beide wagons vanuit beide richtingen duwen of trekken. De opdracht bestaat erin om met de locomotief de twee wagons van positie te wisselen.

Duw wagon A in de standplaats bovenaan. Keer terug naar het hoofdspoor onderaan, ga terug, duw wagon B in de standplaats tegen wagon A en koppel beide wagons. Trek de gekoppelde wagons terug naar het hoofdspoor en plaats ze daar in het midden. Ontkoppel nu beide wagons, trek wagon B naar rechts en duw hem het rechter zijspoor op en in de standplaats bovenaan. Keer terug naar het hoofdspoor, trek wagon A naar rechts en duw hem naar de oude positie van wagon B. Keer dan terug naar het hoofdspoor, ga naar links, terug naar het linker zijspoor en trek wagon B naar de voormalige positie van wagon A.