Cäsar-Chiffre mittels str.translate

Code-Stücke können hier veröffentlicht werden.
Antworten
imonbln
User
Beiträge: 185
Registriert: Freitag 3. Dezember 2021, 17:07

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.

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()

Antworten