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 fractions1 van de Python Standard Library2. 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.

Het vogelbekdier brengt de helft van de tijd in het water door. Bij het zwemmen worden de voorpoten afwisselend bewogen.

Bronnen