In de roman Tom Tiddler's Island1 (1933) van J.J. Connington staat deze geheime boodschap:
TEIIL LFILH TCETU FDHSO OENPR YYUGO HNGOF LOVTU GCHAN NOATN AEHAT ISUWE ETFST GSCAD OFRGH PELPE HASLE GASTN HGSMR LHLAR ARNIF THRDL NITFO SSWSG NYILE EFALT ODECT IESOL NTSNT COOUE AODNT IUTAI TIOON LEANR IIGOT AHNOM RINHE YLMFD STTTS MANHH OFEII ETODD OTPCA MOTIE FMONG IMCLA TTCHB YIMNN ETROX EMCOU VSFHA ELMPN NCTAW ETRWO OAHEE IYCNA OIRBT RTXET PEIZN RSCSA TIKOH NITHT EMFNE NNRUO GOTGP ENETP SYANS Z
Wat zou die kunnen betekenen?
Er werd gebruikgemaakt van een transpositiecijfer2 om de letters van de boodschap op een systematische manier door elkaar te halen. Als je de letters terug op hun oorspronkelijke plaats zet, dan leest het bericht als:
THE FINAL LOT OF THE LAST THREE THOUSAND WAS SENT OFF ON THURSDAY AND GOT THROUGH SAFE STOP NOTHING SEEN OF NIPASGAL STOP THINK OF THROWING THEM WELL OFF THE SCENT BY USING ANOTHER PORT NEXT TIME STOP ADVISE AGAINST LANDING CHEMICALS TILL FURTHER NOTICE STOP GREY CLOUD IN OFFING STOP WILL GIVE YOU ALL CLEAR THRICE COMMA AT NINE COMMA NINE THIRTY COMMA AND TEN THIRTY COMMA ON NIGHT BEFORE I EXPECT YOU ENDS ZZ
De manier waarop deze boodschap kan ontcijferd worden, staat beschreven op pagina's 148–161 van de roman3. Omdat de geheime boodschap zoals die in het boek staat enkele fouten bevat, leggen we hieronder op een meer systematische manier uit hoe dit transpositiecijfer werkt.
Het transpositiecijfer splitst een tekst (str) op in een reeks van $$m$$ fragmenten die allemaal even lang zijn. We stellen een reeks fragmenten voor als een lijst (list) van strings (str) die allemaal even lang zijn.
We kunnen nu een aantal (omkeerbare) bewerkingen uitvoeren die een reeks fragmenten omzetten naar een nieuwe reeks fragmenten. Nemen we bijvoorbeeld deze reeks van drie fragmenten
ABCD EFGH IJKL
dan kunnen we die halveren door alle fragmenten in twee gelijke delen te splitsen. We krijgen dan deze nieuwe reeks van zes fragmenten
AB CD EF GH IJ KL
De omgekeerde bewerking noemen we verdubbelen. Daarbij worden telkens twee opeenvolgende fragmenten samengevoegd tot één enkel fragment.
Bij het verwisselen van een reeks fragmenten ontstaat een nieuwe reeks waarvan het $$i$$-de fragment de aaneenschakeling is van de $$i$$-de karakters van elk fragment uit de oorspronkelijk reeks. Als we dit toepassen op bovenstaande reeks van drie fragmenten, dan krijgen we deze nieuwe reeks van vier fragmenten:
AEI BFJ CGK DHL
Merk op dat de bewerking verwisselen zichzelf omkeert: als we ze tweemaal na elkaar toepassen, dan krijgen we terug de oorspronkelijke reeks fragmenten.
Om een reeks fragmenten te verweven met stapgrootte $$s \in \mathbb{N}_0$$, lezen we de reeks uit in $$s$$ groepen van fragmenten die telkens $$s$$ posities van elkaar verwijderd liggen. Laat ons dit bijvoorbeeld voor stapgrootte $$4$$ eens toepassen op deze reeks van twaalf fragmenten:
AB CD EF GH IJ KL MN OP QR ST UV WX
Als we starten bij het eerste fragment en telkens $$4$$ fragmenten vooruit springen, dan krijgen we de eerste groep van fragmenten (AB IJ QR). Als we daarna bij het tweede fragment starten en opnieuw telkens $$4$$ fragmenten vooruit springen, dan bekomen we zo een tweede groep van fragmenten (CD KL ST). Op dezelfde manier kunnen we nu ook de derde groep (EF MN UV) en de vierde groep (GH OP WX) uitlezen, door respectievelijk bij het derde en het vierde fragment te starten, en telkens $$4$$ letters vooruit te springen. Als we al deze groepen achter elkaar zetten, dan krijgen we deze nieuwe reeks fragmenten:
AB IJ QR CD KL ST EF MN UV GH OP WX
Om een cijfertekst (geheime boodschap) te decoderen met $$m$$ fragmenten, splitsen we die eerst op in $$m$$ fragmenten die allemaal even lang zijn. Daarna voeren we achtereenvolgens de volgende bewerkingen uit op deze reeks fragmenten:
halveer de reeks fragmenten
verweef de reeks fragmenten met stapgrootte $$m$$
verdubbel de reeks fragmenten
verwissel de reeks fragmenten
verweef de reeks fragmenten met stapgrootte $$2$$
voeg alle fragmenten samen om zo de klare tekst (oorspronkelijke boodschap) te bekomen
Gevraagd wordt:
Schrijf een functie splitsen waaraan twee argumenten moeten doorgegeven worden: i) een tekst $$t$$ (str) en ii) een getal $$m \in \mathbb{N}_0$$ (int). De functie moet de reeks fragmenten teruggeven die ontstaat door de tekst $$t$$ in $$m$$ fragmenten van gelijke lengte op te splitsen. Hierbij mag de functie ervan uitgaan dat tekst $$t$$ in $$m$$ fragmenten van gelijke lengte kan opgesplitst worden, zonder dat dit expliciet moet gecontroleerd worden.
Schrijf een functie samenvoegen waaraan een reeks fragmenten moet doorgegeven worden. De functie moet de string (str) teruggeven die bekomen wordt door alle fragmenten van de gegeven reeks samen te voegen.
Schrijf een functie halveren waaraan een reeks fragmenten moet doorgegeven worden. De functie moet de nieuwe reeks fragmenten teruggeven die bekomen wordt door de gegeven reeks te halveren. Hierbij mag de functie ervan uitgaan dat alle fragmenten in de gegeven reeks een even lengte hebben, zonder dat dit expliciet moet gecontroleerd worden.
Schrijf een functie verdubbelen waaraan een reeks fragmenten moet doorgegeven worden. De functie moet de nieuwe reeks fragmenten teruggeven die bekomen wordt door de gegeven reeks te verdubbelen. Hierbij mag de functie ervan uitgaan dat het aantal fragmenten in de gegeven reeks even is, zonder dat dit expliciet moet gecontroleerd worden.
Schrijf een functie verwisselen waaraan een reeks fragmenten moet doorgegeven worden. De functie moet de nieuwe reeks fragmenten teruggeven die bekomen wordt door de gegeven reeks fragmenten te verwisselen.
Schrijf een functie verweven waaraan twee argumenten moeten doorgegeven worden: i) een reeks fragmenten en ii) een getal $$s \in \mathbb{N}_0$$ (int). De functie moet de nieuwe reeks fragmenten teruggeven die bekomen wordt door de gegeven reeks fragmenten te verweven met stapgrootte $$s$$.
Schrijf een functie decoderen waaraan twee argumenten moeten doorgegeven worden: i) een cijfertekst $$t$$ (str) en ii) een getal $$m \in \mathbb{N}_0$$ (int). De functie moet de klare tekst (str) teruggeven die bekomen wordt door cijfertekst $$t$$ te decoderen met $$m$$ fragmenten. Hierbij mag de functie ervan uitgaan dat cijfertekst $$t$$ in $$m$$ fragmenten van gelijke lengte kan opgesplitst worden, zonder dat dit expliciet moet gecontroleerd worden.
>>> splitsen('ABCDEFGHIJKL', 6)
['AB', 'CD', 'EF', 'GH', 'IJ', 'KL']
>>> splitsen('ABCDEFGHIJKL', 4)
['ABC', 'DEF', 'GHI', 'JKL']
>>> splitsen('ABCDEFGHIJKL', 3)
['ABCD', 'EFGH', 'IJKL']
>>> samenvoegen(['AB', 'CD', 'EF', 'GH', 'IJ', 'KL'])
'ABCDEFGHIJKL'
>>> samenvoegen(['ABC', 'DEF', 'GHI', 'JKL'])
'ABCDEFGHIJKL'
>>> samenvoegen(['ABCD', 'EFGH', 'IJKL'])
'ABCDEFGHIJKL'
>>> halveren(['AB', 'CD', 'EF', 'GH', 'IJ', 'KL'])
['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L']
>>> halveren(['ABCD', 'EFGH', 'IJKL'])
['AB', 'CD', 'EF', 'GH', 'IJ', 'KL']
>>> verdubbelen(['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L'])
['AB', 'CD', 'EF', 'GH', 'IJ', 'KL']
>>> verdubbelen(['AB', 'CD', 'EF', 'GH', 'IJ', 'KL'])
['ABCD', 'EFGH', 'IJKL']
>>> verwisselen(['AB', 'CD', 'EF', 'GH', 'IJ', 'KL'])
['ACEGIK', 'BDFHJL']
>>> verwisselen(['ABC', 'DEF', 'GHI', 'JKL'])
['ADGJ', 'BEHK', 'CFIL']
>>> verwisselen(['ABCD', 'EFGH', 'IJKL'])
['AEI', 'BFJ', 'CGK', 'DHL']
>>> verweven(['AB', 'CD', 'EF', 'GH', 'IJ', 'KL'], 2)
['AB', 'EF', 'IJ', 'CD', 'GH', 'KL']
>>> verweven(['AB', 'CD', 'EF', 'GH', 'IJ', 'KL'], 3)
['AB', 'GH', 'CD', 'IJ', 'EF', 'KL']
>>> verweven(['AB', 'CD', 'EF', 'GH', 'IJ', 'KL'], 4)
['AB', 'IJ', 'CD', 'KL', 'EF', 'GH']
>>> decoderen("Ie fradnoCh' a ac guaamoffiiy pvtenham fatoa eciSoruwitJ ksprrn!", 3)
"I'm afraid you have the misfortune of facing Captain Jack Sparrow!"
>>> decoderen("Iofc Ch'friyaam anopv figuteaad a itciat!nhksruZ e frnZJ SooeZamprw Z", 5)
"I'm afraid you have the misfortune of facing Captain Jack Sparrow!ZZZZ"
>>> decoderen("Ifrnot' aguamfi i adChnac aa fiypvJeamatX ciruXtksrnXh foeXeSow X pr!oX", 6)
"I'm afraid you have the misfortune of facing Captain Jack Sparrow!XXXXXX"