Drop links or images here to add them to the editor.

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. De kleur zwart wordt altijd voorgesteld door een asterisk (*).

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 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 uit de UTF-8 tekencodering, waarbij emojis bestaan uit één enkel karakter. Meerdere emojis kunnen dezelfde kleur voorstellen, in tegenstelling tot hoofdletters 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 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 voor Cosmopolitan kan met deze emojis voorgesteld worden als (eerste voorbeeld uit inleiding)

πŸŒ›πŸ’¦πŸ¦›πŸ’§πŸŽ€πŸ„πŸŒ™πŸŽ€πŸ„πŸ“˜πŸ¦›πŸ’¦πŸŽ€πŸŒ™πŸŒŸπŸ¦›πŸ’¦πŸ–€πŸ‘ΎπŸ–€πŸ«‘πŸŒ‚πŸ¦›πŸ€πŸŒ™πŸ–€πŸ’πŸ“˜πŸŽ€πŸŒ™πŸ‰

of als (tweede voorbeeld uit inleiding)

πŸŒŸπŸ“˜πŸ¦›πŸ’§πŸ¦›πŸ₯©πŸŒ›πŸŽ€πŸ‰πŸ“˜πŸŽ€πŸ“˜πŸ¦›πŸŒŸπŸŒŸπŸ¦›πŸ¬πŸ–€πŸ‘ΎπŸ¦›πŸ«‘πŸ’œπŸ–€πŸ«‘πŸŒŸπŸ–€πŸ’πŸ’¦πŸ–€πŸŒ™πŸ₯©

Schrijf een bash shell script krempel waarmee berichten kunnen gecodeerd en gedecodeerd worden volgens een Krempelcode $$\mathcal{K}$$. Aan het script moeten drie argumenten doorgegeven worden:

  1. het subcommando dat aangeeft of het script moet coderen (encode) of decoderen (decode)

  2. het bericht dat moet gecodeerd of gedecodeerd worden

  3. de padnaam van een tekstbestand met kleurcodes voor Krempelcode $$\mathcal{K}$$

Als het script moet coderen (encode), dan moet het bericht een klare tekst zijn waarvoor de bijhorende cijfertekst volgens Krempelcode $$\mathcal{K}$$ moet uitgeschreven worden naar stdout.

Als het script moet decoderen (decode), dan moet het bericht een cijfertekst zijn die gecodeerd werd volgens Krempelcode $$\mathcal{K}$$, en moet het script de bijhorende klare tekst uitschrijven naar stdout.

Optioneel kan aan het script nog een vierde argument doorgegeven worden: de padnaam van een bestand met emojis voor Krempelcode $$\mathcal{K}$$. Als er een bestand met emojis wordt doorgegeven, dan moeten elke kleur in de cijfertekst voorgesteld worden door een willekeurig gekozen emoji van die kleur. Anders moeten de kleuren in de cijfertekst voorgesteld worden met hoofdletters en asterisks (*).

Het script mag ervan uitgaan dat alle argumenten die eraan doorgegeven worden geldig zijn, zonder dat dit expliciet moet gecontroleerd worden.

Tip: pseudorandom generator

In bash is de omgevingsvariabele $RANDOM een functie (geen constante) die een willekeurig natuurlijk getal tussen 0 en 32767 teruggeeft.

$ echo $RANDOM
20491
$ echo $RANDOM
14923

Je kunt dit gebruiken om je script een willekeurige emoji van een bepaalde kleur te laten kiezen.

Voorbeeld

Onderstaande voorbeeldsessie toont hoe het shell script krempel moet kunnen gebruikt worden. Daarbij gaan we ervan uit dat de huidige directory de tekstbestanden krempel.txt en emoji.txt bevat.

$ krempel encode Cosmopolitan krempel.txt
YB*B*RY*RB*B*YY*B*P*GP*GY*GB*YR
$ krempel encode Cosmopolitan krempel.txt emoji.txt
πŸŒ›πŸ’¦πŸ¦›πŸ’§πŸŽ€πŸ„πŸŒ™πŸŽ€πŸ„πŸ“˜πŸ¦›πŸ’¦πŸŽ€πŸŒ™πŸŒŸπŸ¦›πŸ’¦πŸ–€πŸ‘ΎπŸ–€πŸ«‘πŸŒ‚πŸ¦›πŸ€πŸŒ™πŸ–€πŸ’πŸ“˜πŸŽ€πŸŒ™πŸ‰
$ krempel encode Cosmopolitan krempel.txt emoji.txt
πŸŒŸπŸ“˜πŸ¦›πŸ’§πŸ¦›πŸ₯©πŸŒ›πŸŽ€πŸ‰πŸ“˜πŸŽ€πŸ“˜πŸ¦›πŸŒŸπŸŒŸπŸ¦›πŸ¬πŸ–€πŸ‘ΎπŸ¦›πŸ«‘πŸ’œπŸ–€πŸ«‘πŸŒŸπŸ–€πŸ’πŸ’¦πŸ–€πŸŒ™πŸ₯©


$ krempel decode "YB*B*RY*RB*B*YY*B*P*GP*GY*GB*YR" krempel.txt
Cosmopolitan
$ krempel decode "πŸŒ›πŸ’¦πŸ¦›πŸ’§πŸŽ€πŸ„πŸŒ™πŸŽ€πŸ„πŸ“˜πŸ¦›πŸ’¦πŸŽ€πŸŒ™πŸŒŸπŸ¦›πŸ’¦πŸ–€πŸ‘ΎπŸ–€πŸ«‘πŸŒ‚πŸ¦›πŸ€πŸŒ™πŸ–€πŸ’πŸ“˜πŸŽ€πŸŒ™πŸ‰" krempel.txt emoji.txt
Cosmopolitan
$ krempel decode "πŸŒŸπŸ“˜πŸ¦›πŸ’§πŸ¦›πŸ₯©πŸŒ›πŸŽ€πŸ‰πŸ“˜πŸŽ€πŸ“˜πŸ¦›πŸŒŸπŸŒŸπŸ¦›πŸ¬πŸ–€πŸ‘ΎπŸ¦›πŸ«‘πŸ’œπŸ–€πŸ«‘πŸŒŸπŸ–€πŸ’πŸ’¦πŸ–€πŸŒ™πŸ₯©" krempel.txt emoji.txt
Cosmopolitan