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