Aan de bar kan je negen soorten cocktails bestellen. Toch lijken er op de drankkaart maar acht soorten te staan. Kan je achterhalen welke negende soort cocktail er in deze drankkaart verstopt zit?
Antwoord: Shirley Temple Black1
Om de naam van de verborgen cocktail te vinden, moeten de cocktails op de drankkaart eerst oplopend gesorteerd worden op basis van het getal na de komma in hun prijs:
Sex on the beach (09)
Cuba libre (44)
Bramble (51)
Mary Pickford (56)
Tuxedo (68)
Cosmopolitan (69)
Suffering bastard (86)
Black Russian (88)
In de prijs van een cocktail bepaalt het getal voor de komma vervolgens welke karakters moeten geselecteerd worden uit de naam van de cocktail. Daarvoor zetten we het (decimaal) getal om naar zijn binaire voorstelling. Die binaire voorstelling keren we om en vullen we achteraan aan met nullen tot die even lang is als de naam van de cocktail. Op elke plaats waar in de omgekeerde binaire voorstelling een 1 staat, selecteren we het corresponderende karakter uit de naam van de cocktail.
257 → 100000001 ⇄ 1000000010000000 → Sex on the beach → Sh
320 → 101000000 ⇄ 0000001010 → Cuba libre → ir
96 → 1100000 ⇄ 0000011 → Bramble → le
24 → 11000 ⇄ 0001100000000 → Mary Pickford → y␣
9 → 1001 ⇄ 100100 → Tuxedo → Te
168 → 10101000 ⇄ 000101010000 → Cosmopolitan → mpl
528 → 1000010000 ⇄ 00001000010000000 → Suffering bastard → e␣
31 → 11111 ⇄ 1111100000000 → Black Russian → Black
Als we alle geselecteerde karakters achter elkaar zetten, dan krijgen we de naam van de verborgen cocktail: Shirley Temple Black.
Een drankkaart is een tekstbestand met UTF-82 tekencodering dat de prijslijst van een aantal cocktails bevat. Dit is bijvoorbeeld de drankkaart die correspondeert met de afbeelding uit de inleiding (cocktails.txt3):
Black Russian...............€31,88 Bramble.....................€96,51 Cosmopolitan...............€168,69 Cuba libre.................€320,44 Mary Pickford...............€24,56 Sex on the beach...........€257,09 Suffering bastard..........€528,86 Tuxedo.......................€9,68
Elke regel van het tekstbestand bevat de beschrijving van een cocktail. Die beschrijving begint met de naam van de cocktail, die nooit punten (.) bevat. Daarna volgen in de beschrijving nog één of meer punten (.), een euroteken (€) en de prijs van de cocktail. De prijs wordt altijd weergegeven met twee cijfers na de komma (,). Op een drankkaart staan nooit twee cocktails met dezelfde twee cijfers na de komma.
Jouw opdracht bestaat erin om de verborgen cocktail uit een drankkaart te extraheren. Hiervoor ga je als volgt te werk:
Schrijf een functie cocktail_uitlezen waaraan de beschrijving van een cocktail (str) moet doorgegeven worden. De functie moet een tuple teruggeven met drie elementen uit de beschrijving van de cocktail: i) de naam (str), ii) het getal voor de komma (int) in de prijs en iii) het getal na de komma (int) in de prijs.
Schrijf een functie drankkaart_uitlezen waaraan de locatie (str) van een drankkaart moet doorgegeven worden. De functie moet een lijst (list) teruggeven met daarin voor elke cocktail op de drankkaart een tuple met drie elementen uit de beschrijving van de cocktail: i) de naam (str), ii) het getal voor de komma (int) in de prijs en iii) het getal na de komma (int) in de prijs. Deze tuples moeten opgelijst worden volgens oplopend getal na de komma in de prijs.
Schrijf een functie masker waaraan twee argumenten moeten doorgegeven worden: i) de naam van een cocktail en ii) het getal voor de komma (int) in de prijs van de cocktail. De functie moet een string (str) teruggeven met de omgekeerde binaire voorstelling van het getal, achteraan aangevuld met nullen tot die even lang is als de naam van de cocktail.
Schrijf een functie selecteren waaraan twee argumenten moeten doorgegeven worden: i) de naam van een cocktail en ii) het getal voor de komma (int) in de prijs van de cocktail. De functie moet een string (str) teruggeven met de karakters die uit de naam van de cocktail moeten geselecteerd worden om de verborgen cocktail in een drankkaart te vinden.
Schrijf een functie extraheren waaraan de locatie (str) van een drankkaart moet doorgegeven worden. De functie moet de naam (str) van de verborgen cocktail in de drankkaart teruggeven.
In onderstaande voorbeeldsessie gaan we ervan uit dat het tekstbestand cocktails.txt6 zich in de huidige directory bevindt.
>>> cocktail_uitlezen('Black Russian...............€31,88')
('Black Russian', 31, 88)
>>> cocktail_uitlezen('Cosmopolitan...............€168,69')
('Cosmopolitan', 168, 69)
>>> drankkaart_uitlezen('cocktails.txt7')
[('Sex on the beach', 257, 9), ('Cuba libre', 320, 44), ('Bramble', 96, 51), ('Mary Pickford', 24, 56), ('Tuxedo', 9, 68), ('Cosmopolitan', 168, 69), ('Suffering bastard', 528, 86), ('Black Russian', 31, 88)]
>>> masker('Black Russian', 31)
'1111100000000'
>>> masker('Cosmopolitan', 168)
'000101010000'
>>> selecteren('Black Russian', 31)
'Black'
>>> selecteren('Cosmopolitan', 168)
'mpl'
>>> extraheren('cocktails.txt8')
'Shirley Temple Black'
Shirley Jane Temple9 (23 april 1928 – 10 februari 2014) was een Amerikaans actrice en diplomate. Als meisje met goudblonde krullen en fonkelende ogen was ze een van de bekendste kindsterretjes uit de filmgeschiedenis. Tussen 1932 en 1949 was ze in meer dan vijftig Amerikaanse speelfilms te zien en ze is nog steeds de jongste winnaar ooit van een Academy Juvenile Award10. Als Shirley Temple Black bouwde ze als volwassene een carrière op als ambassadrice.
Naar Shirley is een mocktail vernoemd: de Shirley Temple11. Deze niet-alcoholische cocktail wordt gemaakt met gemberbier, grenadine, en sinaasappelsap en versierd met een maraschinokers12. Hij wordt vaak gemaakt voor kinderen zodat die samen met volwassenen een cocktail kunnen drinken. Als er voor volwassenen nog donkere rum wordt aan toegevoegd dan staat de cocktail bekend als Sherley Temple Black13, als eerbetoon aan de familienaam die ze bij haar huwelijk aannam.