Die Klasse ist nur nötig um eine Exception bei Zeichen zu bekommen, welche nicht substituiert werden können, ansonsten hätte man auch ein defaultdict nutzen können, um diese Zeichen einfach auszufiltern.
Code: Alles auswählen
import argparse
import collections
import itertools
import string
class CaesarChiffre:
def __init__(self, offset):
codepage = str_rotate(string.ascii_uppercase, (-1) * offset)
self.table = str.maketrans(string.ascii_letters, codepage * 2, string.whitespace)
def __getitem__(self, key):
try:
return self.table[key]
except KeyError:
raise ValueError(f"Illegal character {chr(key)}") from None
def chunked(message, size=5) -> typing.List[str]:
return [''.join(x) for x in itertools.batched(message, size)]
def str_rotate(inp, offset):
outp = collections.deque(inp)
outp.rotate(offset)
return ''.join(outp)
def parse_command(arguments = None):
parser = argparse.ArgumentParser()
parser.add_argument("offset", type=int,
help="amount of characters to shift")
parser.add_argument("message", type=str, help="the message to substitute")
return parser.parse_args(arguments)
def main():
args = parse_command()
chiffre = args.message.translate(CaesarChiffre(args.offset))
print(' '.join(chunked(chiffre)))
if __name__ == '__main__':
main()