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:
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 (-).
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:
Schrijf een functie isindeling waaraan één argument moet doorgegeven worden. De functie moet een Booleaanse waarde (bool) teruggeven, die aangeeft of het argument een geldige toetsenbordindeling voorstelt.
Schrijf een functie positie waaraan twee argumenten moeten doorgegeven worden: i) een cijfer of een letter (str) en ii) een toetsenbordindeling. De functie moet een tuple $$(r, k)$$ teruggeven dat de positie aanduidt van de toets waarop het cijfer of de letter staat in de gegeven toetsenbordindeling. Hierbij mag de functie geen onderscheid maken tussen hoofdletters en kleine letters.
Schrijf een functie toets waaraan drie argumenten moeten doorgegeven worden: i) een getal $$r$$ (int), ii) een getal $$k$$ (int) en iii) een toetsenbordindeling. De functie moet het cijfer of de hoofdletter (str) teruggeven die op de toets op positie $$(r, k)$$ staat in de gegeven toetsenbordindeling.
Schrijf een functie codeer waaraan twee argumenten moeten doorgegeven worden: i) een bericht (str) en ii) een toetsenbordindeling. De functie moet het gecodeerde bericht (str) teruggeven volgens een toetsenbordcodering met de gegeven toetsenbordindeling.
Schrijf een functie decodeer waaraan twee argumenten moeten doorgegeven worden: i) de locatie (str) van een tekstbestand en ii) een toetsenbordindeling. Het tekstbestand moet de regels van een bericht bevatten dat gecodeerd werden volgens een toetsenbordcodering met de gegeven toetsenbordindeling. De functie moet de opeenvolgende cijfers en letters (str) in het originele bericht teruggeven, waarbij alle letters omgezet werden naar hoofdletters.
De laatste vier functies mogen ervan uitgaan dat er enkel geldige argumenten aan doorgegeven worden, zonder dat ze dit expliciet moeten controleren.
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'