Aus einem Buch, das Programmierer lernen können (Python): Nachrichten dekodieren

Problem: Nachricht entschlüsseln (Codebeispielzeichenfolge) > Eine Nachricht wird als Textstrom codiert und zeichenweise gelesen. Der Inhalt des Streams ist eine Liste von durch Kommas getrennten Ganzzahlwerten, und jeder numerische Wert ist eine positive Zahl in dem Bereich, der vom Typ C ++ int verarbeitet werden kann. Welches Zeichen die Zahl darstellt, hängt jedoch vom aktuellen Decodierungsmodus ab. Es gibt drei Modi: Groß- und Kleinschreibung sowie Symbol. Im Großbuchstabenmodus repräsentiert jede Zahl den Großbuchstaben des Alphabets. Dies liegt daran, dass der Rest der Division der Zahl durch 27 der Rest der Division durch das Alphabet ist und das achte Zeichen des Alphabets H ist. Das Gleiche gilt für den Kleinbuchstabenmodus, repräsentiert jedoch die Kleinbuchstaben des Alphabets. Der Rest der Division der Zahl durch 27 entspricht den Buchstaben des Alphabets (1 ist a). Wenn der Eingang beispielsweise 56 ist, ist der Ausgang b. Dies liegt daran, dass der Rest von 57 geteilt durch 27 2 ist und der zweite Buchstabe des Alphabets b ist. Verwenden Sie für den Symbolmodus den Rest der Zahl geteilt durch 9. Konvertieren Sie diesen Rest gemäß Tabelle 2-3. Zum Beispiel ist 19 ein Ausrufezeichen. Dies liegt daran, dass der Rest der Division von 19 durch 9 1 ist. Der Entschlüsselungsmodus zum Zeitpunkt des Starts der Nachricht ist der Großbuchstabenmodus. Der Decodierungsmodus wird jedes Mal umgeschaltet, wenn das Ergebnis der Restberechnung (je nach Modus entweder 27 oder 9) 0 wird. Wenn der aktuelle Modus in Großbuchstaben geschrieben ist, kehrt er in den Kleinbuchstabenmodus zurück. Wenn der aktuelle Modus in Kleinbuchstaben geschrieben ist, kehrt er in den Symbolmodus zurück. Wenn es sich um einen Symbolmodus handelt, kehrt er wieder in den Großbuchstabenmodus zurück. Tabelle 2-3 Dekodierung im Symbolmodus Zahlen und Symbole 1     ! 2     ? 3     , 4     . 5 (Leerzeichen) 6     ; 7     " 8 \ n (Zeilenvorschub) Als Beispiel, wie im Bild unten gezeigt Der Verarbeitungsvorgang wurde von oben (U) auf unten (L) und Symbol (P) umgeschaltet. Spalte (c) Zeigt den im aktuellen Modus verwendeten Divisor an. Spalte (d) ist der Rest der Eingabe von Spalte (A) geteilt durch den Teiler von Spalte (c). Die Verarbeitungsergebnisse sind in Spalte (e) gezeigt. Wenn (d) 0 ist, wechselt es in den nächsten Modus. Beispielzeichenfolge ⇨ 18,12312,171,763,98423,1208,216,11,500,18,241,0,32,20620,27,10 ![2-3.png](https://qiita-image-store.s3.amazonaws.com/0/120949/357f9367-5778-53fb-f8d8-e4b5fc383d16.png)

Nun wurde ich wie üblich angewiesen, das kleine Problem zu lösen, wie dies in Python-Code umgewandelt werden soll, damit ich Ihnen die Details zeigen kann.

--Lesen Sie Zeichen für Zeichen, bis das Zeilenende erreicht ist (dies wird durch Pythons Eingabe () gelöst).

  • Konvertieren Sie eine Zeichenfolge, die eine Zahl darstellt, in eine Ganzzahl. (Dies wird auch durch Pythons Eingabe () gelöst.)
  • Konvertieren Sie ganzzahlige Werte von 1 bis 26 in das obere Alphabet.
  • Konvertieren Sie ganzzahlige Werte von 1 bis 26 in niedrigere Alphabete.
  • Konvertieren Sie ganzzahlige Werte von 1 bis 8 in Symbole gemäß Tabelle 2-3.
  • Erinnern Sie sich an den Entschlüsselungsmodus.

