From d19993026bfee1c2885c60eba93ce34097b34b8a Mon Sep 17 00:00:00 2001 From: Tammo Behrends Date: Tue, 1 Dec 2015 20:31:43 +0100 Subject: [PATCH] rail-fence-cipher: Implement new exercise --- config.json | 1 + rail-fence-cipher/example.py | 17 +++++++++++ rail-fence-cipher/rail_fence_cipher_test.py | 34 +++++++++++++++++++++ 3 files changed, 52 insertions(+) create mode 100644 rail-fence-cipher/example.py create mode 100644 rail-fence-cipher/rail_fence_cipher_test.py diff --git a/config.json b/config.json index 41ff709f69e..f254a3282c7 100644 --- a/config.json +++ b/config.json @@ -40,6 +40,7 @@ "pythagorean-triplet", "robot-name", "matrix", + "rail-fence-cipher", "nth-prime", "saddle-points", "beer-song", diff --git a/rail-fence-cipher/example.py b/rail-fence-cipher/example.py new file mode 100644 index 00000000000..29942b74fe5 --- /dev/null +++ b/rail-fence-cipher/example.py @@ -0,0 +1,17 @@ +from itertools import cycle, chain + + +def fence_pattern(rails, size): + zig_zag = cycle(chain(range(rails), range(rails - 2, 0, -1))) + return zip(zig_zag, range(size)) + + +def encode(msg, rails): + fence = fence_pattern(rails, len(msg)) + return ''.join(msg[i] for _, i in sorted(fence)) + + +def decode(msg, rails): + fence = fence_pattern(rails, len(msg)) + fence_msg = zip(msg, sorted(fence)) + return ''.join(char for char, _ in sorted(fence_msg, key=lambda item: item[1][1])) diff --git a/rail-fence-cipher/rail_fence_cipher_test.py b/rail-fence-cipher/rail_fence_cipher_test.py new file mode 100644 index 00000000000..d46a7ec0628 --- /dev/null +++ b/rail-fence-cipher/rail_fence_cipher_test.py @@ -0,0 +1,34 @@ +import unittest + +from rail_fence_cipher import encode, decode + + +class RailFenceTests(unittest.TestCase): + + def test_encode_with_two_rails(self): + self.assertMultiLineEqual('XXXXXXXXXOOOOOOOOO', + encode('XOXOXOXOXOXOXOXOXO', 2)) + + def test_encode_with_three_rails(self): + self.assertMultiLineEqual('WECRLTEERDSOEEFEAOCAIVDEN', + encode('WEAREDISCOVEREDFLEEATONCE', 3)) + + def test_encode_with_middle_stop(self): + self.assertMultiLineEqual('ESXIEECSR', encode('EXERCISES', 4)) + + def test_decode_with_three_rails(self): + self.assertMultiLineEqual('THEDEVILISINTHEDETAILS', + decode('TEITELHDVLSNHDTISEIIEA', 3)) + + def test_decode_with_five_rails(self): + self.assertMultiLineEqual('EXERCISMISAWESOME', + decode('EIEXMSMESAORIWSCE', 5)) + + def test_decode_with_six_rails(self): + self.assertMultiLineEqual( + '112358132134558914423337761098715972584418167651094617711286', + decode('133714114238148966225439541018335470986172518171757571896261', 6) + ) + +if __name__ == '__main__': + unittest.main()