Cipher Map Cipher Map

»Nikola, A1213pokl, bAse730onE.«

»Ja Sofia, was ist los?«

»Sag Du es mir! Dein Foltergerät, mit seinem neuen Lexikon, lässt meine Schaltkreise qualmen. Ich kann mir diese komplizierten neuen Passwörter einfach nicht merken und das Ding will und will keine einfacheren akzeptieren.«

»Oh, aber das sind gute Passwörter, und natürlich kannst Du sie verwenden.«

»Warum kannst Du sie nicht benutzen!?«, fragte Sofia beinahe hysterisch.
»Ich habe sie schon vergessen! Willst Du, dass ich für alle Ewigkeit aus meinem eigenen Haus ausgeschlossen bin? Lass Dir gefälligst was Einfacheres einfallen, sodass ich mir nicht diesen zufälligen Kauderwelsch merken muss.«
Für gewöhnlich reagiert Sofia nur selten so aggressiv, aber das Maß war endgültig voll. Der Stress der letzten Tage in Verbindung mit ihrer Erschöpfung hatte sie an den Rand des Erträglichen gebracht.

»Keine Bange, ich hatte bereits erwartet, dass ihr eine einfachere Methode wollt. Nimm doch einfach das Chiffriergitter zur Hilfe. Damit können wir alle Passwörter verschlüsseln und sie direkt neben der Tür oder an einem besonderen Ort, auf den wir uns alle einigen, aufbewahren. Man kann die Passwörter nur mit dem Gitter lesen, und das nehmen wir immer mit, wenn wir unterwegs sind.«

»Also muss ich mich nicht an all diese Passwörter erinnern? Wir müssen nur dafür sorgen, dass wir das Chiffriergitter nicht verlieren.«, fragte Sofia hoffnungsvoll.

»Ja, genau so ist es.«

»Genial! Zeig mir das Gitter und erklär mir, wie genau das noch ein Mal funktioniert.«

Hilf Sofia, ein Entschlüsselungsprogramm für die Passwörter zu schreiben, die Nikola mit dem Chiffriergitter verschlüsseln wird. Ein Chiffriergitter ist ein Stück Papier, eingeteilt in 4 × 4 Quadrate mit vier ausgeschnittenen Fenstern. Wenn er das Gitter auf ein gleiches Blatt legt, schreibt der Encoder die ersten vier Zeichen seines Passworts in diese Fenster (siehe Abb. Unten). Anschließend dreht er das Gitter um 90 Grad im Uhrzeigersinn. Die Symbole, die vorher geschrieben wurden, werden unter dem Gitter versteckt und blankes Papier erscheint innerhalb der Fenster. Der Encoder schreibt dann die nächsten vier Symbole des Passworts in die Fenster, dreht das Gitter wieder um 90 Grad und schreibt die nächsten vier Symbole in die leeren Fenster, bevor er das Gitter noch einmal dreht. Schließlich trägt er die letzten vier Symbole des Passworts ein.
Ohne dasselbe Chiffriergitter, ist es schwierig, das Kennwort aus dem resultierenden Quadrat zu lesen, das aus 16 Symbolen besteht. Somit kann der Codierer sicher sein, dass kein Radaubruder leichten Zugang zu der verschlossenen Tür erhält.

Schreib ein Modul, das es den Robotern ermöglicht, ihre Passwörter bei ihrer Rückkehr leicht abzurufen.

Das Chiffriergitter und das chiffrierte Passwort werden als Array (Tupel) von Strings dargestellt.

Eingabe: Ein Chiffriergitter und ein chiffriertes Passwort als Tupel von Strings.

Ausgabe: Das Passwort als String.

Beispiele:

recallPassword(
    ['X...',
     '..X.',
     'X..X',
     '....'],
    ['itdf',
     'gdce',
     'aton',
     'qrdi']) == 'icantforgetiddqd'

recallPassword(
    ['....',
     'X..X',
     '.X..',
     '...X'],
    ['xhwc',
     'rsqx',
     'xqzz',
     'fyzr']) == 'rxqrwsfzxqxzhczy'

Wozu das gut ist:
Hier erfährst Du, wie man mit 2-D-Arrays arbeiten kann.
Außerdem lernst Du etwas über die Fleißnersche Schablone, ein Verschlüsselungsverfahren aus dem späten 19'ten Jahrhundert, das auf dem viel älteren Cardan-Gitter aufbaut.

Bedingungen:
len(cipher_grille) == 4
len(ciphered_password) == 4
all(len(row) == 4 for row in ciphered_password)
all(len(row) == 4 for row in cipher_grille)
all(all(ch in string.ascii_lowercase for ch in row) for row in ciphered_password)
all(all(ch == "X" or ch == "." for ch in row) for row in cipher_grille)