In 1984 verkreeg de Duitse schilder en kunstenaar Ralf Krempel een patent voor het coderen van berichten als kleurcodes. Daarbij wordt elk karakter gecodeerd als een unieke reeks van één of meer kleuren. Volgens onderstaande tabel wordt hoofdletter C bijvoorbeeld gecodeerd als kleurcode geel-blauw, kleine letter o als kleurcode blauw en kleine letter s als kleurcode rood-geel.

Bij het coderen worden de kleurcodes voor de opeenvolgende karakters van een klare tekst achter elkaar gezet, en van elkaar gescheiden door een zwarte kleur. Met bovenstaande kleurcodes wordt klare tekst Cosmopolitan bijvoorbeeld gecodeerd als deze cijfertekst.

Een moderne versie van de Krempelcode stelt elke kleur in de cijfertekst voor door een emoji in die kleur. Omdat er meerdere emojis van dezelfde kleur zijn, kan elke kleur voorgesteld worden door verschillende emojis.

Als we elke kleur in de cijfertekst voor Cosmopolitan voorstellen door een willekeurig gekozen emoji van die kleur, dan krijgen we bijvoorbeeld deze cijfertekst

Omdat we voor elke kleur een willekeurige emoji in die kleur kiezen, kan de cijfertekst voor Cosmopolitan bijvoorbeeld ook voorgesteld worden als

