De uitvinder van de schrijfmachine — Christopher Scholes1 — zette op zijn eerste model de letters op het toetsenbord in alfabetische volgorde. Omdat enkele veelgebruikte symbolen hierdoor naast elkaar kwamen te liggen, botsten de mechanische letterstangetjes van de schrijfmachine vaak tegen elkaar en bleven ze klem zitten. Om dit te verhelpen, herschikte Scholes de symbolen op het toetsenbord. De eerste Scholes en Glidden schrijfmachine2 die uiteindelijk rond 1873 in productie werd genomen bij het bedrijf Remington had reeds een voorloper van de hedendaagse QWERTY-indeling. Volgens een populaire mythe plaatste Remington de letters op de eerste rij van de schrijfmachine zodat verkopers de klanten konden imponeren door de productnaam TYPEWRITER uit te schrijven aan de hand van de symbolen op de eerste rij van het toetsenbord. Er wordt ook nog vaak beweerd dat TYPEWRITER het langste woord is dat kan geschreven worden met de letters van één enkele rij op een toetsenbord. Restanten van de oorspronkelijke alfabetische indeling van het toetsenbord zijn nog terug te vinden in de reeks DFGHJKL op de middelste rij van een toetsenbord.

QWERTY-toetsenbord
QWERTY-toetsenbordindeling uit een patent van Christopher Sholes (U.S. Patent No. 207,559 uit 1878). Enkele toetsen zijn hier nog niet hetzelfde als bij de moderne QWERTY-indeling: de C en de X zijn omgewisseld en de M zit nu naast de N.

Naast QWERTY werden ook nog enkele andere toetsenbordindelingen ontwikkeld, zoals AZERTY-toetsenborden gebruikt in Frankrijk en België, QWERTZ-toetsenborden gebruikt in Duitstalige en een aantal Oost-Europese landen, of het Dvorak toetsenbord, bedacht door August Dvorak omdat het ergonomisch beter zou zijn.

Opgave

  1. Schrijf een functie rijToets waarmee kan bepaald worden op welke rij van een toetsenbord een gegeven symbool kan teruggevonden worden. Dit symbool moet als argument aan de functie doorgegeven worden. De functie moet standaard de indeling van een QWERTY-toetsenbord gebruiken, maar via een optioneel argument toetsenbord kan aan de functie een andere indeling doorgegeven worden. Een toetsenbordindeling wordt omschreven door een string waarin de symbolen van het toetsenbord worden opgelijst van links naar rechts, en van boven naar onder. Tussen twee rijen van een toetsenbord wordt in de string telkens een verticale streep (|) geplaatst. De indeling van een QWERTY-toetsenbord wordt bijvoorbeeld weergegeven als QWERTYUIOP|ASDFGHJKL|ZXCVBNM en de indeling van een AZERTY-toetsenbord als AZERTYUIOP|QSDFGHJKLM|WXCVBN. De eerste rij wordt aangegeven met rijnummer 1, en de functie moet de waarde None teruggeven indien het gegeven symbool niet op het toetsenbord wordt teruggevonden. Bij het opzoeken mag geen onderscheid gemaakt worden tussen hoofdletters en kleine letters.

  2. Gebruik de functie rijToets om een functie rijWoord te schrijven met twee parameters: een verplichte parameter woord waaraan een gegeven woord als argument moet doorgegeven worden, en een optionele parameter toetsenbord met dezelfde betekenis als bij de functie rijToets. Indien het gegeven woord volledig kan uitgeschreven worden met de letters op één enkele rij van het toetsenbord, dan moet de functie het nummer van die rij (rijen worden opnieuw genummerd vanaf 1) als resultaat teruggeven. Anders moet de functie de waarde None teruggeven. Ook als het woord de lege string is, moet de waarde None teruggegeven worden. De functie mag geen onderscheid maken tussen hoofdletters en kleine letters.

  3. Gebruik de functie rijWoord om een functie langsteWoord te schrijven. Aan deze functie moet een lijst van woorden als verplicht argument doorgegeven worden. Uit deze woordenlijst moet de functie het langste woord teruggeven dat kan geschreven worden met de letters op één enkele rij van het toetsenbord. Indien er meerdere zulke woorden zijn met maximale lengte, dan moet de functie het woord teruggeven dat als eerst voorkomt in de woordenlijst. Naast een lijst van woorden kunnen aan de functie nog twee optionele parameters doorgegeven worden: een optionele parameter toetsenbord met dezelfde betekenis als bij de functie rijToets, en een optionele parameter rij die specifiek aangeeft met de letters van welke rij van het toetsenbord de woorden moeten kunnen gevormd worden. Indien deze laatste parameter niet wordt doorgegeven, dan maakt het niet uit welke rij van het toetsenbord gebruikt wordt om de woorden uit te schrijven, zolang de woorden maar kunnen gevormd worden met de letters van één enkele rij van het toetsenbord.

Epiloog

Toen IBM in 1995 de ThinkPad 701c lanceerde, sloeg de laptop vooral grote ogen met zijn unieke vlindertoetsenbord3. Deze video toont het in actie.

Voorbeeld

>>> rijToets('U')
1
>>> rijToets('A')
2
>>> rijToets('z')
3
>>> rijToets('?')

>>> azerty = 'AZERTYUIOP|QSDFGHJKLM|WXCVBN'
>>> rijToets('A', toetsenbord=azerty)
1

>>> rijWoord('Tiruppur')
1
>>> rijWoord('Jalajala')
2
>>> rijWoord('Bavikove')

>>> azerty = 'AZERTYUIOP|QSDFGHJKLM|WXCVBN'
>>> rijWoord('Erattupetta', toetsenbord=azerty)
1
>>> rijWoord('Bavikove', toetsenbord=azerty)

>>> hcesar = 'HCESAROPZ|QTDINULMX|YJBFVGKW'
>>> rijWoord('Hazorasp', toetsenbord=hcesar)
1
>>> rijWoord('Xiulin', toetsenbord=hcesar)
2
>>> rijWoord('Bvkv', toetsenbord=hcesar)
3

>>> steden = ['Alaghsas', 'Erattupetta', 'Hazorasp', 'Piripiri', 'Tuntum']

>>> langsteWoord(steden)
'Alaghsas'

>>> langsteWoord(steden, rij=1)
'Piripiri'
>>> langsteWoord(steden, rij=2)
'Alaghsas'
>>> langsteWoord(steden, rij=3)

>>> azerty = 'AZERTYUIOP|QSDFGHJKLM|WXCVBN'
>>> langsteWoord(steden, toetsenbord=azerty)
'Erattupetta'
>>> langsteWoord(steden, toetsenbord=azerty, rij=1)
'Erattupetta'
>>> langsteWoord(steden, rij=2, toetsenbord=azerty)
>>> langsteWoord(steden, toetsenbord=azerty, rij=3)

>>> hcesar = 'HCESAROPZ|QTDINULMX|YJBFVGKW'
>>> langsteWoord(steden, toetsenbord=hcesar)
'Hazorasp'
>>> langsteWoord(steden, toetsenbord=hcesar, rij=1)
'Hazorasp'
>>> langsteWoord(steden, rij=2, toetsenbord=hcesar)
'Tuntum'
>>> langsteWoord(steden, toetsenbord=hcesar, rij=3)