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

L’input è costituito da una lista di righe che contengono del testo in chiaro.

Dati di output

Il programma deve scrivere in output le 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.
  • 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

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

Nota

“Chicco e Spillo” è il titolo 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(s_in):
    ord_A = ord('A')
    ord_a = ord('a')
    ord_0 = ord('0')
    s_out = ""
    for c in s_in:
        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]
        s_out += c
    return s_out

lista = [
    "Il cellulare di Elena e' 338-4189961.",
    "Ti aspetta alla stazione alle 8, VAI!"
]

for riga in lista:
    print(traduci(riga))

Versione O.I.I.

Con gestione dell’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()