We doorlopen het omgekeerde proces om een cijfertekst te decoderen. Als de cijfertekst voorgesteld worden met emojis, dan bepalen we eerst de kleur van elke emoji. Daarna bepalen we voor elke kleurcode het corresponderende karakter, waarbij kleurcodes van elkaar gescheiden worden door een zwarte kleur. We bekomen de klare tekst door al die karakters achter elkaar zetten.
Om berichten te coderen en te decoderen volgens een Krempelcode, stellen we elke kleur in de cijfertekst voor door een unieke hoofdletter (str). De kleur zwart wordt altijd voorgesteld door een asterisk (*; str).
De kleurcodes voor een Krempelcode worden vastgelegd in een tekstbestand waarvan elke regel bestaat uit een karakter dat kan voorkomen in een klare tekst, gevolgd door één of meer hoofdletters die de kleurcode voor dat karakter in een cijfertekst vastleggen. Dit zijn bijvoorbeeld de eerste regels van het bestand met kleurcodes voor de Krempelcode die we in de inleiding gebruikt hebben (krempel.txt):
AYG
aGB
BGR
CYB
iGP
JRR
KY
LYP
lP
mRB
nYR
OG
…
De cijfertekst (str) voor Cosmopolitan wordt met deze kleurcodes voorgesteld als
YB*B*RY*RB*B*YY*B*P*GP*GY*GB*YR
We kunnen een kleur ook voorstellen door een emoji (str) uit de UTF-8 tekencodering, waarbij emojis bestaan uit één enkel karakter. Meerdere emojis kunnen dezelfde kleur voorstellen, in tegenstelling tot hoofdletters en de asterisk die altijd op een unieke manier een kleur voorstellen.
De kleuren van emojis voor een Krempelcode worden vastgelegd in een tekstbestand waarvan elke regel bestaat uit een emoji en de hoofdletter of een asterisk (*) voor de kleur van die emoji. Dit zijn bijvoorbeeld de eerste regels van het bestand met emojis voor de Krempelcode die we in de inleiding gebruikt hebben (emoji.txt):
πR
π§B
πY
πP
π«G
πG
π€*
πP
πY
π’G
π₯©R
πP
…
De cijfertekst (str) voor Cosmopolitan kan met deze emojis voorgesteld worden als (eerste voorbeeld uit inleiding)
ππ¦π¦π§π€πππ€πππ¦π¦π€πππ¦π¦π€πΎπ€π«ππ¦πππ€π’ππ€ππ
of als (tweede voorbeeld uit inleiding)
πππ¦π§π¦π₯©ππ€πππ€ππ¦πππ¦π¬π€πΎπ¦π«ππ€π«ππ€π’π¦π€ππ₯©
Definieer een klasse Krempel waarmee berichten kunnen gecodeerd en gedecodeerd worden volgens een Krempelcode. Bij het aanmaken van een nieuwe Krempelcode (Krempel) moet de locatie (str) doorgegeven worden van een tekstbestand met de kleurcodes die de Krempelcode gebruikt. Optioneel kan als tweede argument ook nog de locatie (str) doorgegeven worden van een tekstbestand met de emojis die de Krempelcode gebruikt. Als er geen tweede argument wordt doorgegeven, dan gebruikt de Krempelcode geen emojis.
Op een Krempelcode $$\mathcal{K}$$ (Krempel) moet je minstens de volgende methoden kunnen aanroepen:
Een methode karakter2code waaraan een karakter (str) moet doorgegeven worden. Als het karakter volgens Krempelcode $$\mathcal{K}$$ niet in een klare tekst mag voorkomen, dan moet een AssertionError opgeworpen worden met boodschap ongeldig karakter. Anders moet de kleurcode (str) teruggegeven worden die volgens Krempelcode $$\mathcal{K}$$ in een cijfertekst correspondeert met dat karakter in een klare tekst.
Een methode code2karakter waaraan een kleurcode (str) moet doorgegeven worden. Als de kleurcode volgens Krempelcode $$\mathcal{K}$$ niet in een cijfertekst mag voorkomen, dan moet een AssertionError opgeworpen worden met boodschap ongeldige code. Anders moet het karakter (str) teruggegeven worden dat volgens Krempelcode $$\mathcal{K}$$ in een klare tekst correspondeert met die kleurcode in een cijfertekst.
Een methode gebruikt_emojis waaraan geen argumenten moeten doorgegeven worden. De methode moet een Booleaanse waarde (bool) teruggeven, die aangeeft of Krempelcode $$\mathcal{K}$$ emojis gebruikt.
Een methode emoji2kleur waareen een emoji (str) moet doorgeven worden. Als Krempelcode $$\mathcal{K}$$ geen emojis gebruikt, dan moet een AssertionError opgeworpen worden met boodschap Krempelcode gebruikt geen emojis. Als de emoji volgens Krempelcode $$\mathcal{K}$$ niet mag voorkomen in een cijfertekst, dan moet een AssertionError opgeworpen worden met boodschap ongeldige emoji. Anders moet de kleur (str) van die emoji teruggegeven worden volgens Krempelcode $$\mathcal{K}$$.
Een methode kleur2emoji waaraan een kleur (str) moet doorgegeven worden. Als Krempelcode $$\mathcal{K}$$ geen emojis gebruikt, dan moet een AssertionError opgeworpen worden met boodschap Krempelcode gebruikt geen emojis. Als met de kleur geen emojis corresponderen volgens Krempelcode $$\mathcal{K}$$, dan moet een AssertionError opgeworpen worden met boodschap ongeldige kleur. Anders moet een willekeurig gekozen emoji (str) van die kleur teruggegeven worden volgens Krempelcode $$\mathcal{K}$$.
In Python kan je niet rechtstreeks een willekeurig element kiezen uit een verzameling (set). Je kunt dit oplossen door de verzameling eerst om te zetten naar een reeks (list of tuple) en daaruit dan een willekeurig element te kiezen.
Een methode decodeer waaraan een cijfertekst $$c$$ (str) moet doorgegeven worden die gecodeerd werd volgens Krempelcode $$\mathcal{K}$$. Als Krempelcode $$\mathcal{K}$$ geen emojis gebruikt, dan moeten de kleuren van cijfertekst $$c$$ voorgesteld worden met hoofdletters en asterisks (*). Anders moeten de kleuren van cijfertekst $$c$$ voorgesteld worden met emojis. De methode moet de klare tekst (str) teruggeven die men bekomt door cijfertekst $$c$$ (str) te decoderen volgens Krempelcode $$\mathcal{K}$$.
Een methode codeer waaraan een klare tekst $$t$$ (str) moet doorgegeven worden. De methode moet de cijfertekst (str) teruggeven die men bekomt door klare tekst $$t$$ te coderen volgens Krempelcode $$\mathcal{K}$$. Als Krempelcode $$\mathcal{K}$$ geen emojis gebruikt, dan moeten de kleuren van de cijfertekst voorgesteld worden met hoofdletters en asterisks (*). Anders moet elke kleur van de cijfertekst voorgesteld worden door een willekeurig gekozen emoji van die kleur.
In deze interactieve sessie gaan we ervan uit dat de tekstbestanden krempel.txt en emoji.txt in de huidige directory staan.
>>> krempel_01 = Krempel('krempel.txt')
>>> krempel_01.karakter2code('C')
'YB'
>>> krempel_01.karakter2code('?')
Traceback (most recent call last):
AssertionError: ongeldig karakter
>>> krempel_01.code2karakter('YB')
'C'
>>> krempel_01.code2karakter('BY')
Traceback (most recent call last):
AssertionError: ongeldige code
>>> krempel_01.gebruikt_emojis()
False
>>> krempel_01.emoji2kleur('π')
Traceback (most recent call last):
AssertionError: Krempelcode gebruikt geen emojis
>>> krempel_01.kleur2emoji('Y')
Traceback (most recent call last):
AssertionError: Krempelcode gebruikt geen emojis
>>> krempel_01.decodeer('YB*B*RY*RB*B*YY*B*P*GP*GY*GB*YR')
'Cosmopolitan'
>>> krempel_01.codeer('Cosmopolitan')
'YB*B*RY*RB*B*YY*B*P*GP*GY*GB*YR'
>>> krempel_02 = Krempel('krempel.txt', 'emoji.txt')
>>> krempel_02.gebruikt_emojis()
True
>>> krempel_02.emoji2kleur('π')
'Y'
>>> krempel_02.emoji2kleur('π€’')
Traceback (most recent call last):
AssertionError: ongeldige emoji
>>> krempel_02.kleur2emoji('Y') # doctest: +SKIP
'π'
>>> krempel_02.kleur2emoji('X')
Traceback (most recent call last):
AssertionError: ongeldige kleur
>>> krempel_02.decodeer('ππ¦π¦π§π€πππ€πππ¦π¦π€πππ¦π¦π€πΎπ€π«ππ¦πππ€π’ππ€ππ')
'Cosmopolitan'
>>> krempel_02.decodeer('πππ¦π§π¦π₯©ππ€πππ€ππ¦πππ¦π¬π€πΎπ¦π«ππ€π«ππ€π’π¦π€ππ₯©')
'Cosmopolitan'
>>> krempel_02.codeer('Cosmopolitan') # doctest: +SKIP
'ππ¦π¦π§π€πππ€πππ¦π¦π€πππ¦π¦π€πΎπ€π«ππ¦πππ€π’ππ€ππ'
>>> krempel_02.codeer('Cosmopolitan') # doctest: +SKIP
'πππ¦π§π¦π₯©ππ€πππ€ππ¦πππ¦π¬π€πΎπ¦π«ππ€π«ππ€π’π¦π€ππ₯©'