Een kaartspel bestaat uit 52 speelkaarten. Alle kaarten hebben dezelfde rugzijde, maar elke kaart heeft een unieke beeldzijde. Stel nu dat er een aantal speelkaarten van een kaartspel naast elkaar liggen, waarbij sommige kaarten met de beeldzijde en sommige met de rugzijde naar boven liggen.
Kies nu willekeurig een reeks van één of meer opeenvolgende kaarten, waarvan zowel de eerste als de laatste kaart met de rugzijde naar boven liggen (in een reeks van één kaart zijn de eerste en de laatste kaart dezelfde), en draai alle kaarten uit die reeks om (inclusief de twee buitenste kaarten van de reeks die met de rugzijde naar boven lagen). Als je deze procedure blijft herhalen, dan zal je uiteindelijk altijd in de situatie belanden waarbij alle kaarten met de beeldzijde naar boven liggen en je dus geen kaarten meer kunt omdraaien. Dit ongeacht de keuzes die je maakt bij het omdraaien van de reeksen opeenvolgende kaarten.
Voor deze opgave laten we je geen keuze wat betreft de reeksen kaarten, maar vragen we je telkens om de reeks te kiezen tussen de twee buitenste kaarten die met de rugzijde naar boven liggen. Als je telkens deze keuze maakt, dan wordt bovenstaande reeks kaarten in drie beurten omgevormd tot een reeks kaarten die allemaal met de beeldzijde naar boven liggen. Dit wordt geïllustreerd in onderstaande figuur, waarbij we telkens de buitenste kaarten van de reeks die moet omgedraaid worden aanduiden met een gele gloed.
We stellen een kaart die met de beeldzijde naar boven ligt voor met de letter B, en een kaart die met de rugzijde naar boven ligt met de letter R. Op die manier kunnen we een reeks kaarten voorstellen als een string die enkel de letters B en R bevat. De reeks kaarten die we gebruikt hebben in de inleiding kan dan voorgesteld worden door de string BRBBBRBBRB. Gevraagd wordt:
Schrijf een functie omdraaien waaraan een reeks kaarten moet doorgegeven worden. De functie moet een string teruggeven die de reeks kaarten voorstelt die men bekomt door alle kaarten van de gegeven reeks om te draaien.
Schrijf een functie volgende waaraan een reeks kaarten moet doorgegeven worden. De functie moet een string teruggeven die de reeks kaarten voorstelt die men bekomt door in de gegeven reeks kaarten alle kaarten om te draaien tussen de twee buitenste kaarten die met de rugzijde naar boven liggen (inclusief de buitenste kaarten die met de rugzijde naar boven liggen). Met de buitenste kaarten bedoelen we de meest linkse en de meest rechtse kaart die met de rugzijde naar boven liggen. Indien er in de gegeven reeks kaarten geen enkele kaart met de rugzijde naar boven ligt, dan moet de functie de gegeven reeks kaarten als resultaat teruggeven.
Schrijf een functie beurten waaraan een reeks kaarten moet doorgegeven worden. De functie moet het aantal beurten teruggeven die nodig zijn om alle kaarten met de beeldzijde naar boven te leggen, als men vertrekkend vanaf de gegeven reeks kaarten telkens alle kaarten omdraait tussen de twee buitenste kaarten die met de rugzijde naar boven liggen (inclusief de buitenste kaarten die met de rugzijde naar boven liggen).
>>> omdraaien('BRBBBRBBRB')
'RBRRRBRRBR'
>>> omdraaien('RBBRBRBBBRBRRRBRRRRBB')
'BRRBRBRRRBRBBBRBBBBRR'
>>> omdraaien('BBRBRBRBRBRBRBRRBRBRBRBRRBRBRRBRB')
'RRBRBRBRBRBRBRBBRBRBRBRBBRBRBBRBR'
>>> volgende('BRBBBRBBRB')
'BBRRRBRRBB'
>>> volgende('RBBRBRBBBRBRRRBRRRRBB')
'BRRBRBRRRBRBBBRBBBBBB'
>>> volgende('BBRBRBRBRBRBRBRRBRBRBRBRRBRBRRBRB')
'BBBRBRBRBRBRBRBBRBRBRBRBBRBRBBRBB'
>>> beurten('BRBBBRBBRB')
3
>>> beurten('RBBRBRBBBRBRRRBRRRRBB')
6
>>> beurten('BBRBRBRBRBRBRBRRBRBRBRBRRBRBRRBRB')
14