À partir d'un livre que les programmeurs peuvent apprendre (Python): Décoder les messages

Problème: déchiffrer le message (coder la chaîne d'exemple) > Un message est encodé sous forme de flux de texte et lu caractère par caractère. Le contenu du flux est une liste de valeurs entières séparées par des virgules, et chaque valeur numérique est un nombre positif dans la plage qui peut être géré par le type int de C ++. Cependant, le caractère représenté par le nombre dépend du mode de décodage actuel. Il existe trois modes, l'un des majuscules et minuscules et le symbole. En mode majuscules, chaque nombre représente un alphabet majuscule. En effet, le reste de la division du nombre par 27 est le reste de la division par l'alphabet et le huitième caractère de l'alphabet est H. La même chose est vraie pour le mode minuscule, mais il représente des lettres minuscules. Le reste de la division du nombre par 27 correspond aux lettres de l'alphabet (1 est a). Par exemple, si l'entrée est 56, la sortie sera b. En effet, le reste de 57 divisé par 27 est égal à 2 et la deuxième lettre de l'alphabet est b. Pour le mode symbole, utilisez le reste du nombre divisé par 9. Convertissez ce reste selon le tableau 2-3. Par exemple, 19 est un point d'exclamation. En effet, le reste de la division de 19 par 9 est égal à 1. Le mode de décryptage au moment où le message commence est le mode majuscules. Le mode de décodage est commuté chaque fois que le résultat du calcul du reste (en utilisant soit 27 ou 9 selon le mode) devient 0. Si le mode courant est en majuscules, il retourne en mode minuscules, si le mode courant est en minuscules, il revient en mode symbole, et s'il s'agit du mode symbole, il revient en mode majuscules. Tableau 2-3 Décodage en mode symbole Nombres et symboles 1     ! 2     ? 3     , 4     . 5 (espace) 6     ; 7     " 8 \ n (saut de ligne) À titre d'exemple, comme le montre l'image ci-dessous La procédure de traitement a été commutée de supérieur (U) à inférieur (L) et symbole (P). Colonne (c) Affiche le diviseur utilisé dans le mode actuel. La colonne (d) est le reste de l'entrée de la colonne (A) divisé par le diviseur de la colonne (c). Les résultats du traitement sont indiqués dans la colonne (e). Si (d) vaut 0, il passe au mode suivant. Exemple de chaîne de caractères ⇨ 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)

Maintenant, comme d'habitude, j'ai été chargé de le décomposer en problèmes plus petits pour savoir comment je pourrais le transformer en code Python, donc je vais vous montrer les détails.

--Lisez un caractère à la fois jusqu'à ce que vous atteigniez la fin de la ligne (ceci est résolu avec l'entrée de Python ()) --Convertissez une chaîne représentant un nombre en entier. (Ceci est également résolu par l'entrée de Python ()) --Convertir les valeurs entières de 1 à 26 en alphabet supérieur. --Convertir les valeurs entières de 1 à 26 en alphabets inférieurs. --Convertissez les valeurs entières de 1 à 8 en symboles conformément au tableau 2-3.

  • Souvenez-vous du mode de déchiffrement.

Je voudrais continuer avec le contenu ci-dessus. Alors, immédiatement

Convertit les valeurs entières de 1 à 26 en caractères alphabétiques supérieurs.

S'il s'agit du contenu d'un livre, il peut être converti en caractères de A à Z en le faisant correspondre avec le code de caractère ASCII et en ajoutant un code de caractère aux valeurs entières de l'entrée 1 à 26. Je continue avec.

Comme la dernière fois, j'aimerais essayer une méthode différente en Python sans utiliser de code de caractères ASCII, mais en Python, c'est plus rudimentaire, ou peut-être que c'est correct de la mettre dans une liste et de la récupérer avec un index. Si ce --Convertir les valeurs entières de 1 à 26 en alphabet supérieur. --Convertir les valeurs entières de 1 à 26 en alphabets inférieurs. --Convertissez les valeurs entières de 1 à 8 en symboles conformément au tableau 2-3. Je pense que nous pouvons le gérer.

test12.py


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

from ConsoleOut import cout   #cout en python<<Préparez une classe à utiliser(M'a appris)
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
・ ・ ・ ・(Exécution du terminal)
>>> 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: 


Pour le moment, il est maintenant possible de sortir des valeurs entières en alphabets et symboles en changeant de mode avec une boucle infinie, mais il existe de nombreux points subtils tels que la partie où des blancs supplémentaires apparaissent sur le chemin et comment sortir de la boucle infinie. Cependant, cela a fonctionné pour le moment.

Au fait, voici la réponse pour 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";

                  

Cette fois, je n'ai pas pu le diviser en petits morceaux, j'ai donc écrit mon propre code python en regardant le code de réponse.

Recommended Posts

À partir d'un livre que les programmeurs peuvent apprendre (Python): Décoder les messages
D'un livre que les programmeurs peuvent apprendre ... (Python): Pointer
À partir d'un livre que les programmeurs peuvent apprendre ... (Python): À propos du tri
À partir d'un livre que le programmeur peut apprendre ... (Python): trouver la valeur la plus fréquente
À partir d'un livre que les programmeurs peuvent apprendre ... (Python): examen des tableaux
À partir d'un livre que les programmeurs peuvent apprendre (Python): valeur de l'écart de traitement statistique
À partir d'un livre que le programmeur peut apprendre ... (Python): Recherche conditionnelle (valeur maximale)
D'un livre que les pensées du programmeur peuvent être apprises: résumez les parties de petits problèmes
À partir d'un livre que le programmeur peut apprendre ... Vérification de la somme de contrôle des runes (longueur fixe)
À partir d'un livre que le programmeur peut apprendre ... Vérification de la somme de contrôle des runes (longueur variable) Partie 2
À partir d'un livre que le programmeur peut apprendre ... Conversion de caractères qui représentent des nombres en type entier
D'un livre qui apprend de manière intéressante la façon de penser du programmeur (Python)
8 services que même les débutants peuvent apprendre Python (des débutants aux utilisateurs avancés)
"Kit Python" qui appelle des scripts Python depuis Swift
J'ai créé une image Docker qui peut appeler FBX SDK Python à partir de Node.js
La façon de penser du programmeur provient du livre XX (Python)
"Un livre qui comprend Flask à partir de zéro" Lecture d'un mémo
La façon de penser du programmeur provient du livre XX (Python)
Un mécanisme pour appeler des méthodes Ruby à partir de Python qui peut être fait en 200 lignes
Un mémo qui lit les données de dashDB avec Python et Spark
Programme Python du "Livre qui enseigne facilement la programmation difficile"
python Extraction de condition de la liste que j'oublie souvent
Programme Python qui agrège l'utilisation du temps à partir des données icalendar
[Python] Créez un graphique qui peut être déplacé avec Plotly
Faisons un livre Kindle qui visualise des formules mathématiques à partir de fichiers TeX
Création d'une bibliothèque pour python capable de gérer facilement la division morphologique
À propos de psd-tools, une bibliothèque capable de traiter des fichiers psd en Python
J'ai fait un shuffle qui peut être réinitialisé (inversé) avec Python
[Algorithme Python] Un programme qui génère des réponses en allemand et en allemand à partir de la recherche de priorité en profondeur
[python] J'ai créé une classe qui peut écrire rapidement une arborescence de fichiers
Toucher les objets Python d'Elixir
python / Créer un dict à partir d'une liste.
Quantité d'entités pouvant être extraite des données de séries chronologiques
À partir d'un livre que les programmeurs peuvent apprendre ... (Python): À propos du tri
Ceci et cela à propos de pd.DataFrame
À propos de Boxplot et Violinplot qui visualisent la variation des données indépendantes
J'ai créé un modèle de projet Python générique
[Python] Un programme qui trouve une paire qui peut être divisée par une valeur spécifiée
Extraire les lignes qui correspondent aux conditions d'un fichier texte avec python
Essayez d'utiliser APSW, une bibliothèque Python que SQLite peut prendre au sérieux
[Python] J'ai créé un utilitaire qui peut accéder au type dict comme un chemin
J'ai fait une simple minuterie qui peut être démarrée depuis le terminal
Créez un environnement virtuel Python que tout le monde peut comprendre Septembre 2016 (pyenv + virutalenv)
J'ai fait un module PyNanaco qui peut charger des crédits nanaco avec python
Livre en spirale en Python! Python avec un livre en spirale! (Chapitre 14 ~)
[Python] Un programme qui crée des escaliers avec #
# 5 [python3] Extraire des caractères d'une chaîne de caractères
Créer un fichier deb à partir d'un package python
[Python] Créez un LineBot qui s'exécute régulièrement
Générer une classe à partir d'une chaîne en Python
Utiliser Django à partir d'un script Python local
Un monde typé qui commence par Python
Manipuler des tables BigQuery à partir d'un client Python
Un programme qui utilise Python pour lire des fichiers indésirables
Appeler des commandes depuis Python (édition Windows)
[Python] Un programme qui arrondit le score
Classe pour PYTHON qui peut être utilisée sans connaître LDAP
J'ai essayé de créer une classe qui peut facilement sérialiser Json en Python
Je souhaite créer une file d'attente prioritaire pouvant être mise à jour avec Python (2.7)
J'ai enregistré PyQCheck, une bibliothèque qui peut effectuer QuickCheck avec Python, dans PyPI.