Cäsar-Verschlüsselung - Indexverschiebung how to?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
alfi-techno
User
Beiträge: 2
Registriert: Dienstag 11. August 2020, 15:16

Was muss ich hinzufügen damit die Cäsar-Verschlüsselung mit einer zusätzlichen Verschiebung um den Index des Zeichens geschieht? Das erste Zeichen soll also zusätzlich um eine Position verschoben werden, das zweite Zeichen zusätzlich um zwei Positionen und so weiter.



""" ************************************************
Cäsar Verschlüsselung mit Indexverschiebung
************************************************"""
# die Funktion zur Cäsar-Verschlüsselung
def caesar(kette):
# zwei leere Zeichenketten vereinbaren
teil1 = ""
teil2 = ""
# die Länge der ursprünglichen Zeichenkette ermitteln
laenge = len(kette)
# für den Index
zaehler = 0
# die Zeichen verteilen
while zaehler < laenge:
# Zeichen mit einem geraden Index kommen in die Zeichenkette teil1
if zaehler == 0:
teil1 = teil1 + kette[zaehler]
# bei einem ungeraden Index werden die Zeichen in der Zeichenkette teil2 abgelegt
else:
teil2 = teil2 + kette[zaehler]
zaehler = zaehler + 1

print("Cäsar-Verschlüsselung")
verschiebung = int(input("Bitte geben Sie den Verschiebewert ein: "))
# jedes Zeichen um den angegebenen Wert verschieben
for zeichen in kette:
# ist es ein großer Buchstabe?
if zeichen.isupper():
print(chr((ord(zeichen) + zaehler + verschiebung - 65) % 26 + 65), end = " ")
else:
print(chr((ord(zeichen) + zaehler + verschiebung - 97) % 26 + 97), end = " ")
print("\n")

# die ursprüngliche Zeichenkette einlesen
eingabe = input("Bitte geben Sie eine Zeichenkette ein: ")
print("Die ursprüngliche Zeichenkette ist:", eingabe, "\n")

# die Verschlüsselungen durchführen
caesar(eingabe)
Benutzeravatar
darktrym
User
Beiträge: 785
Registriert: Freitag 24. April 2009, 09:26

Du gehst doch mit Zeichen durch den String, wenn man nur noch den Index hätte? :roll:
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

@alfi-techno: Der String vor der Funktionsdefinition gehört als Docstring in die Funktion, dann aber ohne die vielen Sternchen und mit einer etwas ausführlicheren Erklärung.
Überigens Erklärung: Kommentare sind dazu da, zu erklären, was gemacht wird, nicht wie, denn das steht ja schon im Code.
Als richtige Funktion sollte in ihr auch kein input und print vorkommen, sondern das sollte beim Aufrufer passieren, ergo `verschiebung` sollte auch ein Argument sein und das Ergebnis per `return` zurückgegeben werden.
`teil1` und `teil2` werden nie verwendet, zumal die Kommentare nicht zum Code passen. Denn in teil1 steht nur das erste Zeichen und der Rest landet in teil2.
Das geht auch ohne while-Schleife (die wie sie hier steht auch eine for-Schleife sein sollte).

Code: Alles auswählen

teil1 = kette[0]
teil2 = kette[1:]
sollte dagegen der Kommentar stimmen, wäre das

Code: Alles auswählen

teil1, teil2 = kette[::2], kette[1::2]
Oh nein, jetzt habe ich die Einrückungen erst gesehen, die while-Schleife beendet sich nie und teil1 wird immer mehr mit dem ersten Zeichen von kette gefüllt.
Der zweite Teil der Funktion funktioniert auch nur, wenn in kette nur Groß oder Kleinbuchstaben stehen. Das sollte man zumindest vorher prüfen.

Code: Alles auswählen

def encode_caesar(kette, verschiebung):
    """
    Cäsar Verschlüsselung mit Indexverschiebung
    """
    # jedes Zeichen um den angegebenen Wert verschieben
    ergebnis = []
    for zaehler, zeichen in enumerate(kette, verschiebung):
        if zeichen.isupper():
            # ist es ein großer Buchstabe?
            ergebnis.append(chr((ord(zeichen) + zaehler - 65) % 26 + 65))
        elif zeichen.islower():
            # ist es ein kleiner Buchstabe?
            ergebnis.append(chr((ord(zeichen) + zaehler - 97) % 26 + 97))
        else:
            # TODO: was passiert hier
            pass
    return "".join(ergebnis)
Antworten