PROG0577 - Looking up

no tags 

A deck of cards contains 52 playing cards. The front (or face) of each card carries markings that distinguish it from the other cards in the deck and determines its use under the rules of the game being played. The back of each card is identical for all cards in any particular deck, and usually of a single colour or formalized design.

Consider a sequence of cards that is in front of you on the table, where some of the cards are face down and some are face up.

kaarten

Now, randomly draw out a group of one or more contiguous cards in which the first and last card are both face down (in a group of one card, the first and last card are the same). Then turn over all cards in this group (including the outermost cards that are face down), while maintainig the original position of each card in the sequence. If you repeat this procedure, you will eventually end up with a sequence where all cards are face up, so that no more groups of contiguous cards can be turned, no matter how you make your choices for the groups of contiguous cards that are turned as a unit.

Assignment

In this assignment, we leave you no choice about the groups of contiguous cards that need to be turned. Instead, we ask you in each turn to draw the sequence between the two outermost cards that are face down. If you stick to this choice, it takes three turns to convert the sequence of cards given above into a sequence of cards that are all face up. This is illustrated in the figure below, where we have indicates the two outermost cards of the sequence that needs to be turned with a yellow glow.

turning cards

We represent cards that are face up using the letter F, and cards that are face down (back up) using the letter B. This way, we can represent a sequence of cards using a string that only contains the letters F and B. The sequence of cards that has been used in the introduction is then represented by the string FBFFFBFFBF. You are asked to:

  • Write a function swap that takes a sequence of cards. The function must return a string that represents the sequence of cards that is obtained if all cards in the given sequence of cards are turned over.
  • Write a function next that takes a sequence of cards. The function must return a string that represents the sequence of cards that is obtained if all cards between the two outermost cards that are face down in the given sequence of cards are turned over (including the two outermost cards that are face down). With the outermost cards we intend to say the leftmost and the rightmost cards that are face down. In case the given sequence of cards contains no cards that are face down, the given sequence of cards must be returned by the function.
  • Write a function turns that takes a sequence of cards. The function must return the number of turns it takes to obtain a sequence of cards that are all face up, if we start with the given sequence of cards and repeatedly turn over all cards in between the two outermost cards that are face down (including the two outermost cards that are face down).

Example

>>> swap('FBFFFBFFBF')
'BFBBBFBBFB'
>>> swap('BFFBFBFFFBFBBBFBBBBFF')
'FBBFBFBBBFBFFFBFFFFBB'
>>> swap('FFBFBFBFBFBFBFBBFBFBFBFBBFBFBBFBF')
'BBFBFBFBFBFBFBFFBFBFBFBFFBFBFFBFB'

>>> next('FBFFFBFFBF')
'FFBBBFBBFF'
>>> next('BFFBFBFFFBFBBBFBBBBFF')
'FBBFBFBBBFBFFFBFFFFFF'
>>> next('FFBFBFBFBFBFBFBBFBFBFBFBBFBFBBFBF')
'FFFBFBFBFBFBFBFFBFBFBFBFFBFBFFBFF'

>>> turns('FBFFFBFFBF')
3
>>> turns('BFFBFBFFFBFBBBFBBBBFF')
6
>>> turns('FFBFBFBFBFBFBFBBFBFBFBFBBFBFBBFBF')
14

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.

kaarten

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.

Opgave

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.

kaarten omdraaien

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).

Voorbeeld

>>> 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


Added by:Peter Dawyndt
Date:2015-10-15
Time limit:10s
Source limit:50000B
Memory limit:1536MB
Cluster: Cube (Intel G860)
Languages:PY_NBC