PROG0340 - Rail fence cipher

no tags 

In the rail fence cipher (also called zigzag cipher), the letters of the plaintext are initially written downwards and diagonally on successive "rails" of an imaginary fence, and then moving up after the bottom rail has been reached. When the top rail is reached, the message is again written downwards until the whole plaintext is written out. If the text "And now for something completely different." is written as such across four rails, we get the following result

A#####w#####s#####i#####m#####l#####f#####.
#n###o# ### #o###h#n###o#p###e#y###f#e###t#
##d#n###f#r###m#t###g#c###l#t### #i###r#n##
### #####o#####e##### #####e#####d#####e###

The encoded message is then formed by reading the letters on each rail from left to right, and going through the rails top to bottom. The encoded message for the above example thus reads as "Awsimlf.no  ohnopeyfetdnfrmtgclt irn oe ede".

Assignment

  • Write a function encode that takes two arguments: i) a text string and ii) the number of rails used in the rail fence cipher. The function must return a string containing the encoded message of the given text, according to the rail fence cipher with the given number of rails.
  • Write a function decode that takes two arguments: i) a text encoded according to the rail fence cipher and ii) the number of rails used in the coding scheme. The function must return a string containing the original text after decoding.

Example

>>> encode('And now for something completely different.', 1)
'And now for something completely different.'
>>> encode('And now for something completely different.', 2)
'Adnwfrsmtigcmltl ifrn.n o o oehn opeeydfeet'
>>> encode('And now for something completely different.', 3)
'Anfstgmt fnn o o oehn opeeydfeetdwrmicllir.'
>>> encode('And now for something completely different.', 4)
'Awsimlf.no  ohnopeyfetdnfrmtgclt irn oe ede'
>>> encode('And now for something completely different.', 5)
'Aftm nn oehopydetdwrmicllir. o on eefensgtf'

>>> decode('And now for something completely different.', 1)
'And now for something completely different.'
>>> decode('Adnwfrsmtigcmltl ifrn.n o o oehn opeeydfeet', 2)
'And now for something completely different.'
>>> decode('Anfstgmt fnn o o oehn opeeydfeetdwrmicllir.', 3)
'And now for something completely different.'
>>> decode('Awsimlf.no  ohnopeyfetdnfrmtgclt irn oe ede', 4)
'And now for something completely different.'
>>> decode('Aftm nn oehopydetdwrmicllir. o on eefensgtf', 5)
'And now for something completely different.'

Bij spoorhekcodering (of zigzagcodering) worden de letters van een gegeven tekst eerst diagonaal naar beneden uitgeschreven op opeenvolgende "sporen" van een denkbeeldig hek. Nadat het onderste spoor bereikt wordt, gaat het uitschrijven van de letters diagonaal naar boven verder. De tekst wordt opnieuw diagonaal naar beneden uitgeschreven van zodra het bovenste spoor bereikt wordt. Deze procedure herhaalt zich totdat alle letters van de tekst uitgeschreven zijn. Als we bijvoorbeeld op vier sporen de tekst "And now for something completely different." uitschrijven, dan krijgen we

A#####w#####s#####i#####m#####l#####f#####.
#n###o# ### #o###h#n###o#p###e#y###f#e###t#
##d#n###f#r###m#t###g#c###l#t### #i###r#n##
### #####o#####e##### #####e#####d#####e###

De gecodeerde tekst wordt gevormd door de letters per spoor van links naar rechts achter elkaar te zetten, en dit vanaf het bovenste spoor tot het onderste spoor. De gecodeerde boodschap voor de bovenstaande voorbeeldtekst leest dan als "Awsimlf.no  ohnopeyfetdnfrmtgclt irn oe ede".

Opgave

  • Schrijf een functie codeer waaraan twee argumenten moeten doorgegeven worden: i) een tekst die moet gecodeerd worden, en ii) het aantal sporen dat hierbij gebruikt wordt. De functie moet als resultaat een string teruggeven, die de gecodeerde versie van de gegeven tekst bevat volgens de spoorhekcodering met het gegeven aantal sporen.
  • Schrijf een functie decodeer waaraan twee argumenten moeten doorgegeven worden: i) een tekst die gecodeerd werd volgens de spoorhekcodering, en ii) het aantal sporen dat hierbij gebruikt werd. De functie moet als resultaat een string teruggeven die de originele tekst na decodering bevat.

Voorbeeld

>>> codeer('And now for something completely different.', 1)
'And now for something completely different.'
>>> codeer('And now for something completely different.', 2)
'Adnwfrsmtigcmltl ifrn.n o o oehn opeeydfeet'
>>> codeer('And now for something completely different.', 3)
'Anfstgmt fnn o o oehn opeeydfeetdwrmicllir.'
>>> codeer('And now for something completely different.', 4)
'Awsimlf.no  ohnopeyfetdnfrmtgclt irn oe ede'
>>> codeer('And now for something completely different.', 5)
'Aftm nn oehopydetdwrmicllir. o on eefensgtf'

>>> decodeer('And now for something completely different.', 1)
'And now for something completely different.'
>>> decodeer('Adnwfrsmtigcmltl ifrn.n o o oehn opeeydfeet', 2)
'And now for something completely different.'
>>> decodeer('Anfstgmt fnn o o oehn opeeydfeetdwrmicllir.', 3)
'And now for something completely different.'
>>> decodeer('Awsimlf.no  ohnopeyfetdnfrmtgclt irn oe ede', 4)
'And now for something completely different.'
>>> decodeer('Aftm nn oehopydetdwrmicllir. o on eefensgtf', 5)
'And now for something completely different.'


Added by:Peter Dawyndt
Date:2013-02-22
Time limit:10s
Source limit:50000B
Memory limit:1536MB
Cluster: Cube (Intel G860)
Languages:PY_NBC
Resource:None