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.

combinatieslot: schijven combinatieslot: open combinatieslot: gesloten

Opgave

Schrijf 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. De objecten van de klasse Combinatieslot moeten minstens de volgende methoden ondersteunen:

Voorbeeld

>>> slot = Combinatieslot((9, 2, 4))
>>> slot
Combinatieslot((9, 2, 4), maxwaarde=9)
>>> print(slot)
0-0-0
>>> slot.open()
False
>>> slot.roteer(1, 2)
>>> print(slot)
0-2-0
>>> slot.roteer(2, 5)
>>> print(slot)
0-2-5
>>> slot.open()
False
>>> slot.roteer([2, 0], 9)
>>> print(slot)
9-2-4
>>> slot.open()
True

>>> slot = Combinatieslot([14, 13, 2, 7, 6], maxwaarde=16)
>>> slot
Combinatieslot((14, 13, 2, 7, 6), maxwaarde=16)
>>> print(slot)
0-0-0-0-0
>>> slot.roteer([0, 2, 4], 6)
>>> print(slot)
6-0-6-0-6
>>> slot.roteer([1, 3, 5], 13)
Traceback (most recent call last):
AssertionError: ongeldige schijf
>>> print(slot)
6-0-6-0-6
>>> slot.roteer([1, 3, 2], 13)
>>> print(slot)
6-13-2-13-6
>>> slot.roteer([0, 3], 8)
>>> print(slot)
14-13-2-4-6
>>> slot.open()
False
>>> slot.roteer(3, 3)
>>> print(slot)
14-13-2-7-6
>>> slot.open()
True

>>> slot = Combinatieslot([1, 2, 3, 4, 5], maxwaarde=4)
Traceback (most recent call last):
AssertionError: ongeldige combinatie

>>> slot = Combinatieslot([])
Traceback (most recent call last):
AssertionError: ongeldige combinatie