Lerne und übe ABAP – Krypto Quadrat

Lerne und übe ABAP. In der ABAP-Übung „Crypto Square“ implementierst Du die klassische Methode zum Verfassen geheimer Nachrichten, den so genannten quadratischen Code, in der Programmiersprache ABAP. Es gibt 40 geniale ABAP Übungen auf exercism. Du kannst diese Übung entweder in Deinem SAP-System ausprobieren oder Dich kostenlos auf der Plattform anmelden und die Übung absolvieren. Du kannst Dir sogar Lösungen von anderen Nutzen ansehen und dadurch Deine Lösung vergleichen.

Aufgabenstellung

Implementiere die klassische Methode zum Verfassen geheimer Nachrichten, den sogenannten quadratischen Code.

Gib die kodierte Version eines englischen Textes aus.

Zunächst wird die Eingabe normalisiert: Leerzeichen und Satzzeichen werden aus dem englischen Text entfernt, und die Nachricht wird kleingeschrieben.

Dann werden die normalisierten Zeichen in Zeilen aufgeteilt. Diese Zeilen können als ein Rechteck betrachtet werden, wenn sie mit dazwischenliegenden Zeilenumbrüchen gedruckt werden.

Zum Beispiel der Satz

"If man was meant to stay on the ground, god would have given us roots."

wird normalisiert zu:

"ifmanwasmeanttostayonthegroundgodwouldhavegivenusroots"

Der Klartext sollte in einem Rechteck angeordnet werden. Die Größe des Rechtecks sollte sich nach der Länge der Nachricht richten.

Wenn c die Anzahl der Spalten und r die Anzahl der Zeilen ist, dann ist für das Rechteck r x c die kleinstmögliche ganze Zahl c zu finden, so dass:

  • r * c >= Länge(Nachricht),
  • und c >= r,
  • und c – r <= 1.

Unser normalisierter Text ist 54 Zeichen lang, was ein Rechteck mit c = 8 und r = 7 ergibt:

  • „ifmanwas“
  • „gemeinttos“
  • „tayonthe“
  • „groundgo“
  • „dwouldha“
  • „vegivenu“
  • „sroots“

Die verschlüsselte Nachricht erhält man, indem man die Spalten von links nach rechts abliest.

Die obige Nachricht ist verschlüsselt als:

"imtgdvsfearwermayoogoanouuiontnnlvtwttddesaohghnsseoau"

Gib den kodierten Text in Abschnitten aus, die perfekte Rechtecke (r X c) ausfüllen, mit c Abschnitten der Länge r, getrennt durch Leerzeichen. Bei Phrasen, die n Zeichen zu kurz für das perfekte Rechteck sind, wird jeder der letzten n Chunks mit einem einzelnen Leerzeichen am Ende aufgefüllt.

"imtgdvs fearwer mayoogo anouuio ntnnlvt wttddes aohghn sseoau "

Würden wir diese stapeln, könnten wir den verschlüsselten Text visuell in die ursprüngliche Nachricht zurückdekodieren:

  • „imtgdvs“
  • „fearwer“
  • „mayoogo“
  • „anouuio“
  • „ntnnlvt“
  • „wttddes“
  • „aohghn „
  • „sseoau „

Beispiel Programmierung

CLASS zcl_crypto_square DEFINITION
  PUBLIC
  FINAL
  CREATE PUBLIC.

  PUBLIC SECTION.
    METHODS encode IMPORTING plain_text         TYPE string
                   RETURNING VALUE(crypto_text) TYPE string.
  PROTECTED SECTION.
  PRIVATE SECTION.
ENDCLASS.



CLASS zcl_crypto_square IMPLEMENTATION.
  METHOD encode.
    "Implement Solution
    DATA(lv_text) = TO_LOWER( plain_text ).
    REPLACE ALL OCCURRENCES OF REGEX '[^a-z0-9]' IN lv_text WITH ''.
    DATA lv_c TYPE i.
    DATA lv_r TYPE i.
    DATA(lv_len_text) = STRLEN( lv_text ).

    lv_c = CEIL( SQRT( lv_len_text ) ).
    IF ( lv_c - 1 ) * lv_c >= lv_len_text.
      lv_r = lv_c - 1.
    ELSE.
      lv_r = lv_c.
    ENDIF.

    DATA(lv_space_count) = lv_c * lv_r - lv_len_text.
    lv_text = lv_text && repeat( val = ` ` occ = lv_space_count ).
    DO lv_c TIMES.
      DATA(lv_i) = sy-index - 1.
      DATA(line) = ``.
      DO lv_r TIMES.
        DATA(char_pos) = ( sy-index - 1 ) * lv_c + lv_i.
        line = line && lv_text+char_pos(1).
      ENDDO.
      IF crypto_text <> ``.
        crypto_text = crypto_text && ` `.
      ENDIF.
      crypto_text = crypto_text && line.
    ENDDO.
  ENDMETHOD.
ENDCLASS.

Erklärung

Die Methode encode der Klasse zcl_crypto_square dient zur Verschlüsselung von Text mit Hilfe des Crypto-Squaring-Verfahrens.

Zuerst wird der übergebene Klartext in Kleinbuchstaben umgewandelt und alle Zeichen, die keine Buchstaben oder Zahlen sind, werden entfernt. Dann wird die Länge des resultierenden Textes berechnet.

Aus der Länge des Klartextes wird dann die Anzahl der für die Verschlüsselung benötigten Zeilen (lv_r) und Spalten (lv_c) berechnet. Wenn die Anzahl der Zeichen nicht ausreicht, um ein perfektes rechteckiges Muster zu erzeugen, werden Leerzeichen hinzugefügt, um das Muster zu vervollständigen.

Schließlich werden die Buchstaben in einem gefalteten Muster (Zeilen und Spalten) angeordnet und zu einer neuen Zeichenfolge zusammengesetzt, um die verschlüsselte Nachricht zu erzeugen. Die Methode gibt die verschlüsselte Nachricht als Ausgabe zurück.

Über den Autor

Andreas Geiger

Mein Name ist Andreas Geiger und ich bin ein erfahrener Senior SAP Berater. Mit mehr als 10 Jahren Berufserfahrung habe ich mehrere SAP-Projekte erfolgreich abgeschlossen und umfangreiche Kenntnisse in verschiedenen Bereichen wie SAP FI, SAP MM und ABAP erworben. Nun möchte ich mein Wissen mit Dir teilen, um Dir einen Mehrwert zu bieten und Dich bei Deiner täglichen Arbeit mit dem SAP-System zu unterstützen.

Mehr zu ERP UP

ERP UP unterstützen

Wenn Du mit ERP UP zufrieden bist, kannst Du mich gerne unterstützen. Dabei gibt es unzählige Möglichkeiten, wie Du mich einfach und schnell unterstützen kannst. Wie Du genau ERP UP unterstützen kannst, erfährst Du hier. Vielen Dank.

Schreibe einen Kommentar