Ich möchte mit den obigen Inhalten fortfahren. Also sofort

Konvertiert ganzzahlige Werte von 1 bis 26 in obere alphabetische Zeichen.

Wenn es sich um den Inhalt eines Buches handelt, kann es in Zeichen von A bis Z konvertiert werden, indem es mit dem ASCII-Zeichencode abgeglichen und den ganzzahligen Werten von Eingabe 1 bis 26 Zeichencode hinzugefügt wird. Ich mache weiter mit.

Wie beim letzten Mal möchte ich eine andere Methode in Python ausprobieren, ohne ASCII-Zeichencode zu verwenden, aber in Python ist es rudimentärer oder es ist in Ordnung, sie in eine Liste aufzunehmen und mit einem Index zu extrahieren Wenn das so ist

  • Konvertieren Sie ganzzahlige Werte von 1 bis 26 in das obere Alphabet.
  • Konvertieren Sie ganzzahlige Werte von 1 bis 26 in niedrigere Alphabete.
  • Konvertieren Sie ganzzahlige Werte von 1 bis 8 in Symbole gemäß Tabelle 2-3. Ich denke, wir können damit umgehen.

test12.py


#!/usr/bin/env python
#coding:utf-8

from ConsoleOut import cout   #Cout in Python<<Bereiten Sie eine Klasse für die Verwendung vor(Brachte mir bei)
import enum
import math


UPPERCASE = [' ','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']
LOWERCASE = [' ','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']
PUNCTUATION = [' ','!','?',',','.',' ',';','"','\n']

modeType = UPPERCASE


while modeType in [UPPERCASE,LOWERCASE,PUNCTUATION]:
    cout << "Enter some numbers ending with -1: "
    digit = input()
    if modeType == UPPERCASE:
        cout << "Number read: " + digit + "\n"
        digit = int(digit) % 27
        cout << ". Modulo 27: " + UPPERCASE[digit] + "\n"
        if digit == 0:
            modeType = LOWERCASE
        else:
            continue

    elif modeType == LOWERCASE:
        cout << "Number read: " + digit + "\n"
        digit = int(digit) % 27
        cout << ". Modulo 27: " + LOWERCASE[digit] + "\n"
        if digit == 0:
            modeType = PUNCTUATION
        else:
            continue

    elif modeType == PUNCTUATION:
        cout << "Number read: " + digit + "\n"
        digit = int(digit) % 9
        cout << ". Modulo 27: " + PUNCTUATION[digit] + "\n"
        if digit == 0:
            modeType = UPPERCASE
        else:
            continue
・ ・ ・ ・(Terminalausführung)
>>> import test12
Enter some numbers ending with -1: 18
Number read: 18
. Modulo 27: R
Enter some numbers ending with -1: 12312
Number read: 12312
. Modulo 27:  
Enter some numbers ending with -1: 171
Number read: 171
. Modulo 27: i
Enter some numbers ending with -1: 763
Number read: 763
. Modulo 27: g
Enter some numbers ending with -1: 98423
Number read: 98423
. Modulo 27: h
Enter some numbers ending with -1: 1208
Number read: 1208
. Modulo 27: t
Enter some numbers ending with -1: 216
Number read: 216
. Modulo 27:  
Enter some numbers ending with -1: 11
Number read: 11
. Modulo 27: ?
Enter some numbers ending with -1: 500
Number read: 500
. Modulo 27:  
Enter some numbers ending with -1: 18
Number read: 18
. Modulo 27:  
Enter some numbers ending with -1: 241
Number read: 241
. Modulo 27: Y
Enter some numbers ending with -1: 0
Number read: 0
. Modulo 27:  
Enter some numbers ending with -1: 32
Number read: 32
. Modulo 27: e
Enter some numbers ending with -1: 20620
Number read: 20620
. Modulo 27: s
Enter some numbers ending with -1: 27
Number read: 27
. Modulo 27:  
Enter some numbers ending with -1: 10
Number read: 10
. Modulo 27: !
Enter some numbers ending with -1: 


