The problem
Write a category that, when given a string, will return an uppercase string with every letter shifted ahead within the alphabet by nonetheless many spots the cipher was initialized to.
Instance:
c = CaesarCipher(5); # creates a CipherHelper with a shift of 5
c.decode('BFKKQJX') # returns 'WAFFLES'
If one thing within the string shouldn’t be within the alphabet (e.g. punctuation, areas), merely go away it as is.
The shift will at all times be within the vary of [1, 26]
.
The answer in Python code
Choice 1:
from string import maketrans
class CaesarCipher(object):
def __init__(self, shift):
self.alpha = "abcdefghijklmnopqrstuvwxyz".higher()
self.newalpha = self.alpha[shift:] + self.alpha[:shift]
def encode(self, str):
t = maketrans(self.alpha, self.newalpha)
return str.higher().translate(t)
def decode(self, str):
t = maketrans(self.newalpha, self.alpha)
return str.higher().translate(t)
Choice 2:
class CaesarCipher(object):
def __init__(self, shift):
self.s=shift
cross;
def encode(self, str):
return ''.be a part of(chr((ord(i)+self.s-ord('A'))%26+ord('A')) if i.isalpha() else i for i in str.higher())
def decode(self, str):
return ''.be a part of(chr((ord(i)-self.s+ord('A'))%26+ord('A')) if i.isalpha() else i for i in str.higher())
Choice 3:
class CaesarCipher(object):
def __init__(self, shift):
abc = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
self.enc_dict = dict(zip(abc, abc[shift:] + abc[:shift]))
self.dec_dict = dict(zip(abc[shift:] + abc[:shift], abc, ))
def encode(self, str):
return ''.be a part of( self.enc_dict.get(c, c) for c in str.higher() )
def decode(self, str):
return ''.be a part of( self.dec_dict.get(c, c) for c in str.higher() )
Take a look at instances to validate our answer
check.describe("Testing the CaesarCipher class");
check.it("Shift of 5");
c = CaesarCipher(5);
check.assert_equals(c.encode('WAFFLES'), 'BFKKQJX');
check.assert_equals(c.decode('BFKKQJX'), 'WAFFLES');
check.assert_equals(c.encode("IT'S A SHIFT CIPHER!!"), "NY'X F XMNKY HNUMJW!!");
check.assert_equals(c.decode("NY'X F XMNKY HNUMJW!!"), "IT'S A SHIFT CIPHER!!");
check.it("Shift of 13");
c = CaesarCipher(13);
check.assert_equals(c.encode('CNAPNXRF'), 'PANCAKES');
check.assert_equals(c.decode('PANCAKES'), 'CNAPNXRF');
check.assert_equals(c.encode('JAVASCRIPT'), 'WNINFPEVCG');
check.assert_equals(c.decode('WNINFPEVCG'), 'JAVASCRIPT');
from random import pattern
import string
for i in vary(0, 5):
rs = ''.be a part of(pattern(string.punctuation + string.ascii_uppercase, 10));
check.assert_equals(c.decode(c.encode(rs)), rs);
check.it("Shift of 26");
c = CaesarCipher(26);
for i in vary(0, 7):
rs = ''.be a part of(pattern(string.punctuation + string.ascii_uppercase, 15));
check.assert_equals(c.decode(rs), rs);
check.assert_equals(c.encode(rs), rs);