Heteropolymeren of copolymeren zijn polymeren die opgebouwd zijn uit verschillende monomeren. Dit in tegenstelling tot homopolymeren die uit één enkel monomeer zijn opgebouwd. Onder de commercieel beschikbare copolymeren vinden we acrylonitril-butadieen-styreen (ABS) plastiek, styreen-butadieen rubber (SBR), nitril-butadieen rubber en ethyleenvinylacetaat.
Omdat copolymeren bestaan uit minstens twee soorten samenstellende eenheden (structuureenheden), kunnen ze ingedeeld worden volgens de manier waarop deze eenheden gerangschikt zijn. Periodieke copolymeren zijn bijvoorbeeld copolymeren waarbij de structuureenheden gerangschikt zijn volgens een repeterende reeks. Als de structuureenheden aangeduid worden door hoofdletters, dan kunnen periodieke copolymeren in verkorte notatie geschreven worden als $$(ABC)_n$$. Hierbij stelt $$ABC$$ de periode voor, en geeft $$n \in \mathbb{N}$$ ($$n \geq 2$$) aan dat het periodiek copolymeer bestaat uit $$n$$ herhalingen van de periode.
In deze opgave worden copolymeren voorgesteld als strings die bestaan uit hoofdletters. Elke hoofdletter staat daarbij voor één van de structuureenheden waaruit het copolymeer is opgebouwd. Je opdracht bestaat erin om voor een gegeven copolymeer na te gaan of het periodiek is. Indien dat het geval is, dan moet je ook de verkorte notatie van het copolymeer opstellen. Hiervoor ga je als volgt te werk:
Schrijf een functie copolymeer waaraan een string moet doorgegeven worden. Indien de gegeven string enkel bestaat uit hoofdletters, dan stelt deze een copolymeer voor en moet de functie de string zelf als resultaat teruggeven. Indien de gegeven string de vorm (p)_n heeft, dan stelt deze de verkorte notatie van een periodiek copolymeer voor met een periode $$p$$ die $$n \in \mathbb{N}_0$$ keer herhaald wordt. De functie moet dan het volledig uitgeschreven periodiek copolymeer als resultaat teruggeven.
Schrijf een functie is_periodiek waaraan twee strings moeten doorgegeven worden. Het eerste argument stelt een copolymeer voor en het tweede argument een periode (zelf ook een copolymeer). De functie moet een Booleaanse waarde teruggeven, die aangeeft of het gegeven copolymeer (eerste argument) bestaat uit een geheel aantal herhalingen van de gegeven periode (tweede argument).
Gebruik de functie is_periodiek om een functie periode te schrijven waaraan een copolymeer moet doorgegeven worden. De functie moet de kortst mogelijke periode teruggeven. Deze periode kan eventueel gelijk zijn aan het gegeven polymeer zelf, indien het niet bestaat uit een herhaling van een kortere periode. De functie heeft ook nog een optionele parameter minimale_herhaling waaraan een getal $$n \in \mathbb{N}_0$$ kan doorgegeven worden (standaardwaarde: 1). Indien het gegeven copolymeer geen periode heeft die minstens $$n$$ keer herhaald wordt, dan moet de functie de lege string teruggeven.
Gebruik de functie periode om een functie afkorting te schrijven waaraan een copolymeer moet doorgegeven worden. Indien het copolymeer periodiek is met een periode die minstens twee keer herhaald wordt, dan moet de functie de verkorte notatie van het copolymeer teruggeven onder de vorm (p)_n. Hierbij stelt $$p$$ de kortst mogelijke periode van het periodiek copolymeer voor, en $$n \in \mathbb{N}_0$$ ($$n \geq 2$$) het aantal herhalingen van de periode in het copolymeer. Indien het copolymeer niet periodiek is of indien het copolymeer niet bestaat uit minstens twee herhalingen van een periode, dan moet de functie het copolymeer zelf teruggeven.
>>> copolymeer('(AB)_18')
'ABABABABABABABABABABABABABABABABABAB'
>>> copolymeer('(ABBA)_9')
'ABBAABBAABBAABBAABBAABBAABBAABBAABBA'
>>> copolymeer('(ABABBAAAABBB)_3')
'ABABBAAAABBBABABBAAAABBBABABBAAAABBB'
>>> copolymeer('ABABBAAAABBBABABBAAAABBBBBABBAAAABBB')
'ABABBAAAABBBABABBAAAABBBBBABBAAAABBB'
>>> is_periodiek('ABABABABABABABABABABABABABABABABABAB', 'AB')
True
>>> is_periodiek('ABABABABABABABABABABABABABABABABABAB', 'ABA')
False
>>> is_periodiek('ABABABABABABABABABABABABABABABABABAB', 'ABAB')
True
>>> is_periodiek('ABABBAAAABBBABABBAAAABBBABABBAAAABBB', 'ABABBAAAABBB')
True
>>> periode('ABABABABABABABABABABABABABABABABABAB')
'AB'
>>> periode('ABABABABABABABABABABABABABABABABABAB', minimale_herhaling=10)
'AB'
>>> periode('ABABABABABABABABABABABABABABABABABAB', 20)
''
>>> periode('ABBAABBAABBAABBAABBAABBAABBAABBAABBA')
'ABBA'
>>> periode('ABABBAAAABBBABABBAAAABBBABABBAAAABBB')
'ABABBAAAABBB'
>>> periode('ABABBAAAABBBABABBAAAABBBBBABBAAAABBB')
'ABABBAAAABBBABABBAAAABBBBBABBAAAABBB'
>>> periode('ABABBAAAABBBABABBAAAABBBBBABBAAAABBB', 2)
''
>>> afkorting('ABABABABABABABABABABABABABABABABABAB')
'(AB)_18'
>>> afkorting('ABBAABBAABBAABBAABBAABBAABBAABBAABBA')
'(ABBA)_9'
>>> afkorting('ABABBAAAABBBABABBAAAABBBABABBAAAABBB')
'(ABABBAAAABBB)_3'
>>> afkorting('ABABBAAAABBBABABBAAAABBBBBABBAAAABBB')
'ABABBAAAABBBABABBAAAABBBBBABBAAAABBB'