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
| Input | Output |
|---|---|
| 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()