Een combinatieslot is een soort slot waarbij gebruikgemaakt wordt van een reeks getallen om het slot te openen en te sluiten. De getallenreeks kan ingevoerd worden door middel van een reeks onafhankelijk roterende schijven waarin getallen gestanst zijn. Deze schijven sturen rechtstreeks het blokkeringsmechanisme aan, volgens het principe omschreven aan de hand van onderstaande illustraties.

Aanzicht van de roterende schijven nadat het combinatieslot uit elkaar gehaald werd. De inkepingen aan de binnenzijde van de schijven komen overeen met de getallen die de juiste combinatie vormen. In dit geval is 9-2-4 de juiste combinatie om het slot te openen. De schijven worden aan één zijde van het slot gemonteerd, dat op zijn beurt kan bevestigd worden aan een ketting of een kabel. De andere zijde van het slot — of het andere einde van de kabel — bestaat uit een stalen pin met een aantal uitstekende tanden. Als de schijven in de juiste combinatie staan, kunnen beide delen van het slot in elkaar geschoven of uit elkaar gehaald worden. Als de getande pin in het slot zit, kan het slot gesloten worden door de schijven naar een verkeerde combinatie te draaien. De tanden van de pin worden dan geblokkeerd door de binnenzijde van de schijven, waardoor beide delen van het slot niet uit elkaar kunnen gehaald worden.

Opgave

Definieer een klasse Combinatieslot waarmee objecten kunnen geïnstantieerd worden die een combinatieslot met \(s \in \mathbb{N}_0\) schijven voorstellen. Elke schijf is gemarkeerd met de opeenvolgende getallen 0, 1, …, \(m\). Er is juist één combinatie waarop de schijven moeten ingesteld worden om het slot te kunnen openen.

Aan de constructor van de klasse moet een reeks (Array) met natuurlijke getallen (Number) doorgegeven worden. Deze getallen geven de juiste combinatie aan waarmee het slot kan geopend worden. Het aantal getallen \(s \in \mathbb{N}_0\) in de reeks correspondeert met het aantal schijven van het combinatieslot. Initieel staat elke schijf van het slot ingesteld op de waarde nul. De constructor heeft ook nog een tweede optionele parameter waarmee het grootste getal \(m \in \mathbb{N}_0\) kan opgegeven worden waarmee de schijven gemarkeerd zijn (standaardwaarde: 9). Het slot moet minstens één schijf hebben, en elk getal van de juiste combinatie moet in het interval [0, \(m\)] gelegen zijn. Als dat niet het geval is, dan moet de constructor een Error opwerpen met de boodschap ongeldige combinatie.

Voorts moet de klasse Combinatieslot minstens de volgende methoden ondersteunen:

Voorbeeld

> const slot = new Combinatieslot([9, 2, 4]);
> slot.toString();
"0-0-0"
> slot.open();
false
> slot.roteer(1, 2);
> slot.toString();
"0-2-0"
> slot.roteer(2, 5);
> slot.toString();
"0-2-5"
> slot.open();
false
> slot.roteer([2, 0], 9);
> slot.toString();
"9-2-4"
> slot.open();
true

> const slot = new Combinatieslot([14, 13, 2, 7, 6], 16);
> slot.toString();
"0-0-0-0-0"
> slot.open();
false
> slot.roteer([0, 2, 4], 6);
> slot.toString();
"6-0-6-0-6"
> slot.open();
false
> slot.roteer([1, 3, 5], 13);
AssertionError: ongeldige schijf
> slot.toString();
"6-0-6-0-6"
> slot.roteer([1, 3, 2], 13);
> slot.toString();
"6-13-2-13-6"
> slot.open();
false
> slot.roteer([0, 3], 8);
> slot.toString();
"14-13-2-4-6"
> slot.open();
false
> slot.roteer(3, 3);
> slot.toString();
"14-13-2-7-6"
> slot.open();
true

> const slot = new Combinatieslot([1, 2, 3, 4, 5], 4);
AssertionError: ongeldige combinatie

> const slot = new Combinatieslot([]);
AssertionError: ongeldige combinatie