Een gebroken dambord is een vorm van cryptografie die kan gebruikt worden om een alfabet om te zetten naar cijfers. Er zit tegelijkertijd ook een zekere vorm van datacompressie ingebakken in de methode. Hiervoor wordt gebruikgemaakt van een rooster (het gebroken dambord) dat de volgende vorm aanneemt:

  0 1 2 3 4 5 6 7 8 9
  E T   A O N   R I S
2 B C D F G H J K L M
6 P Q _ U V W X Y Z .

Op de eerst rij staan de tien cijfers in oplopende volgorde (0-9). De tweede rij wordt doorgaans opgevuld met vaak voorkomende letters. Daarbij worden twee posities open gelaten. Deze rij wordt ook niet voorafgegaan door een label. De twee volgende rijen worden telkens gelabeld met de cijfers waaraan geen letter werd toegewezen op de tweede rij, en worden opgevuld met de overige letters van het alfabet.

De symbolen van het alfabet kunnen op een willekeurige manier in het rooster geplaatst worden. Het rooster heeft dus in totaal 30 slots, waarvan er twee niet benut worden op de tweede rij. Als we dus een alfabet gebruiken van 26 hoofdletters, dan kunnen we nog twee extra plaatsen opvullen met andere symbolen. In bovenstaand voorbeeld hebben we als aanvulling gekozen voor een punt (.) en een underscore (_).

Bij het coderen wordt een letter die op de tweede rij staat vervangen door het cijfer dat als kolomlabel gebruikt wordt. Letters op de derde en vierde rij worden vervangen door een getal van twee cijfers, waarbij het eerst cijfer het rijlabel is, en het tweede cijfer het kolomlabel. Doordat veel voorkomende letters voorkomen op de tweede rij, kan de lengte van de gecodeerde boodschap kort gehouden worden. De boodschap THE_SHAWSHANK_REDEMPTION wordt bijvoorbeeld als volgt gecodeerd op basis van het bovenstaande rooster:

T H E _ S H A W S H A N K _ R E D E M P T I O N
1 25 0 62 9 25 3 65 9 25 3 5 27 62 7 0 22 0 29 60 1 8 4 5

Decoderen gebeurt eenvoudigweg door het proces om te keren. Ondanks het feit dat de groepen zowel uit één als uit twee cijfers kunnen bestaan, verloopt het decoderen toch ondubbelzinnig omdat een groep van twee cijfers steeds begint met een cijfer dat niet aan een letter gekoppeld is op de tweede rij van het rooster (2 en 6 in bovenstaand voorbeeld). Alle andere cijfers vormen een groep van één cijfer.

Opgave

Implementeer de volgende vier functies die gebruikt kunnen worden om boodschappen te coderen en decoderen volgens de methode van het gebroken dambord. Aan deze functies moeten telkens vier stringargument doorgegeven worden, waarbij de laatste drie argumenten bestaan uit tien karakters en corresponderen met de twee, derde en vierde rij van het gebruikte rooster. Het tweede stringargument bevat twee spaties, die de posities aangeven waarop geen letters staan op de tweede rij.

Voorbeeld

>>> letter2cijfers('A', 'ET AON RIS', 'BCDFGHJKLM', 'PQ_UVWXYZ.')
'3'
>>> letter2cijfers('C', 'ET AON RIS', 'BCDFGHJKLM', 'PQ_UVWXYZ.')
'21'
>>> letter2cijfers('U', 'ET AON RIS', 'BCDFGHJKLM', 'PQ_UVWXYZ.')
'63'

>>> cijfers2letter('3', 'ET AON RIS', 'BCDFGHJKLM', 'PQ_UVWXYZ.')
'A'
>>> cijfers2letter('21', 'ET AON RIS', 'BCDFGHJKLM', 'PQ_UVWXYZ.')
'C'
>>> cijfers2letter('63', 'ET AON RIS', 'BCDFGHJKLM', 'PQ_UVWXYZ.')
'U'

>>> codeer('THE_SHAWSHANK_REDEMPTION', 'ET AON RIS', 'BCDFGHJKLM', 'PQ_UVWXYZ.')
'1250629253659253527627022029601845'

>>> decodeer('1250629253659253527627022029601845', 'ET AON RIS', 'BCDFGHJKLM', 'PQ_UVWXYZ.')
'THE_SHAWSHANK_REDEMPTION'