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)
πππ¦π§π¦π₯©ππ€πππ€ππ¦πππ¦π¬π€πΎπ¦π«ππ€π«ππ€π’π¦π€ππ₯©
Gevraagd wordt:
Schrijf een functie lees_codes waaraan de locatie (str) moet doorgegeven worden van een tekstbestand met kleurcodes voor een Krempelcode $$\mathcal{K}$$. De functie moet de dictionary met kleurcodes voor Krempelcode $$\mathcal{K}$$ teruggeven: een dictionary (dict) die elk karakter (str) dat kan voorkomen in een klare tekst afbeeldt op de corresponderende kleurcode (str) die bestaat uit één of meer hoofdletters.
Schrijf een functie lees_emojis waaraan de locatie (str) moet doorgegeven worden van een tekstbestand met emojis voor een Krempelcode $$\mathcal{K}$$. De functie moet de dictionary met emojis voor Krempelcode $$\mathcal{K}$$ teruggeven: een dictionary (dict) die elke emoji (str) die kan voorkomen in een cijfertekst afbeeldt op de hoofdletter/asterisk (str) die correspondeert met de kleur voor die emoji.
Schrijf een functie gekleurde_emojis waaraan de dictionary (dict) met emojis voor een Krempelcode $$\mathcal{K}$$ moet doorgegeven worden. De functie moet de omgekeerde dictionary teruggeven: een dictionary (dict) die elke kleur (str; hoofdletter/asterisk) van Krempelcode $$\mathcal{K}$$ afbeeldt op een verzameling (set) met alle emojis (str) van die kleur.
Schrijf een functie decodeer waaraan twee argumenten moeten doorgegeven worden: i) een cijfertekst $$c$$ die gecodeerd werd volgens een Krempelcode $$\mathcal{K}$$ (str) en ii) de dictionary (dict) met kleurcodes voor Krempelcode $$\mathcal{K}$$. De functie moet de klare tekst (str) teruggeven die men bekomt door cijfertekst $$c$$ (str) te decoderen volgens Krempelcode $$\mathcal{K}$$. De functie heeft een derde optionele parameter waaraan de dictionary (dict) met emojis voor Krempelcode $$\mathcal{K}$$ kan doorgegeven worden. Als er geen dictionary met emojis wordt doorgegeven, dan moeten de kleuren van cijfertekst $$c$$ voorgesteld worden met hoofdletters en asterisks (*). Anders moeten de kleuren van cijfertekst $$c$$ voorgesteld worden met emojis.
Schrijf een functie codeer waaraan twee argumenten moeten doorgegeven worden: i) een klare tekst $$t$$ (str) en ii) de dictionary (dict) met kleurcodes voor een Krempelcode $$\mathcal{K}$$. De functie moet de cijfertekst (str) teruggeven die men bekomt door klare tekst $$t$$ te coderen volgens Krempelcode $$\mathcal{K}$$. De functie heeft een derde optionele parameter waaraan de dictionary (dict) met emojis voor Krempelcode $$\mathcal{K}$$ kan doorgegeven worden. Als er geen dictionary met emojis wordt doorgegeven, 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 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.
De functies gekleurde_emojis, decodeer en codeer mogen de dictionaries (dict) die eraan doorgegeven worden niet wijzigen.
In deze interactieve sessie gaan we ervan uit dat de tekstbestanden krempel.txt en emoji.txt in de huidige directory staan.
>>> karakter2kleuren = lees_codes('krempel.txt')
>>> karakter2kleuren['C']
'YB'
>>> karakter2kleuren['o']
'B'
>>> karakter2kleuren['s']
'RY'
>>> emoji2kleur = lees_emojis('emoji.txt')
>>> emoji2kleur['π']
'R'
>>> emoji2kleur['π']
'G'
>>> emoji2kleur['π¬']
'B'
>>> emoji2kleur['π€']
'*'
>>> kleur2emojis = gekleurde_emojis(emoji2kleur)
>>> kleur2emojis['R']
{'π', 'β', 'π', 'π', 'π₯©'}
>>> kleur2emojis['G']
{'π', 'π«', 'π’', 'πΏ'}
>>> kleur2emojis['B']
{'π§', 'π¦', 'π', 'π¬'}
>>> kleur2emojis['*']
{'π€', 'π€', 'π¦'}
>>> decodeer('YB*B*RY*RB*B*YY*B*P*GP*GY*GB*YR', karakter2kleuren)
'Cosmopolitan'
>>> decodeer('ππ¦π¦π§π€πππ€πππ¦π¦π€πππ¦π¦π€πΎπ€π«ππ¦πππ€π’ππ€ππ', karakter2kleuren, emoji2kleur)
'Cosmopolitan'
>>> decodeer('πππ¦π§π¦π₯©ππ€πππ€ππ¦πππ¦π¬π€πΎπ¦π«ππ€π«ππ€π’π¦π€ππ₯©', karakter2kleuren, emoji2kleur)
'Cosmopolitan'
>>> codeer('Cosmopolitan', karakter2kleuren)
'YB*B*RY*RB*B*YY*B*P*GP*GY*GB*YR'
>>> codeer('Cosmopolitan', karakter2kleuren, emoji2kleur)
'ππ¦π¦π§π€πππ€πππ¦π¦π€πππ¦π¦π€πΎπ€π«ππ¦πππ€π’ππ€ππ'
>>> codeer('Cosmopolitan', karakter2kleuren, emoji2kleur)
'πππ¦π§π¦π₯©ππ€πππ€ππ¦πππ¦π¬π€πΎπ¦π«ππ€π«ππ€π’π¦π€ππ₯©'