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