Recombinatie is een algemeen proces waarbij entiteiten die bestaan uit meerdere componenten, fysiek met elkaar interageren en daarbij componenten uitwisselen om chimerische producten of nakomelingen te maken. Hoewel het concept meestal wordt geassocieerd met overervingsstappen die voorkomen bij levende organismen, bestaan er ook parallellen in de chemie, fysica, bouwkunde en vele andere wetenschappelijke disciplines. Een eenvoudig voorbeeld van recombinatie kan voorgesteld worden als: \[ A\bullet B + C\bullet D \longrightarrow A\bullet D + C\bullet B \] waarbij $$A$$, $$B$$, $$C$$ en $$D$$ uitwisselbare componenten voorstellen, het symbool $$\bullet$$ staat voor een connectie of binding tussen de componenten, en $$A\bullet B, C\bullet D, \ldots$$ de volledige entiteiten voorstellen. Het proces van nucleosynthese uit het domein van de chemische fysica kan bijvoorbeeld beschreven worden als de recombinatie van bestaande kernen waaruit nieuwe kernen gevormd worden. In de biologie kunnen nieuwe genotypes ontstaan door recombinatie van bestaande genen of genomen. In al deze gevallen is een kenmerk van recombinatie dat relatief grote blokken van een onderliggend materiaal uitgewisseld worden tussen individuen, in plaats van een alternatief proces waarbij nieuwe entiteiten gevormd worden door minimale bouwstenen één voor één aan elkaar te zetten.
Recombinatie kan ook toegepast worden op natuurlijke taal. Als we vertrekken van twee woorden die even lang zijn, dan is recombinatie het proces waarbij overeenkomstige reeksen van één of meer opeenvolgende letters uitgewisseld worden tussen de twee woorden. Heel af en toe resulteert een dergelijke recombinatie in twee bestaande woorden. Stel dat we bijvoorbeeld vertekken van de volgende twee Engelse woorden:
BURGUL: graanproduct gemaakt van verschillende soorten tarwe, maar meestal van durum (harde tarwe); de tarwekorrels worden eerst gestoomd, daarna gedroogd en vervolgens gemalen of gebroken
AENEAS: mythologische Trojaanse held, zoon van de sterfelijke prins Anchises en de godin Venus (Aphrodite)
Als we nu de posities van de letters in de woorden van links naar rechts nummeren vanaf 1, dan krijgen we na uitwisseling van de letters op de posities 2, 3 en 5 twee andere bestaande Engelse woorden met de volgende betekenis:
BENGAL: regio in het noordoosten van het Indisch Subcontintent die is onderverdeeld in de Indiase staat West-Bengalen en het land Bangladesh; geldt als één van de dichtstbevolkte gebieden op Aarde
AUREUS: gouden munt ter waarde van 25 denarii die gebruikt werd in het Romeinse Rijk
Deze recombinatie van de woorden BURGUL en AENEAS kan voorgesteld worden als
In deze opgave werken we met woorden die enkel bestaat uit letters. Gevraagd wordt om de volgende twee functies te schrijven, waaraan telkens twee of drie woorden moeten doorgegeven worden. Hierbij moet telkens gelden dat alle opgegeven woorden dezelfde lengte hebben. Indien dit niet het geval is, dan moeten de functies een AssertionError opwerpen met de boodschap woorden moeten even lang zijn. Het opwerpen van deze AssertionError krijgt telkens voorrang op eventuele andere exceptions die expliciet door de functies opgeworpen worden.
Schrijf een functie recombinatie waaraan drie woorden moeten doorgegeven worden. Als het derde woord kan ontstaan zijn na recombinatie van de eerste twee woorden, dan moet de functie het andere woord teruggeven dat ontstaan is na diezelfde recombinatie. Indien het derde woord niet kan ontstaan zijn na recombinatie van de eerste twee woorden, dan moet de functie een AssertionError opwerpen met de boodschap ongeldige recombinatie.
Schrijf een functie chimeren waaraan drie argumenten moeten doorgegeven worden. De eerste twee argumenten zijn woorden. De functie moet een tuple teruggeven dat de twee woorden bevat die ontstaan na recombinatie van de twee gegeven woorden. Het derde argument is een string die de fragmenten omschrijft die bij deze recombinatie moeten uitgewisseld worden. Hierbij is elk fragment een reeks van één of meer opeenvolgende letters die wordt omschreven als m-n waarin m de positie van de eerste letter in de reeks aangeeft en n de positie van de laatste letter ervan. De posities van de letters in een woord worden van links naar rechts genummerd vanaf 1. De verschillende fragmenten worden van elkaar gescheiden door een puntkomma (;). Een fragment dat slechts uit één letter bestaat wordt niet genoteerd als n-n, maar simpelweg als n.
>>> recombinatie('burgul', 'aeneas', 'bengal')
'aureus'
>>> recombinatie('oleins', 'arcade', 'oreads')
'alcine'
>>> recombinatie('alevin', 'elodea', 'alodia')
'eleven'
>>> recombinatie('nitrogen', 'fluorine', 'tin')
Traceback (most recent call last):
AssertionError: woorden moeten even lang zijn
>>> recombinatie('nitrogen', 'fluorine', 'aluminium')
Traceback (most recent call last):
AssertionError: woorden moeten even lang zijn
>>> recombinatie('nitrogen', 'fluorine', 'ringtone')
Traceback (most recent call last):
AssertionError: ongeldige recombinatie
>>> chimeren('burgul', 'aeneas', '2-3;5')
('bengal', 'aureus')
>>> chimeren('oleins', 'arcade', '2;4-5')
('oreads', 'alcine')
>>> chimeren('alevin', 'elodea', '2-4;6')
('alodia', 'eleven')
>>> chimeren('nitrogen', 'aluminium', '3-7')
Traceback (most recent call last):
AssertionError: woorden moeten even lang zijn