Derek is verzot op domino. Hij beschikt dan ook over zijn eigen standaard dominoset, bestaande uit 28 rechthoekige stenen. Elke steen wordt in twee vierkanten verdeeld, waarbij elke helft gemarkeerd is met nul tot zes ogen.
Om het dominospel te kunnen spelen zijn er minstens twee spelers nodig. Layla — de zus van Derek — vertikt het echter om nog mee te spelen, omdat ze altijd het onderspit moet delven als ze het tegen haar broer opneemt. Uit verveling heeft Derek dan maar twee spelletje bedacht die hij alleen kan spelen.
Elk dominospelletje begint op dezelfde manier. Derek kiest willekeurig een aantal dominostenen en legt die in een reeks achter elkaar. Deze reeks hoeft dus niet noodzakelijk alle stenen van zijn dominoset te bevatten. In deze opgave stellen we een dominosteen voor als een tuple van twee integers, die het aantal ogen aangeven waarmee beide helften van de steen gemarkeerd zijn. Een reeks dominostenen wordt voorgesteld als een lijst of een tuple van dominostenen. In een reeks dominostenen volgen twee stenen elkaar op als het aantal ogen aan de rechterkant van de linker steen gelijk is aan het aantal ogen aan de linkerkant van de rechter steen.
Schrijf een functie beginreeks waaraan een reeks dominostenen moet doorgegeven worden. De functie moet teruggeven wat het maximum aantal dominostenen is die op elkaar volgen aan het begin van de reeks. De functie heeft een optionele parameter draaien waaraan een Booleaanse waarde kan doorgegeven worden (standaardwaarde: False). Deze parameter geeft aan of een dominosteen 180° mag gedraaid worden om hem te laten volgen op de vorige steen. De eerste steen van de reeks mag nooit gedraaid worden.
Schrijf een functie dominoreeks waaraan een reeks dominostenen moet doorgegeven worden. De functie heeft een optionele parameter draaien waaraan een Booleaanse waarde kan doorgegeven worden (standaardwaarde: False). Deze parameter geeft aan of een dominosteen 180° mag gedraaid worden om hem te laten volgen op de vorige steen. De functie moet een nieuwe reeks dominostenen teruggeven die op de volgende manier opgebouwd wordt:
neem de eerste steen van de gegeven reeks en gebruik deze als eerste steen van de nieuwe reeks; deze eerste steen mag nooit gedraaid worden
doorloop de resterende stenen van de gegeven reeks van links naar rechts en zoek de eerste steen die aan de rechterkant kan aangelegd worden van de laatste steen van de nieuwe reeks (eventeel na 180° draaien indien dit toegelaten is door de parameter draaien)
afhankelijk van het feit of er in stap 2 een steen gevonden werd, zijn er nu twee mogelijkheden:
indien er een steen gevonden werd, verwijder die dan uit de gegeven reeks dominostenen en breid de nieuwe reeks aan de rechterkant uit met de nieuwe steen, zodat die volgt op de vorige steen; herhaal daarna de procedure vanaf stap 2
indien er geen steen gevonden werd, eindigt de procedure en moet de nieuw gevormde reeks teruggegeven worden
Bovenstaande functies zijn onafhankelijk van elkaar. Het is dus niet nodig om de functie beginreeks aan te roepen bij de implementatie van de functie dominoreeks.
>>> reeks = ((3, 0), (0, 1), (1, 2), (0, 2), (0, 0), (3, 3), (1, 1), (2, 3), (3, 1), (2, 2))
>>> beginreeks(reeks)
3
>>> beginreeks(reeks, draaien=True)
5
>>> reeks = ((1, 3), (2, 0), (1, 0), (0, 3), (1, 1), (0, 0), (3, 3), (2, 2), (3, 2), (1, 2))
>>> dominoreeks(reeks)
[(1, 3), (3, 3), (3, 2), (2, 0), (0, 3)]
>>> dominoreeks(reeks, draaien=True)
[(1, 3), (3, 0), (0, 2), (2, 2), (2, 3), (3, 3)]