Derzeit ist es möglich, Ganzzahlwerte in Alphabete und Symbole auszugeben, indem der Modus mit einer Endlosschleife umgeschaltet wird. Es gibt jedoch viele subtile Punkte, z. B. den Teil, an dem zusätzliche Leerzeichen auf dem Weg erscheinen, und das Verlassen der Endlosschleife. Es hat jedoch vorerst funktioniert.

Hier ist übrigens die Antwort für C ++

char outputCharacter;
enum modeType {UPPERCASE,LOWERCASE,PUNCTUATION};
modeType mode = UPPERCASE;
char digitChar;
do {
    digitChar = cin.get();
    int number = (digitChar - '0');
    digitChar = cin.get();
    while ((digitChar != 10)&&(digitChar != ',')){
        number = number * 10 + (digitChar - '0');
        digitChar = cin.get();
    }
    switch (mode){
        case UPPERCASE:
            number = number % 27;
            outputCharacter = number + 'A' - 1;
            if(number == 0){
                mode = LOWERCASE;
                continue;
            }
            break;
        case LOWERCASE:
            number = number % 27;
            outputCharacter = number + 'a' - 1;
            if (number == 0){
                mode = PUNCTUATION;
                continue;
            }
            break;
        case PUNCTUATION:
            number = number % 9;
            switch(number){
                case 1: outputCharacter = '!';break;
                case 2: outputCharacter = '?';break;
                case 3: outputCharacter = ',';break;
                case 4: outputCharacter = '.';break;
                case 5: outputCharacter = ' ';break;
                case 6: outputCharacter = ';';break;
                case 7: outputCharacter = '"';break;
                case 8: outputCharacter = '\';break; 
            }
            if(number == 0){
                mode = UPPERCASE;
                continue;
            }
            break;
        }
        cout << outputCharacter;
    }while (digitChar != 10);
    cout << "\n";

                  

Dieses Mal konnte ich es nicht in kleine Teile teilen, also schrieb ich meinen eigenen Python-Code, während ich mir den Antwortcode ansah.

Recommended Posts

