James Bond geeft nooit echt uitleg waarom hij zijn Martini's graag shaken, not stirred (geschud, niet geroerd) drinkt. In 1999 gingen biochemici van de University of Western Ontario (Canada) dan maar zelf op zoek naar mogelijke verklaringen.
Ze ontdekten dat geschudde Martini's sterkere antioxiderende eigenschappen hebben dan geroerde Martini's — dit helpt Bond bij het mijden van hart- en vaatziekten, hartaanvallen en staar. In het artikel dat ze publiceerden in het British Medical Journal trokken ze het volgende besluit:
007's profound state of health may be due, at least in part, to compliant bartenders
Alle chemische elementen hebben naast een naam ook een korte symbolische voorstelling. Beide starten met een hoofdletter, gevolgd door nul of meer kleine letters. Namen van chemische elementen hebben minstens drie letters, terwijl symbolen soms maar uit één enkele (hoofd)letter bestaan.
Om komaf te maken met het feit dat er niet altijd een direct verband bestaat tussen de naam en het symbool van een chemisch element, hebben we besloten om op een systematische manier aan elk element een nieuw symbool toe te kennen. We gebruiken hiervoor de volgende procedure:
overloop de namen van de chemische elementen in een bepaalde volgorde
bepaal voor elke naam op de volgende manier het corresponderende symbool
lijst alle paren opeenvolgende letters uit de naam van het element op, in de volgorde waarin ze in de naam voorkomen; van elk letterpaar moet de eerste letter omgezet worden naar een hoofdletter en de tweede naar een kleine letter
selecteer het eerste letterpaar uit deze reeks dat nog niet eerder aan een element werd toegekend
ken het geselecteerde letterpaar als symbool toe aan het element
We noemen dit de shaken-not-stirred procedure. Gevraagd wordt:
Schrijf een functie paren waaraan de naam van een chemisch element moet doorgegeven worden. De functie moet een tuple teruggeven met alle paren opeenvolgende letters uit de naam van het element, opgelijst in de volgorde waarin ze in de naam voorkomen. Van elk letterpaar moet de eerste letter omgezet worden naar een hoofdletter en de tweede naar een kleine letter.
Schrijf een functie eerste waaraan twee argumenten moeten doorgegeven worden: een reeks van strings (een lijst of tuple) en een container van strings (een lijst, tuple of verzameling). De functie moet de eerste string uit de reeks (eerste argument) teruggeven die niet in de container (tweede argument) voorkomt. Als de gegeven reeks geen enkel element bevat dat niet in de gegeven container voorkomt, dan moet de functie de waarde None teruggeven.
In onderstaande voorbeeldsessie gaan we ervan uit dat het tekstbestand elementen.txt1 zich in de huidige directory bevindt.
>>> paren('Neon')
('Ne', 'Eo', 'On')
>>> paren('Rutherfordium')
('Ru', 'Ut', 'Th', 'He', 'Er', 'Rf', 'Fo', 'Or', 'Rd', 'Di', 'Iu', 'Um')
>>> eerste(['Ne', 'Eo', 'On'], {'Ne', 'On'})
'Eo'
>>> eerste(('Ne', 'Eo', 'On'), {'Ne', 'On', 'Eo'})
>>> symbool = toekennen('elementen.txt', onmogelijk='???')
>>> symbool['Neon']
'Ne'
>>> symbool['Rubidium']
'Ru'
>>> symbool['Ruthenium']
'Ut'
>>> symbool['Rutherfordium']
'Rf'
>>> symbool['Tin']
'???'
Trevithick CC, Chartrand MM, Wahlman J, Rahman F, Hirst M, Trevithick JR (1999). Shaken, not stirred: bioanalytical study of the antioxidant activities of martinis. BMJ 319(7225), 1600-1602. 2
Johnson G, Guha IN, Davies P (2013). Were James Bond's drinks shaken because of alcohol induced tremor? BMJ 347, f7255. 3