De toetsenbordcodering maakt gebruik van een specifieke toetsenbordindeling. Laat ons bijvoorbeeld de meest gebruikelijke indeling in België nemen: AZERTY. Daarin zijn de cijfers en letters als volgt ingedeeld over vier rijen:

AZERTY
AZERTY toetsenbordindeling zoals die in België gebruikt wordt.

In elke toetsenbordindeling komen de 10 cijfers en de 26 hoofdletters elk op juist één toets voor en er zijn ook geen andere toetsen. De toetsen zijn ingedeeld over een aantal rijen die van boven naar onder genummerd worden vanaf 1. Elk rij bevat hoogstens tien toetsen die van links naar rechts genummerd worden vanaf 1. Als er tien toetsen op een rij staan dan wordt de tiende toets echter genummerd met 0. Op die manier bestaat het kolomnummer van elke toets uit één cijfer en kunnen we de positie van elke toets voorstellen als een paar $$(r, k)$$, waarbij $$r$$ het rijnummer en $$k$$ het kolomnummer van de toets aanduidt.

Bij het coderen van een bericht worden enkel de letters en de cijfers uit het bericht overgehouden. De overige karakters worden genegeerd. Er wordt ook geen onderscheid gemaakt tussen hoofdletters en kleine letters. De codering bestaat uit een aantal regels: evenveel als het aantal rijen in de gebruikte toetsenbordindeling. Voor elke letter of elk cijfer uit het bericht staat het kolomnummer (één cijfer) van de corresponderende toets op de regel die correspondeert met het rij waarop de toets te vinden is. Op de overige regels staat er telkens een koppelteken (-) in de corresponderende kolom. Als we op deze manier de zin

The first computer was invented in the 1940s.

coderen met de indeling van een AZERTY-toetsenbord, dan krijgen we een codering die bestaat uit vier regels

THEFIRSTCOMPUTERWASINVENTEDINTHE1940S
    
--------------------------------1940-
5-3-84-5-9-07534-1-8--3-53-8-5-3-----
-6-4--2---0-------2-------3---6-----2
--------3-------1---64-6----6--------

We hebben er als referentie ook de opeenvolgende letters en cijfers uit het bericht boven gezet. De eerste letter van het bericht, de hoofdletter T, vinden we op het toetsenbord bijvoorbeeld terug op positie $$(2, 5)$$. Daarom begint de tweede regel van de codering met een 5 en beginnen de overige regels met een koppelteken (-). De tweede letter van het bericht, de letter h, vinden we op het toetsenbord terug op positie $$(3, 6)$$. Daarom is het tweede karakter op de derde regel van de codering een 6 en is het tweede karakter op de overige regels een koppelteken (-).

Opgave

We stellen een toetsenbordindeling voor als een reeks (list of tuple) met de beschrijvingen van de rijen van het toetsenbord (opgelijst van boven naar onder). Een rij wordt beschreven door een string (str) met de cijfers en letters op de toetsen van die rij (opgelijst van links naar rechts). Elke rij bevat minstens één en hoogstens tien toetsen. De 10 cijfers en de 26 hoofdletters staan elk op juist één toets en er zijn geen andere toetsen.

Gevraagd wordt:

De laatste vier functies mogen ervan uitgaan dat er enkel geldige argumenten aan doorgegeven worden, zonder dat ze dit expliciet moeten controleren.

Voorbeeld

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

>>> azerty = ['1234567890', 'AZERTYUIOP', 'QSDFGHJKLM', 'WXCVBN']
>>> isindeling(azerty)
True
>>> positie('T', azerty)
(2, 5)
>>> positie('m', azerty)
(3, 0)
>>> toets(2, 5, azerty)
'T'
>>> toets(3, 0, azerty)
'M'
>>> print(codeer('The first computer was invented in the 1940s.', azerty))
--------------------------------1940-
5-3-84-5-9-07534-1-8--3-53-8-5-3-----
-6-4--2---0-------2-------3---6-----2
--------3-------1---64-6----6--------
>>> decodeer('bericht.txt2', azerty)
'THEFIRSTCOMPUTERWASINVENTEDINTHE1940S'