In 1954 stichtten James Watson1 (PRO) en Francis Crick2 (TYR) de RNA Tie Club3 — een wetenschappelijke gentleman's club die zich tot doel stelde om het raadsel van de RNA structuur te ontwaren en te begrijpen hoe eiwitten gevormd worden. De club telde 20 leden die elk aangeduid werden met een aminozuur (de bouwstenen van eiwitten).
lid | opleiding | afkorting (dasspeld) |
---|---|---|
George Gamow4 | fysicus | ALA |
Alexander Rich5 | biochemicus | ARG |
Paul Doty6 | fysische chemicus | ASP |
Robert Ledley7 | wiskundige biofysicus | ASN |
Martynas Ycas8 | biochemicus | CYS |
Robley Williams9 | elektronenmicroscopist | GLU |
Alexander Dounce10 | biochemicus | GLN |
Richard Feynman11 | theoretische fysicus | GLY |
Melvin Calvin12 | chemicus | HIS |
Norman Simmons13 | biochemicus | ISO |
Edward Teller14 | fysicus | LEU |
Erwin Chargaff15 | biochemicus | LYS |
Nicholas Metropolis16 | fysicus, wiskundige | MET |
Gunther Stent17 | fysische chemicus | PHE |
James Watson18 | bioloog | PRO |
Harold Gordon19 | bioloog | SER |
Leslie Orgel20 | theoretische chemicus | THR |
Max Delbrück21 | theoretische fysicus | TRY |
Francis Crick22 | bioloog | TYR |
Sydney Brenner23 | bioloog | VAL |
In zijn memoires schrijft George Gamow24 (ALA):
We were just drinking California wine and we got the idea.
Elk lid kreeg een zwarte wollen stropdas waarop een rode-groene DNA-helix geborduurd was (foto, van links naar rechts: Francis Crick25 (TYR), Alexander Rich26 (ARG), Leslie Orgel27 (THR) en James Watson28 (PRO)).
Elk lid kreeg ook een gouden dasspeld met daarop de drieletterige afkorting van zijn aminozuur. George Gamow29 (ALA) kreeg zelfs verschillende keren de vraag waarom het verkeerde monogram op zijn dasspeld stond.
Onder het motto "Do or die, or don't try" kwamen ze tweemaal per jaar samen om ideeën, sigaren en alcoholische dranken met elkaar te delen. Verschillende leden van de RNA Tie Club werden later Nobelprijswinnaars, maar het was uiteindelijk Marshall Nirenberg30 — die geen clublid was — die erin slaagde om de genetische code31 te ontcijferen die de link vormt tussen nucleïnezuren en aminozuren.
We werken met een geheimschrift dat de leden van een club kunnen gebruiken om berichten naar elkaar te sturen die voor anderen onleesbaar zijn. De clubleden staan geregistreerd in een kommagescheiden bestand32 (CSV-bestand; comma-separated values) waarvan de eerste kolom de naam van een persoon bevat en de derde kolom een afkorting die bestaat uit één of meer hoofdletters. Met elke persoon correspondeert een unieke afkorting.
Een gecodeerd bericht bestaat uit een reeks (list of tuple) codes, waarbij elke code een string (str) is die bestaat uit de afkorting $$a$$ (één of meer hoofdletters) die correspondeert met een clublid, gevolgd door een positie $$p$$ (één of meer cijfers). Mogelijke codes zijn bijvoorbeeld GLU3, GLY2 of ALA10. Om het gecodeerde bericht te ontcijferen, moet elke code vervangen worden door de $$p$$-de letter in de naam van het clublid dat correspondeert met afkorting $$a$$. Alle letters in het ontcijferde bericht worden voorgesteld door hoofdletters. Voor de leden van de RNA Tie Club staat de code GLU3 voor de letter B (de derde letter van Robley Williams), de code GLY2 voor de letter I (de tweede letter van Richard Feynman), en ALA10 voor de letter O (de tiende letter van George Gamow). Gevraagd wordt:
Schrijf een functie lees_afkortingen waaraan de locatie (str) van een CSV-bestand moet doorgegeven worden. In dit CSV-bestand moeten de leden van een club geregistreerd staan in het formaat zoals hierboven omschreven. De functie moet een dictionary (dict) teruggeven, die alle afkortingen (str) uit het CSV-bestand afbeeldt op de namen (str) van de daarmee corresponderende personen. Hierbij moeten enkel de letters overgehouden worden uit de namen van de personen, en moeten die letters omgezet worden naar hoofdletters.
Schrijf een functie splits_code waaraan een code (str) moet doorgegeven worden die bestaat uit een afkorting (één of meer hoofdletters) gevolgd door een positie (één of meer cijfers). De functie moet een tuple teruggeven dat de afkorting (str) en de positie (int) van de code als afzonderlijke elementen bevat. Als het argument dat aan de functie wordt doorgegeven geen geldige code is, dan moet een AssertionError opgeworpen worden met de boodschap ongeldige code.
Schrijf een functie ontcijfer waaraan twee argumenten moeten doorgegeven worden: i) een gecodeerd bericht (str) en ii) de dictionary (dict; zoals teruggegeven door de functie lees_afkortingen) met de ledenlijst die gebruikt werd om het gecodeerd bericht op het stellen. De functie moet het ontcijferde bericht (str) teruggeven.
In onderstaande voorbeeldsessie gaan we ervan uit dat het CSV-bestand RnaTieClub.csv33 zich in de huidige directory bevindt.
>>> afkorting = lees_afkortingen('RnaTieClub.csv34')
>>> afkorting['GLU']
'ROBLEYWILLIAMS'
>>> afkorting['GLY']
'RICHARDFEYNMAN'
>>> afkorting['ALA']
'GEORGEGAMOW'
>>> splits_code('GLU3')
('GLU', 3)
>>> splits_code('GLY2')
('GLY', 2)
>>> splits_code('ALA10')
('ALA', 10)
>>> splits_code('R2D2')
Traceback (most recent call last):
AssertionError: ongeldige code
>>> ontcijfer(['GLU3', 'GLY2', 'ALA10', 'ASP4', 'ASP6', 'THR9', 'HIS11', 'PHE8', 'PHE4'], afkorting)
'BIOLOGIST'
>>> ontcijfer(('MET14', 'SER1', 'CYS5', 'PRO9', 'LYS4', 'HIS7', 'GLU11', 'GLU14', 'PHE4'), afkorting)
'PHYSICIST'
>>> ontcijfer(['CYS10', 'MET4', 'ARG8', 'ISO4', 'GLU8', 'MET18', 'PHE12'], afkorting)
'CHEMIST'
>>> ontcijfer(['THR9', 'PHE6', 'THR7', 'LEU9', 'GLU2', 'ALA1', 'TYR6', 'GLU14', 'ASP7'], afkorting)
'GEOLOGIST'
>>> ontcijfer(['THR9', 'ARG3', 'MET5', 'ALA5', 'ASN5', 'CYS2', 'MET14', 'GLY4', 'ASN11', 'ASN1'], afkorting)
'GEOGRAPHER'
>>> ontcijfer(['LYS11', 'MET8', 'ASP7', 'PHE7', 'ALA10', 'ISO11', 'ASN2', 'MET9', 'MET10', 'LEU5'], afkorting)
'ASTRONOMER'
>>> ontcijfer(['CYS12', 'PRO8', 'LYS8', 'CYS4', 'MET17', 'ISO12', 'PHE12', 'MET17', 'LYS6', 'MET17', 'PRO2', 'HIS6'], afkorting)
'STATISTICIAN'
>>> ontcijfer(['VAL7', 'ARG11', 'ALA3', 'MET3', 'ARG13', 'ASN11', 'HIS1', 'HIS5', 'PHE8', 'MET11'], afkorting)
'BIOCHEMIST'
>>> ontcijfer(['GLY12', 'ISO5', 'PHE9', 'GLY4', 'ASN8', 'ISO9', 'SER2', 'LEU7', 'LYS4', 'CYS10', 'TYR10', 'ALA8', 'GLN13'], afkorting)
'MATHEMATICIAN'
>>> ontcijfer(['ARG12', 'SER8', 'GLU13', 'ASP1', 'TRY9', 'PHE9', 'THR10', 'LEU12', 'MET8', 'GLN14', 'ISO8', 'ALA6', 'TYR4', 'LEU7', 'HIS5', 'CYS8', 'LEU7'], afkorting)
'COMPUTERSCIENTIST'