Aus einem Buch, das Programmierer lernen können (Python): Nachrichten dekodieren
Aus einem Buch, das Programmierer lernen können ... (Python): Zeiger
Aus einem Buch, das Programmierer lernen können ... (Python): Über das Sortieren
Aus einem Buch, das der Programmierer lernen kann ... (Python): Finden Sie den häufigsten Wert
Aus einem Buch, das Programmierer lernen können ... (Python): Überprüfung von Arrays
Aus einem Buch, das Programmierer lernen können (Python): Statistischer Verarbeitungsabweichungswert
Aus einem Buch, das der Programmierer lernen kann ... (Python): Bedingte Suche (Maximalwert)
Aus einem Buch, in dem die Gedanken des Programmierers gelernt werden können: Fassen Sie die Teile kleiner Probleme zusammen
Aus einem Buch, das der Programmierer lernen kann ... Überprüfung der Runenprüfsumme (feste Länge)
Aus einem Buch, das der Programmierer lernen kann ... Überprüfung der Runenprüfsumme (variable Länge) Teil 2
Aus einem Buch, das der Programmierer lernen kann ... Konvertieren von Zeichen, die Zahlen darstellen, in einen ganzzahligen Typ
Aus einem Buch, das die Denkweise des Programmierers interessanterweise gelernt hat (Python)
"Python Kit", das Python-Skripte von Swift aufruft
Ich habe ein Docker-Image erstellt, das FBX SDK Python von Node.js aus aufrufen kann
Die Denkweise des Programmierers stammt aus dem XX. Buch (Python)
"Ein Buch, das Flask von Grund auf versteht" Memo lesen
Die Denkweise des Programmierers stammt aus dem XX. Buch (Python)
Ein Mechanismus zum Aufrufen von Ruby-Methoden aus Python, der in 200 Zeilen ausgeführt werden kann
Ein Memo, das mit Python & Spark Daten aus dashDB liest
Python-Programm von "Buch, das schwieriges Programmieren leicht lehrt"
Python-Bedingungsextraktion aus der Liste, die ich oft vergesse
Python-Programm, das die Zeitnutzung aus icalendar-Daten aggregiert
[Python] Erstellen Sie ein Diagramm, das mit Plotly verschoben werden kann
Lassen Sie uns ein Kindle-Buch erstellen, das mathematische Formeln aus TeX-Dateien visualisiert
Erstellt eine Bibliothek für Python, die die morphologische Teilung problemlos handhaben kann
Über psd-tools, eine Bibliothek, die psd-Dateien in Python verarbeiten kann
Ich habe ein Shuffle gemacht, das mit Python zurückgesetzt (zurückgesetzt) werden kann
[Python-Algorithmus] Ein Programm, das einige deutsche Antworten aus einer Suche mit Tiefenpriorität ausgibt
[Python] Ich habe eine Klasse erstellt, die schnell einen Dateibaum schreiben kann
Berühren Sie Python-Objekte in Elixir
Python / Machen Sie ein Diktat aus einer Liste.
Merkmalsmenge, die aus Zeitreihendaten extrahiert werden kann
Aus einem Buch, das Programmierer lernen können ... (Python): Über das Sortieren
Dies und das über pd.DataFrame
Über Boxplot und Violinplot, die die Variation unabhängiger Daten visualisieren
Ich habe eine generische Python-Projektvorlage erstellt
[Python] Ein Programm, das ein Paar findet, das durch einen bestimmten Wert geteilt werden kann
Extrahieren Sie mit Python Zeilen, die den Bedingungen entsprechen, aus einer Textdatei
Versuchen Sie es mit APSW, einer Python-Bibliothek, die SQLite ernst nehmen kann
[Python] Ich habe ein Dienstprogramm erstellt, das wie ein Pfad auf den Diktattyp zugreifen kann
Ich habe einen einfachen Timer erstellt, der vom Terminal aus gestartet werden kann
Erstellen Sie eine virtuelle Python-Umgebung, die jeder im September 2016 verstehen kann (pyenv + virutalenv).
Ich habe ein Modul PyNanaco erstellt, das Nanaco-Guthaben mit Python belasten kann
Spiralbuch in Python! Python mit einem Spiralbuch! (Kapitel 14 ~)
[Python] Ein Programm, das Treppen mit # erstellt
# 5 [python3] Extrahiert Zeichen aus einer Zeichenfolge
Erstellen Sie eine Deb-Datei aus einem Python-Paket
[Python] Erstellen Sie einen LineBot, der regelmäßig ausgeführt wird
Generieren Sie eine Klasse aus einer Zeichenfolge in Python
Verwenden Sie Django aus einem lokalen Python-Skript
Eine typisierte Welt, die mit Python beginnt
Bearbeiten Sie BigQuery-Tabellen von einem Python-Client aus
Ein Programm, das Python zum Abspielen von Junk verwendet
Aufrufbefehle von Python (Windows Edition)
[Python] Ein Programm, das die Partitur rundet
Klasse für PYTHON, die ohne Kenntnis von LDAP betrieben werden kann
Ich habe versucht, eine Klasse zu erstellen, mit der Json in Python problemlos serialisiert werden kann
Ich möchte eine Prioritätswarteschlange erstellen, die mit Python (2.7) aktualisiert werden kann.
Ich habe PyQCheck, eine Bibliothek, die QuickCheck mit Python ausführen kann, in PyPI registriert.