Het toetsenbord van een mobiele telefoon bestaat uit 12 toetsen: toetsen met de cijfers 09 en twee bijkomende toetsen (* en #). Om tekst te kunnen typen met dergelijke toetsenborden worden de letters AZ in alfabetische volgorde verdeeld over de toetsen 29. De SPATIE wordt doorgaans toegekend aan de toets met het cijfer 0, maar dat varieert afhankelijk van het type telefoon.

toetsenbord
Toetsenbord van een mobiele telefoon met 12 toetsen. De LetterWise-techniek maakt gebruik van een NEXT-toets (rechtsonder).

LetterWise1 is een techniek die ontwikkeld werd om met deze dubbelzinnigheid te kunnen omgaan. In tegenstelling tot andere technieken (bv. Multitap2 of T93) is LetterWise niet afhankelijk van een ingebouwd woordenboek, waardoor je zonder beperkingen en met zeer hoge efficiëntie woorden kunt typen. Omdat het een heel eenvoudig systeem is om te gebruiken, bestaat de handleiding slechts uit één enkele zin:

Druk op de toets met de letter die je wil typen en als die niet verschijnt, druk dan op NEXT totdat de letter verschijnt.

Om te raden welke letter je wil typen, werkt LetterWise achterliggend met een databank die aangeeft welke letters het vaakst voorkomen na een bepaalde prefix. Een prefix bestaat uit de letters die je reeds getypt hebt voor je de volgende toets indrukt. Als je bijvoorbeeld de toets met het cijfer 3 indrukt met prefix th, dan wil je vermoedelijk de letter e typen als volgende letter omdat de opeenvolging van drie letters the in het Engels veel vaker voorkomt dan thd of thf. Af en toe raadt LetterWise de verkeerde letter. In dat geval moet je op een speciale NEXT-toets drukken om de volgende meest waarschijnlijke letter voor de gegeven toets en prefix te kiezen.

Per taal (Engels, Nederlands, …) gebruikt LetterWise een databank die prefixen van nul, één, twee en drie letters koppelt aan een alfabet. Een dergelijk alfabet bevat de 26 hoofdletters volgens dalende kans om voor te komen na de prefix. Hieronder zie je bijvoorbeeld een aantal koppelingen uit de databank voor het Engels.

prefix alfabet
  EIASNORTLCUPDMHGYBFVKWZXQJ
W AIEOHNRSLDBKTYMFUPWCGZJQVX
WA RYTLNSIGBKDVMXUFCPHWEZAJOQ
WAT ECTHASUFINORLPDMGYBVKWZXQJ
ATE DSRLNCGMEAFUWTBIOHPYXKVZQJ

Om geheugen te sparen, worden enkel de meest voorkomende prefixen opgenomen in de databank. Het is wel zo dat de databank altijd een alfabet koppelt aan de lege prefix (eerste rij in bovenstaande tabel). Als een prefix niet in de databank voorkomt, dan wordt die per definitie gekoppeld aan het alfabet dat correspondeert met de lege prefix.

letterwise
Om na de letters WATE de letter R te typen, moet je met LetterWise de 7-toets indrukken, gevolgd door de NEXT-toets.

Stel nu dat we bijvoorbeeld het woord WATER willen typen en dat we reeds de prefix WATE getypt hebben. LetterWise gebruikt maximaal de laatste drie letters van de prefix (ATE) om het daaraan gekoppelde alfabet op te zoeken in de databank (DSRLNCGMEAFUWTBIOHPYXKVZQJ). Om de letter R te typen, drukken we op de toets met het cijfer 7 waarop de letters PQRS gegroepeerd staan. Op basis van het alfabet dat aan de prefix ATE gekoppeld is, vermoedt LetterWise echter dat we de letters S bedoelen omdat deze van de vier letters die op de 7-toets gegroepeerd staan als eerste in het alfabet voorkomt. We moeten in dit geval dus ook nog op de NEXT-toets drukken om de volgende letter die op de 7-toets staat uit het alfabet te selecteren. Dat blijkt de letter R te zijn.

Bij LetterWise komt het typen van een letter dus neer op het indrukken van een cijfertoets, gevolgd door nul of meer keer op de NEXT-toets drukken. Een dergelijke combinatie van toetsen die ingedrukt worden om één letter te typen, stellen we voor als een string (str) die begint met een cijfer (cijfertoets waarop letters gegroepeerd staan), gevolgd door nul of meer keer de letter N (NEXT-toets). Dit zijn dus de combinaties die je moet indrukken om het woord WATER te typen met de LetterWise databank voor het Engels:

prefix combinatie alfabet
  9N EIASNORTLCUPDMHGYBFVKWZXQJ
W 2 AIEOHNRSLDBKTYMFUPWCGZJQVX
WA 8 RYTLNSIGBKDVMXUFCPHWEZAJOQ
WAT 3 ECTHASUFINORLPDMGYBVKWZXQJ
WATE 7N DSRLNCGMEAFUWTBIOHPYXKVZQJ

We merken ten slotte nog op dat bij het gebruik van de NEXT-toets voor het aflopen van de letters die op een toets gegroepeerd staan, na de laatste letter opnieuw de eerste letter volgt. Zo krijgen we voor prefix WATE met combinatie 7 de letter S, met combinatie 7N de letter R, met combinatie 7NN de letter P, met combinatie 7NNN de letter Q, en met combinatie 7NNNN terug de letter S.

Opgave

De LetterWise databank voor een bepaalde taal wordt opgeslagen in een tekstbestand waarvan elke regel bestaat uit een prefix, gevolgd door een komma (,) en het alfabet dat aan de prefix gekoppeld wordt. Hieronder staat bijvoorbeeld een selectie van de regels uit de LetterWise databank voor het Engels (en.txt4).

,EIASNORTLCUPDMHGYBFVKWZXQJ
A,TLNRCSBMPDGIUVEKYFWZHXOQJA
AA,LRMSNTDGPIHBFKCEAUWZOYVXQJ
AAB,ADEISNORTLCUPMHGYBFVKWZXQJ
AAD,EIZASNORTLCUPDMHGYBFVKWXQJ
…
ATD,ORAEISNTLCUPDMHGYBFVKWZXQJ
ATE,DSRLNCGMEAFUWTBIOHPYXKVZQJ
ATF,OIUAELSNRTCPDMHGYBFVKWZXQJ
…
VZO,NKEIASORTLCUPDMHGYBFVWZXQJ
W,AIEOHNRSLDBKTYMFUPWCGZJQVX
WA,RYTLNSIGBKDVMXUFCPHWEZAJOQ
WAA,RCPGEIASNOTLUDMHYBFVKWZXQJ
WAB,LBISEARTNOCUPDMHGYFVKWZXQJ
…
WAS,HTPSENOAKIRLCUDMGYBFVWZXQJ
WAT,ECTHASUFINORLPDMGYBVKWZXQJ
WAU,LKCGRNBFSPMVEIAOTUDHYWZXQJ

Gevraagd wordt:

Voorbeeld

Bij onderstaande voorbeeldsessie gaan we ervan uit dat de tekstbestanden en.txt5 en nl.txt6 zich in de huidige directory bevinden.

>>> databank = lees_databank('en.txt7')
>>> databank['']
'EIASNORTLCUPDMHGYBFVKWZXQJ'
>>> databank['W']
'AIEOHNRSLDBKTYMFUPWCGZJQVX'
>>> databank['WA']
'RYTLNSIGBKDVMXUFCPHWEZAJOQ'
>>> databank['WAT']
'ECTHASUFINORLPDMGYBVKWZXQJ'
>>> databank['ATE']
'DSRLNCGMEAFUWTBIOHPYXKVZQJ'
>>> databank['AAA']
Traceback (most recent call last):
KeyError: 'AAA'

>>> letter('', '9', databank)
'Y'
>>> letter('', '9N', databank)
'W'
>>> letter('W', '2', databank)
'A'
>>> letter('WA', '8', databank)
'T'
>>> letter('WAT', '3', databank)
'E'
>>> letter('WATE', '7', databank)
'S'
>>> letter('WATE', '7N', databank)
'R'
>>> letter('WATE', '7NN', databank)
'P'
>>> letter('WATE', '7NNN', databank)
'Q'
>>> letter('WATE', '7NNNN', databank)
'S'

>>> combinaties('9N2837N')
['9N', '2', '8', '3', '7N']
>>> combinaties('4N25837N83553')
['4N', '2', '5', '8', '3', '7N', '8', '3', '5', '5', '3']
>>> combinaties('4N65N524N36')
['4N', '6', '5N', '5', '2', '4N', '3', '6']
>>> combinaties('92837')
['9', '2', '8', '3', '7']
>>> combinaties('4NN25837N83553')
['4NN', '2', '5', '8', '3', '7N', '8', '3', '5', '5', '3']
>>> combinaties('4NN65N524N3N6')
['4NN', '6', '5N', '5', '2', '4N', '3N', '6']

>>> woord('9N2837N', databank)
'WATER'
>>> woord('4N25837N83553', databank)
'HALTESTELLE'
>>> woord('4N65N524N36', databank)
'HOKKAIDO'

>>> databank = lees_databank('nl.txt8')
>>> woord('92837', databank)
'WATER'
>>> woord('4NN25837N83553', databank)
'HALTESTELLE'
>>> woord('4NN65N524N3N6', databank)
'HOKKAIDO'

Bronnen