Wat is 3/5 leeuw, 1/2 stekelmuis en 1/5 nerts?

Oplossing: leeuw + stekelmuis + nerts = leesteken

We nemen met andere woorden drie van de vijf ($$\frac{3}{5}$$) letters van het woord leeuw, de helft ($$\frac{5}{10} = \frac{1}{2}$$) van de letters van het woord stekelmuis, en één van de vijf ($$\frac{1}{5}$$) letters van het woord nerts. Daarbij nemen we telkens letters aan de voorkant van het woord.

Opgave

Een woord $$w$$ is een string (str) die bestaat uit nul of meer letters (hoofdletters en kleine letters). We noteren de lengte van het woord $$w$$ als $$||w||$$.

Een woord $$p$$ is een prefix van een woord $$w$$ als er een woord $$s$$ bestaat zodat $$w = ps$$, of met andere woorden als het woord $$w$$ begint met het woord $$p$$.

Een woord $$s$$ is een suffix van een woord $$w$$ als er een woord $$p$$ bestaat zodat $$w = ps$$, of met andere woorden als het woord $$w$$ eindigt met het woord $$s$$.

Een breuk $$b$$ is een object van het gegevenstype Fraction uit in de module fractions van de Python Standard Library. De stringvoorstelling van een breuk met teller $$t$$ en noemer $$n$$ is t/n. Bij de stringvoorstelling van een negatieve breuk staat het minteken voor de teller (bijvoorbeeld -3/4).

Een vraag is een string (str) van de vorm

Wat is woordbreuk1, woordbreuk2, …, woordbreukn-1 en woordbreukn?

waarbij woordbreuki bestaat uit de stringvoorstelling van een breuk $$b_i$$, gevolgd door een spatie en een woord $$w_i$$ voor $$i = 1, 2, \ldots, n$$ en $$n \geq 2$$.

Gevraagd wordt:

Als er bij het aanroepen van de functies woordbreuk, combineer of antwoord een onmogelijke woordbreuk moet bepaald worden (het is bijvoorbeeld niet mogelijk om $$\frac{3}{5}$$ van de letters van het woord spam te selecteren), dan moet een AssertionError opgeworpen worden met de boodschap ongeldige breuk.

Voorbeeld

>>> woordbreuk('leeuw', Fraction(3, 5))
'lee'
>>> woordbreuk('stekelmuis', Fraction(1, 2))
'steke'
>>> woordbreuk('nerts', Fraction(1, 5))
'n'

>>> woordbreuk('GUANACO', -Fraction(5, 7))
'ANACO'
>>> woordbreuk('HOND', Fraction(-1, 2))
'ND'
>>> woordbreuk('ALPACA', Fraction(1, -6))
'A'

>>> woordbreuk('dwergmuis', Fraction(1, 2))
Traceback (most recent call last):
AssertionError: ongeldige breuk

>>> combineer(['leeuw', 'stekelmuis', 'nerts'], [Fraction(3, 5), Fraction(1, 2), Fraction(1, 5)])
'leesteken'
>>> combineer(['GUANACO', 'HOND', 'ALPACA'], [Fraction(-5, 7), Fraction(-1, 2), Fraction(-1, 6)])
'ANACONDA'
>>> combineer(['dwergmuis', 'paling'], [Fraction(2, 9), Fraction(-5, 6)])
'dwaling'
>>> combineer(['eLand', 'Meikever', 'goudhamsTer'], [Fraction(-4, 5), Fraction(1, 4), Fraction(-3, 11)])
'LandMeTer'

>>> ontleed('Wat is 3/5 leeuw, 1/2 stekelmuis en 1/5 nerts?')
(['leeuw', 'stekelmuis', 'nerts'], [Fraction(3, 5), Fraction(1, 2), Fraction(1, 5)])
>>> ontleed('Wat is -5/7 GUANACO, -1/2 HOND en -1/6 ALPACA?')
(['GUANACO', 'HOND', 'ALPACA'], [Fraction(-5, 7), Fraction(-1, 2), Fraction(-1, 6)])
>>> ontleed('Wat is 2/9 dwergmuis en -5/6 paling?')
(['dwergmuis', 'paling'], [Fraction(2, 9), Fraction(-5, 6)])
>>> ontleed('Wat is -4/5 eLand, 1/4 Meikever en -3/11 goudhamsTer?')
(['eLand', 'Meikever', 'goudhamsTer'], [Fraction(-4, 5), Fraction(1, 4), Fraction(-3, 11)])

>>> antwoord('Wat is 3/5 leeuw, 1/2 stekelmuis en 1/5 nerts?')
'leesteken'
>>> antwoord('Wat is -5/7 GUANACO, -1/2 HOND en -1/6 ALPACA?')
'ANACONDA'
>>> antwoord('Wat is 2/9 dwergmuis en -5/6 paling?')
'dwaling'
>>> antwoord('Wat is -4/5 eLand, 1/4 Meikever en -3/11 goudhamsTer?')
'LandMeTer'

Epiloog

Qua uitzicht lijkt het vogelbekdier alsof Moeder Natuur Frankenstein gespeeld heeft met stukjes vogel, reptiel en zoogdier. Maar ook uit zijn genoom — dat sinds januari 2021 volledig in kaart gebracht werd — blijkt dat het vogelbekdier een vreemde mix heeft van genen uit verschillende klassen van gewervelden.

Bronnen