Swype1 en SwiftKey2 zijn twee virtual keyboard3 apps voor smartphones en tablets met aanraakschermen4, die toelaten om woorden in te voeren door een vinger of een stylus van de eerste naar de laatste letter van elk woord te slepen, en onderweg over alle opeenvolgende letters van het woord te slepen. Op die manier moet de vinger of de stylus enkel tussen twee woorden opgetild worden.

swype (quick)

Opgave

Een woord $$w$$ is een string (str) die enkel kleine letters bevat (minstens 3). De buitenkant van $$w$$ wordt gevormd door de aaneenschakeling van de eerste en de laatste letter van $$w$$. De binnenkant van $$w$$ wordt verkregen door de eerste en de laatste letter van $$w$$ te schrappen. Zo is de buitenkant van het woord quick bijvoorbeeld gelijk aan qk, en is de binnenkant van dat woord gelijk aan uic.

Een woord $$w_1$$ is een deelwoord van woord $$w_2$$ als het kan bekomen worden door letters uit $$w_2$$ te schrappen zonder de volgorde van de overblijvende letters te veranderen. Zo is king bijvoorbeeld een deelwoord van skintight. Bovendien is het ook toegelaten om opeenvolgende gelijke letters van $$w_1$$ op dezelfde letter van $$w_2$$ af te beelden. Op die manier is queen bijvoorbeeld toch een deelwoord van qxuyezn, ondanks het feit dat de letter e maar één keer voorkomt in het tweede woord.

Een woord $$w_1$$ is een wandeling door woord $$w_2$$ als i) zijn eerste letter gelijk is aan de eerste letter van $$w_2$$, ii) zijn laatste letter gelijk is aan de laatste letter van $$w_2$$ en iii) het een deelwoord is van $$w_2$$.

Een woordenboek is een tekstbestand met een reeks woorden die elk op een afzonderlijke regel staan.

Gevraagd wordt:

Voorbeeld

In onderstaande voorbeeldsessie gaan we ervan uit dat het tekstbestand woordenboek.txt5 zich in de huidige directory bevindt.

>>> buitenkant('quick')
'qk'
>>> buitenkant('queen')
'qn'
>>> buitenkant('king')
'kg'
>>> buitenkant('win')
'wn'

>>> binnenkant('quick')
'uic'
>>> binnenkant('queen')
'uee'
>>> binnenkant('king')
'in'
>>> binnenkant('win')
'i'

>>> isdeelwoord('quick', 'qwertyuihgfcvbnhjk')
True
>>> isdeelwoord('win', 'qwertyuytresdftyuiokn')
True
>>> isdeelwoord('queen', 'qwertyuytresdftyuiokn')
True
>>> isdeelwoord('quick', 'qwertyuytresdftyuiokn')
False

>>> iswandeling('quick', 'qwertyuihgfcvbnhjk')
True
>>> iswandeling('win', 'qwertyuytresdftyuiokn')
False
>>> iswandeling('queen', 'qwertyuytresdftyuiokn')
True
>>> iswandeling('quick', 'qwertyuytresdftyuiokn')
False

>>> woordenboek = woordenboek_inlezen('woordenboek.txt6')
>>> woordenboek['qk']
{'uir', 'uar', 'uarterdec', 'uac', 'uarterbac', 'uic'}
>>> woordenboek['qn']
{'uotidia', 'uee', 'uestio', 'uicke'}
>>> woordenboek['xx']
Traceback (most recent call last):
KeyError: 'xx'

>>> wandelingen('qwertyuihgfcvbnhjk', woordenboek)
{'quick'}
>>> wandelingen('qwertyuytresdftyuiokn', woordenboek)
{'queen', 'question'}
>>> wandelingen('ghijakjthoijerjidsdfnokg', woordenboek)
{'gating', 'geeing', 'goring', 'going', 'gathering'}
>>> wandelingen('xkzjunspebfgslddfksdrx', woordenboek)
set()

Onderstaande figuur toont waarom het woord quick een wandeling is door de gegeven reeks letters (bovenaan) in het eerste voorbeeld van de functie wandelingen.

quick
Selecteer letters uit de bovenste reeks om het woord quick te vormen.

Onderstaande figuur toont waarom de woorden queen en question wandelingen zijn door de gegeven reeks letters (midden) in het tweede voorbeeld van de functie wandelingen. Let hierbij op het feit dat de twee opeenvolgende letters e in het woord queen alletwee gebruikmaken van dezelfde letter e in de reeks letters.

queen & question
Selecteer letters uit de middelste reeks om de woorden queen (boven) en question (onder) te vormen. Let hierbij op het feit dat de twee opeenvolgende letters e in het woord queen beide gebruikmaken van dezelfde letter e in de middelste reeks letters.