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.

kleurcodes

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.

cijfertekst (met hoofdletters en asterisks)

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.

emoji

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

cijfertekst (met emojis)

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

cijfertekst (met emojis)

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.

Opgave

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:

De functies gekleurde_emojis, decodeer en codeer mogen de dictionaries (dict) die eraan doorgegeven worden niet wijzigen.

Voorbeeld

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)
'πŸŒŸπŸ“˜πŸ¦›πŸ’§πŸ¦›πŸ₯©πŸŒ›πŸŽ€πŸ‰πŸ“˜πŸŽ€πŸ“˜πŸ¦›πŸŒŸπŸŒŸπŸ¦›πŸ¬πŸ–€πŸ‘ΎπŸ¦›πŸ«‘πŸ’œπŸ–€πŸ«‘πŸŒŸπŸ–€πŸ’πŸ’¦πŸ–€πŸŒ™πŸ₯©'