De letters van een woord worden één voor één op een trein geladen (van links naar rechts). Hierbij geldt:

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.

wagon
Manier waarop de letters van het woord WAGON op een trein geladen worden. Daarbij is voor iedere wagon aangegeven hoe zwaar die geladen is.

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} \]

Opgave

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:

Geen enkele van deze functies mag onderscheid maken tussen hoofdletters en kleine letters.

Voorbeeld

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'}

Bronnen