Codice segreto

Fase territoriale 2005

Chicco e Spillo comunicano con dei messaggi scritti in codice per non essere scoperti.
Il loro codice funziona così: ogni vocale è rappresentata con la vocale successiva in ordine alfabetico, e ogni consonante con la consonante successiva.
La Y, che è l’ultima vocale, è rappresentata in codice dalla A, che è la prima vocale.
Allo stesso modo, la Z è rappresentata in codice dalla B.
Per le cifre il discorso è simile: ogni cifra è rappresentata dalla successiva, e 9 è rappresentato da 0.

Il codice mantiene la distinzione maiuscole/minuscole.
Gli spazi e i segni d’interpunzione (compresi gli accenti) non sono modificati dal codice segreto.

Aiutiamo Chicco e Spillo scrivendo un programma per codificare i loro messaggi!

Dati di input

Il file input.txt contiene un intero N nella prima riga.
Le successive N righe contengono del testo in chiaro, con al più 80 caratteri per riga.

Dati di output

Il programma, leggendo il file di input, deve scrivere in output N righe contenenti il corrispondente testo in codice.

Assunzioni

  • Il testo in input è composto soltanto da lettere, cifre e segni d’interpunzione.
    Non ci sono caratteri accentati: al posto degli accenti, si usano gli apostrofi.
  • Ogni riga di testo contiene al più 80 caratteri in formato ASCII.
  • L’alfabeto è quello esteso a 26 lettere: 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.
    Le vocali sono A E I O U Y.
    Tutte le altre lettere sono consonanti.

Esempio

input.txt output.txt
2
Il cellulare di Elena e’ 338-4189961.
Ti aspetta alla stazione alle 8, VAI!
Om dimmymesi fo Imipe i' 449-5290072.
Vo etqivve emme tveboupi emmi 9, WEO!

Nota

  • Chicco e Spillo sono due personaggi di una canzone di Samuele Bersani.
/*
    www.valcon.it
    OII 2005 - Fase territoriale - Codice segreto
*/

#include 
#include 
#include 
#include 
#include 

using namespace std;

char trasforma(char c)
{
    int minuscolo=islower(c);
    c=toupper(c);
    switch(c)
    {
        case 'A': c='E'; break; case 'B': c='C'; break; case 'C': c='D'; break;
		case 'D': c='F'; break; case 'E': c='I'; break; case 'F': c='G'; break;
		case 'G': c='H'; break; case 'H': c='J'; break; case 'I': c='O'; break;
		case 'J': c='K'; break; case 'K': c='L'; break; case 'L': c='M'; break;
        case 'M': c='N'; break; case 'N': c='P'; break; case 'O': c='U'; break;
		case 'P': c='Q'; break; case 'Q': c='R'; break; case 'R': c='S'; break;
		case 'S': c='T'; break; case 'T': c='V'; break; case 'U': c='Y'; break;
		case 'V': c='W'; break; case 'W': c='X'; break; case 'X': c='Z'; break;
		case 'Y': c='A'; break; case 'Z': c='B'; break;       
       
        case '0': c='1'; break; case '1': c='2'; break; case '2': c='3'; break;
		case '3': c='4'; break; case '4': c='5'; break; case '5': c='6'; break;
        case '6': c='7'; break; case '7': c='8'; break; case '8': c='9'; break;
		case '9': c='0'; break;
    }
    if(minuscolo)
        c=tolower(c);
    return c;
}

int main()
{
    int    N;
    string buffer;
    int    lung;

    ifstream fin ( "input.txt");
    ofstream fout("output.txt");
    
    getline(fin, buffer);
    N=atoi(buffer.c_str());
    for(int i=1; i <= N; i++)
    {
        getline(fin, buffer);
        lung=buffer.length();
        for(int j=0; j < lung; j++)
            buffer[j]=trasforma(buffer[j]);
        fout << buffer << endl;
    }     
	return 0;
}

/*
    www.valcon.it
    Fase territoriale 2005 - CODICE SEGRETO
*/

#include 
#include    // atoi()
#include     // islower() - toupper() - tolower()
#define  LMAX 80

char trasforma(char c)
{
    int minuscolo=islower(c);
    c=toupper(c);
    switch(c)
    {
        case 'A': c='E'; break; case 'B': c='C'; break; case 'C': c='D'; break;
        case 'D': c='F'; break; case 'E': c='I'; break; case 'F': c='G'; break;
        case 'G': c='H'; break; case 'H': c='J'; break; case 'I': c='O'; break;
        case 'J': c='K'; break; case 'K': c='L'; break; case 'L': c='M'; break;
        case 'M': c='N'; break; case 'N': c='P'; break; case 'O': c='U'; break;
        case 'P': c='Q'; break; case 'Q': c='R'; break; case 'R': c='S'; break;
        case 'S': c='T'; break; case 'T': c='V'; break; case 'U': c='Y'; break;
        case 'V': c='W'; break; case 'W': c='X'; break; case 'X': c='Z'; break;
        case 'Y': c='A'; break; case 'Z': c='B'; break;       
       
        case '0': c='1'; break; case '1': c='2'; break; case '2': c='3'; break;
        case '3': c='4'; break; case '4': c='5'; break; case '5': c='6'; break;
        case '6': c='7'; break; case '7': c='8'; break; case '8': c='9'; break;
        case '9': c='0'; break;
    }
    if(minuscolo)
        c=tolower(c);
		       
    return c;
}

int main()
{
    int  N;
    char buffer[LMAX+1];
    int  i,j;

    FILE *fin =fopen( "input.txt", "r");
    FILE *fout=fopen("output.txt", "w");
    
    fgets(buffer, LMAX, fin);
    N=atoi(buffer);
    for(i=1; i <= N; i++)
    {
        fgets(buffer, LMAX, fin);
        for(j=0; buffer[j]!='\0'; j++)
            buffer[j]=trasforma(buffer[j]);
        fputs(buffer, fout);
    }     
    fclose(fin );
    fclose(fout);
    return 0;
}

La funzione trasforma() può essere più compatta...

char trasforma(char c)
{
    if(isdigit(c))      
    {
        c++;
        if(c > '9')
            c='0';
    }
    else if(isalpha(c))
    {
        int minuscolo=islower(c);
        c=toupper(c);
        switch(c)
        {
            case 'A': c='E'; break;
            case 'E': c='I'; break;
            case 'I': c='O'; break;
            case 'O': c='U'; break;
            case 'U': c='Y'; break;                                          
            case 'Y': c='A'; break;              
            case 'Z': c='B'; break;
            default :
                    {
                      c++;
                      if(c == 'E' || c == 'I' || c == 'O' || c == 'U' || c == 'Y')
                          c++;
                    }
        }
        if(minuscolo)
            c=tolower(c);
    }        
    return c;
}

Lascia un commento