De letters van een woord worden één voor één op een trein geladen (van links naar rechts). Hierbij geldt:
de letter A weegt 1 ton
de letter B weegt $$\frac{1}{2}$$ ton
de letter C weegt $$\frac{1}{3}$$ ton
…
de letter Z weegt $$\frac{1}{26}$$ ton
Elke wagon heeft een maximaal laadvermogen van 1 ton. Er wordt pas een volgende wagon aangekoppeld als de volgende letter niet meer op de huidige wagon kan geladen worden zonder het maximaal laadvermogen te overschrijden.
Hierboven zie je bijvoorbeeld hoe de letters van het woord WAGON op een trein geladen worden. Daarbij is voor iedere wagon aangegeven hoe zwaar die geladen is. De eerste letter is W en weegt $$\frac{1}{23}$$ ton. De tweede letter is A en weegt 1 ton. De A past dus niet meer op de eerste wagon, want die zou dan te zwaar geladen zijn. Daarom wordt voor de A een tweede wagon aangekoppeld. Omdat die wagon dan meteen ook al volgeladen is, wordt er een derde wagon aangekoppeld. Daarin kunnen de resterende letters G, O en N geladen worden, want die hebben samen een gewicht van (in ton) \[ \frac{1}{7} + \frac{1}{15} + \frac{1}{14} = \frac{59}{210} \]
Een woord wordt voorgesteld als een string (str) die enkel bestaat uit letters. Een breuk wordt voorgesteld als een Fraction — een gegevenstype dat gedefinieerd wordt in de module fractions1 van de Python Standard Library2. Gevraagd wordt:
Schrijf een functie gewicht waaraan een letter (str) moet doorgegeven worden. De functie moet het gewicht (Fraction) van de gegeven letter teruggeven (in ton).
Schrijf een functie woordbreuk waaraan een woord $$w$$ (str) moet doorgegeven worden. De functie moet de woordbreuk van $$w$$ teruggeven — een tuple met de gewichten (Fraction) van de wagons die opeenvolgend geladen worden met de letters van $$w$$.
Schrijf een functie relatiebreuk waaraan de locatie (str) van een tekstbestand moet doorgegeven worden. Het tekstbestand moet een reeks woorden bevatten, elk op een afzonderlijke regel. De functie moet de relatiebreuk van de reeks woorden teruggeven. Dit is een dictionary (dict) waarvan de sleutels gevormd worden door de woordbreuken van de woorden in het gegeven bestand. Elke woordbreuk moet door de dictionary afgebeeld worden op de verzameling (set) van alle woorden (str, in hoofdletters) met die woordbreuk uit het gegeven bestand.
Schrijf een functie kettingbreuken waaraan twee argumenten moeten doorgegeven worden: i) een woord $$w$$ (str) en ii) de relatiebreuk $$r$$ (dict) van een reeks woorden. De functie moet een verzameling (set) teruggeven met alle woorden (str, in hoofdletters) uit $$r$$ met dezelfde woordbreuk als $$w$$. Het woord $$w$$ mag echter zelf niet voorkomen in de verzameling die door de functie wordt teruggegeven.
Geen enkele van deze functies mag onderscheid maken tussen hoofdletters en kleine letters.
In onderstaande voorbeeldsessie gaan we ervan uit dat het tekstbestand woorden.txt3 zich in de huidige directory bevindt.
>>> gewicht('A')
Fraction(1, 1)
>>> gewicht('c')
Fraction(1, 3)
>>> gewicht('Z')
Fraction(1, 26)
>>> woordbreuk('WAGON')
(Fraction(1, 23), Fraction(1, 1), Fraction(59, 210))
>>> woordbreuk('Blokschoenen')
(Fraction(3317, 4180), Fraction(279, 280), Fraction(1, 14))
>>> woordbreuk('tortelduiven')
(Fraction(739, 770), Fraction(19, 70))
>>> woordbreuk('vergunningen')
(Fraction(739, 770), Fraction(19, 70))
>>> relatie = relatiebreuk('woorden.txt4')
>>> relatie[(Fraction(1, 23), Fraction(1, 1), Fraction(59, 210))]
{'WAGON'}
>>> relatie[(Fraction(3317, 4180), Fraction(279, 280), Fraction(1, 14))]
{'BLOKSCHOENEN', 'RELIEKSCHRIJNEN'}
>>> relatie[(Fraction(739, 770), Fraction(19, 70))]
{'TORTELDUIVEN', 'VERGUNNINGEN', 'VOORUITRIJDEN'}
>>> relatie = relatiebreuk('woorden.txt')
>>> kettingbreuken('WAGON', relatie)
set()
>>> kettingbreuken('Blokschoenen', relatie)
{'RELIEKSCHRIJNEN'}
>>> kettingbreuken('tortelduiven', relatie)
{'VERGUNNINGEN', 'VOORUITRIJDEN'}
>>> kettingbreuken('vergunningen', relatie)
{'TORTELDUIVEN', 'VOORUITRIJDEN'}