Codice segreto

Olimpiadi Italiane di Informatica – 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                                     | Om dimmymesi fo Imipe i' 449-5290072. |
| Il cellulare di Elena e' 338-4189961. | Vo etqivve emme tveboupi emmi 9, WEO! |
| Ti aspetta alla stazione alle 8, VAI! |                                       |
+---------------------------------------+---------------------------------------+

Nota

Chicco e Spillo sono due personaggi di una canzone di Samuele Bersani.

Tra tutte le possibili soluzioni… una versione molto compatta utilizza 3 liste per la codifica dei caratteri

      #  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
cUPPER=['E','C','D','F','I','G','H','J','O','K','L','M','N','P','U','Q','R','S','T','V','Y','W','X','Z','A','B']
      #  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
cLOWER=['e','c','d','f','i','g','h','j','o','k','l','m','n','p','u','q','r','s','t','v','y','w','x','z','a','b'] 
      #  0   1   2   3   4   5   6   7   8   9
cDIGIT=['1','2','3','4','5','6','7','8','9','0']

def traduci(s1):
    ord_A=ord('A')
    ord_a=ord('a')
    ord_0=ord('0')
    s2=""
    for c in s1:
        ord_c=ord(c)
        if(c.isupper()):   c=cUPPER[ord_c-ord_A]
        elif(c.islower()): c=cLOWER[ord_c-ord_a]
        elif(c.isdigit()): c=cDIGIT[ord_c-ord_0]
        s2+=c
    return s2

Per gestire l’input/output da file

f=open("input.txt", "r")
t1=f.readlines()
f.close()

n=int(testo[0])
t2=[]
for i in range(1,n+1):
   t2.append(traduci(testo[i]))

f=open("output.txt", "w")
f.writelines(t2)
f.close()