Cäsar-Chiffre mittels str.translate
Verfasst: Donnerstag 6. März 2025, 08:25
Ich bin vor kurzen auf die String Methode translate aufmerksam geworden und in bester Lösung sucht Problem Manier, habe ich die Methode mal benutzt, um eine Cäsar-Chiffre zu implementieren. Die Implementierung ist nicht ganz ernst gemeint und hat nur den Zweck str.translate nutzen/spielen/lernen.
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.
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()