String

Il sistema di messaggistica scolastico deve ricavare il nome e il cognome dei docenti a partire dall’indirizzo email. Ogni indirizzo di posta elettronica è composto dal nome e dal cognome del docente separati da un punto e dal domino nel formato:

	<nome>.<cognome>@edu.ti.ch

Scrivi la classe/programma MailParser che, dato l’indirizzo di posta elettronica del docente memorizzato in una costante, stampi a terminale i relativi nome e cognome. Il formato dell’output deve rispettare rigorosamente quello proposto nei seguenti esempi:

Per “HAiEiE.braZoRf@edu.ti.ch” il programma stampa:

	Email: HAiEiE.braZoRf@edu.ti.ch
	Nome: Haieie
	Cognome: Brazorf

Per “Mickey.Mouse@edu.ti.ch”:

	Email: Mickey.Mouse@edu.ti.ch
	Nome: Mickey
	Cognome: Mouse

Per “vladimir.harkonnen@edu.ti.ch”:

	Email: vladimir.harkonnen@edu.ti.ch
	Nome: Vladimir
	Cognome: Harkonnen

Un sistema di gestione del personale deve generare una sigla associata ad ogni dipendente secondo un formato standardizzato. Il formato prevede che la sigla di ogni persona sia composta da 4 caratteri e un numero intero:

  1. Il primo carattere del cognome in maiuscolo,
  2. l’ultimo carattere del cognome in minuscolo,
  3. il primo carattere del nome in maiuscolo,
  4. l’ultimo carattere del nome in minuscolo,
  5. il numero totale di caratteri che compongono nome e cognome, espresso in base 10.

Scrivi la classe Java HashGenerator che, dati nome e cognome memorizzati in due costanti, stampi a terminale la relativa sigla. Il formato dell’output deve rispettare rigorosamente quello proposto nei seguenti esempi:

Per un impiegato di nome “HAiEiE” e cognome “bRaZorF”:

	Nome:    HAiEiE
	Cognome: bRaZorF
	Sigla:   BfHe13

Per un impiegato di nome “Mickey” e cognome “Mouse”:

	Nome:    Mickey
	Cognome: Mouse
	Sigla:   MeMy11

Per un impiegato di nome “vladimir” e cognome “harkonnen”:

	Nome:    vladimir
	Cognome: harkonnen
	Sigla:   HnVr17

Un sistema di gestione del personale deve generare una sigla associata ad ogni dipendente secondo un formato standardizzato. Il formato prevede che la sigla di ogni persona sia composta da 6 caratteri:

  1. Il primo carattere del nome in maiuscolo,
  2. il secondo carattere del nome in minuscolo,
  3. l’ultimo carattere del nome in minuscolo,
  4. il primo carattere del cognome in minuscolo,
  5. il penultimo carattere del cognome in minuscolo,
  6. l’ultimo carattere del cognome in maiuscolo.

Scrivi la classe Java HashBuilder che, dati nome e cognome memorizzati in due costanti, stampi a terminale la relativa sigla. Il formato dell’output deve rispettare rigorosamente quello proposto nei seguenti esempi:

Per un impiegato di nome “HAiEiE” e cognome “braZoRf”:

	Cognome: braZoRf
	Nome:    HAiEiE
	Sigla:   HaebrF

Per un impiegato di nome “Mickey” e cognome “Mouse”:

	Cognome: Mouse
	Nome:    Mickey
	Sigla:   MiymsE

Per un impiegato di nome “vladimir” e cognome “harkonnen”:

	Cognome: harkonnen
	Nome:    vladimir
	Sigla:   VlrheN

Scrivi il programma Unvowelator che riceve degli argomenti da linea di comando e poi li stampa privandoli delle vocali.

Ad esempio per gli argomenti "In una tiepida notte estiva." il programma stampa:

n n tpd ntt stv.

Scrivi il programma HelloPeople che riceve N nomi come argomenti da linea di comando e poi stampa altrettanti omini stilizzati. Sotto ogni omino compare il relativo nome.

Ad esempio per "Luigi Michele" il programma stampa due omini:

\o/     \o/     
 |       |      
/ \     / \     
Luigi   Michele

Invece per "Simone Luigi Pincopallino Michele Joe":

\o/          \o/          \o/          \o/          \o/          
 |            |            |            |            |           
/ \          / \          / \          / \          / \          
Simone       Luigi        Pincopallino Michele      Joe

Se non vengono forniti argomenti, il programma termina senza stampare niente.

Scrivi il programma FarfallinatoreInterattivo che chiede all’utente di inserire una frase e poi la codifica in alfabeto farfallino (se non conosci l’alfabeto farfallino vedi wikipedia).

Esempio:

Inserire una frase: Il mattino ha l'oro in bocca
Ifil mafattifinofo hafa l'oforofo ifin bofoccafa

Oppure:

Inserire una frase: ciao come va
cifiafaofo cofomefe vafa

Scrivere la classe Asciigator che chiede all’utente di digitare un stringa di testo e poi stampa ogni carattere contenuto nella stringa introdotta e il relativo codice Unicode (in decimale e in esadecimale).

Ad esempio per ABCDEF1234567890 il programma produce l’output seguente:

Introdurre un testo:
ABCDEF1234567890

char:	'A'	'B'	'C'	'D'	'E'	'F'	'1'	'2'	'3'	'4'	'5'	'6'	'7'	'8'	'9'	'0'	
dec:	65	66	67	68	69	70	49	50	51	52	53	54	55	56	57	48	
hex:	41	42	43	44	45	46	31	32	33	34	35	36	37	38	39	30	

Mentre per Hello world!:

Introdurre un testo:
Hello world!

char:	'H'	'e'	'l'	'l'	'o'	' '	'w'	'o'	'r'	'l'	'd'	'!'	
dec:	72	101	108	108	111	32	119	111	114	108	100	33	
hex:	48	65	6c	6c	6f	20	77	6f	72	6c	64	21

L’ISBN-13 azionabile è un codice composto secondo il modello:

	ISBN A 10.###.#######/###

Ad esempio:

	ISBN A 10.978.8889637/418

Dove la sequenza di # rappresenta 13 cifre (12 cifre di codice + 1 cifra di controllo).

La cifra di controllo si calcola in base al valore delle 12 cifre precedenti con il seguente algoritmo numerico:

  1. si moltiplica ogni cifra per un peso che assume in modo alternato i valori 1 e 3, partendo dalla prima cifra a sinistra che ha peso 1
  2. si sommano i risultati
  3. si divide la somma per 10 e si prende il resto della divisione
  4. si sottrae il risultato da 10: questa cifra è la cifra di controllo; se quest’ultimo risultato fosse proprio 10, lo si sostituirà con 0.

Ad esempio per il codice ISBN A 10.978.8843025/34:

9 * 1 + 7 * 3 + 8 * 1 + 8 * 3 + 8 * 1 + 4 * 3 + 3 * 1 + ... + 4 * 3 = 117

117 diviso 10 da resto 7

10 - 7 = 3 

la cifra di controllo sarebbe 3 (quindi il codice completo sarebbe ISBN A 10.978.8843025/343).

Scrivi il programma ActionableIsbnChecker che chiede all’utente di inserire un codice ISBN-13 azionabile e ne verifica la correttezza.

I prefissi ISBN, A e 10, i punti, lo slash e gli spazi ('.', '/' e '' ) sono opzionali, se vengono omessi il programma esegue comunque la verifica.

Il codice e la cifra di controllo devono essere presenti e validi, altrimenti il programma stampa un messaggio di errore.

Se il codice non è valido, il messaggio stampato è Codice non valido. Se la cifra di controllo non è valida ([1;10]) il messaggio di errore è Cifra di controllo non valida.

Se l’utente inserisce un codice con il formato ammesso, il programma ne verifica la bontà controllando la corrispondenza tra codice e cifra di controllo. Se corrispondono il programma termina stampando il messaggio Codice verificato!, altrimenti stampa Codice errato.

Scrivi un decodificatore capace decifrare una stringa in alfabeto farfallino.

Esempio:

>java DeFarfallinatore Lefe frafagofolefe sofonofo mafatufurefe
Le fragole sono mature

Scrivi il programma Farfallinatore che codifichi una stringa introdotta dall’utente in alfabeto farfallino (se non conosci l’alfabeto farfallino vedi wikipedia).

Esempio:

>java Farfallinatore Tanto va la gatta al lardo
Tafantofo vafa lafa gafattafa afal lafardofo

Scrivi la classe WordShaker che chiede all’utente di inserire una frase e poi la stampa scambiando il primo con in secondo carattere, il terzo con il quarto, il quinto con il sesto e via dicendo. Se il numero di caratteri è dispari l’ultimo carattere viene stampato nella sua posizione originale.

Qualche esempio:

  • cane diventa acen
  • gatto diventa agtto
  • tanto va la gatta al lardo diventa attn oavl aagtt alal raod
  • abcde diventa badce

Esempio di output:

Inserire una frase: Asta la vista!
sAatl  aivts!a

Scrivi la class SentenceSplitter che chiede all’utente di inserire una frase e poi la stampa alternandone i caratteri su due righe come mostrato negli esempi seguenti.

Esempio di output:

Inserire una frase: cane
c n 
 a e

oppure:

Inserire una frase: mele cotogne
m l   o o n 
 e e c t g e

o ancora:

Inserire una frase: Tanto va la gatta al lardo.
T n o v   a g t a a   a d .
 a t   a l   a t   l l r o 

Scrivi la classe DoubleCounter che chiede all’utente di inserire una parola e stampa il conteggio delle coppie caratteri consecutivi uguali (non sensibile alle maiuscole) contenute nella parola. Qualche esempio:

  • per la parola cane il conteggio vale 0
  • per gatto vale 1 (tt)
  • per caMmMicia vale 2 (Mm e mM)
  • per abbacchio vale 2 (bb e cc)
  • per Ooteca vale 1 (Oo)

Esempio di output:

Inserire una parola: Zzzzummm
Coppie: 5

Scrivi la classe TextFormatter contenente il metodo:

public static String reformat(Path source)

Tale metodo legge il contenuto di un file di testo e lo ritorna formattandolo secondo le regole seguenti:

  1. il carattere a capo non è ammesso
  2. non ci sono spazi (' ') all’inizio e alla fine del testo
  3. non ci sono spazi multipli
  4. non ci sono spazi prima di un carattere di punteggiatura ('.', ',', ';', ':', '!', '?')
  5. dopo un carattere di punteggiatura c’è sempre uno spazio, a meno che:
    • sia l’ultimo carattere del testo (regola 2.)
    • sia seguito da un altro carattere di punteggiatura (regola 4.)

Ad esempio per un file contenente il testo:

  John,Malkovich?John   : Malkovich!!! !
     John     Malkovich   !? !?John;Malkovich .   .    .  

il metodo reformat ritorna la stringa:

John, Malkovich? John: Malkovich!!!! John Malkovich!?!? John; Malkovich...

Da Wikipedia:

“Il cifrario di Cesare è uno dei più antichi algoritmi crittografici di cui si abbia traccia storica. È un cifrario a sostituzione monoalfabetica in cui ogni lettera del testo in chiaro è sostituita nel testo cifrato dalla lettera che si trova un certo numero di posizioni dopo nell’alfabeto. Questi tipi di cifrari sono detti anche cifrari a sostituzione o cifrari a scorrimento a causa del loro modo di operare: la sostituzione avviene lettera per lettera, scorrendo il testo dall’inizio alla fine.” … ” In particolare, Cesare utilizzava uno spostamento di 3 posizioni (la chiave era dunque 3” …


Ad esempio, applicando la chiave 3: 'a' diventa 'd', 'b' diventa 'e', 'c' diventa 'f' e via dicendo:

Carattere originale 'a' 'b' 'c' 'd' 'e' 'x' 'y' 'z'
Codifica con chiave 3 'd' 'e' 'f' 'g' 'h' 'a' 'b' 'c'

Applicando invece la chiave 5 'a' diventa 'f', 'b' diventa 'g'… eccetera:

Carattere originale 'a' 'b' 'c' 'd' 'e' 'x' 'y' 'z'
Codifica con chiave 5 'f' 'g' 'h' 'i' 'j' 'c' 'd' 'e'

Scrivi la classe Java CifrarioDiCesare che contenga due metodi utili rispettivamente per codificare e decodificare una stringa:

  • public static String codifica(String testo, int chiave)
  • public static String decodifica(String codice, int chiave)

Scrivi la classe StringTool contenente i metodo seguenti:

longest

public static String longest(String a, String b)

Ritorna la stringa più lunga tra a, b. Ad esempio longest("cane","gatto") ritorna la stringa gatto, mentre longest("abcdef","gatto") ritorna abcdef.

alternate

public static String alternate(String a, String b, int times)

Ritorna una stringa di testo contenente le stringhe a e b alternate times volte. Ad esempio alternate("*","-",5) ritorna la stringa *-*-*-*-*-, mentre alternate("va","Ja",2) ritorna la stringa vaJavaJa.

concatenate

public static String concatenate(int a, int b, int c, char separator, char terminator)

Ritorna una stringa contenente l’elenco dei valori dei parametri a, b e c. I valori sono separati dal carattere separator e la lista è terminata dal carattere terminator. Ad esempio concatenate(1,2,3,';','.') ritorna la stringa 1;2;3., mentre concatenate(10,20,30,'_','!') ritorna la stringa 10_20_30!.w

Scrivi il programma CharCounter che calcola la frequenza dei caratteri alfabetici contenuti in un file di testo. Il percorso del file è fornito come primo argomento da linea di comando. Il programma legge il contenuto del file e stampa il conteggio dei caratteri (case insensitive) e il tempo impiegato. Ad esempio, per un file contenente il testo seguente:

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

il programma stampa:

'a': 29
'b': 3
'c': 16
'd': 19
'e': 38
'f': 3
'g': 3
'h': 1
'i': 42
'j': 0
'k': 0
'l': 22
'm': 17
'n': 24
'o': 29
'p': 11
'q': 5
'r': 22
's': 18
't': 32
'u': 29
'v': 3
'w': 0
'x': 3
'y': 0
'z': 0

Parse time: 6ms

Se il percorso fornito come primo argomento non è valido (non esiste, non è leggibile), il programma stampa il messaggio "Error reading <file>" e termina.

Se non vengono forniti argomenti il programma stampa il messaggio "Usage: java CharCounter <file>".

Per verificare il buon funzionamento del tuo programma puoi usare la Divina commedia e cronometrare il tempo impiegato (usa System.currentTimeMillis() per misurare il tempo).

Scrivi il programma ButterFyler utile per codificare un file di testo (UTF-8) in alfabeto farfallino e salvarlo in un file di destinazione (se non conosci l’alfabeto farfallino vedi wikipedia).

La classe deve contenere il metodo encode che codifica il file source e lo salva nel file dest:

public static void encode(Path source, Path dest)

Per verificare il buon funzionamento del tuo programma prova a codificare la Divina commedia e a cronometrare il tempo impiegato per la codifica (usa System.currentTimeMillis() per misurare il tempo).

Scrivi il gioco interattivo MorraCinese. Il programma chiede di inserire il punteggio massimo, poi il gioco comincia. Vince chi raggiunge prima il punteggio massimo.

  1. Il programma chiede di inserire il punteggio massimo. Sono ammessi solo valori nel range [1;10].
  2. Se l’utente inserisce un valore non valido, ricomincia dal punto 1.
  3. Chiede all’utente di inserire la sua giocata (1 per carta, 2 per sasso, 3 per forbice).
  4. Se l’utente inserisce un valore non valido, ricomincia dal punto 3.
  5. Il programma estrae a sorte la propria giocata (1 per carta, 2 per sasso, 3 per forbice).
  6. Il programma visualizza le due giocate e, se ve ne è uno, il vincitore della mano corrente (player o CPU) e il punteggio attuale dei due giocatori.
  7. Se nessuno ha raggiunto il punteggio massimo il programma prosegue dal punto 3.
  8. Se un giocatore ha raggiunto il punteggio massimo il programma stampa il nome del vincitore (player o CPU) e prosegue dal punto 9.
  9. Il programma chiede se si vuole giocare di nuovo (0 per continuare, 1 per terminare).
  10. Se l’utente inserisce un valore non valido, ricomincia dal punto 9.
  11. Se l’utente inserisce 0 il programma ricomincia dal punto 1.
  12. Se l’utente inserisce 1 il programma termina.

Esempio:

Oppure, se la vostra console supporta Unicode:

Scrivi il programma interattivo Butterflyzer che permetta di codificare e decodificare messaggi in alfabeto farfallino.

  1. Inizialmente il programma propone di scegliere la funzione ('c' per codificare, 'd' per decodificare, 'q' per terminare),
  2. Se la scelta digitata non è valida ricomincia dal punto 1.
  3. Se la scelta è 'q' il programma termina.
  4. Se la scelta è 'c', chiede all’utente di digitare una stringa di testo da codificare e poi stampa il messaggio codificato.
  5. Se la scelta è 'd', chiede all’utente di digitare il messagio da decodificare e poi stampa il testo decodificato.
  6. Il programma ricomincia dal punto 1.

Esempio:

$ java Butterflyzer
Codificatore/decodificatore alfabeto Farfallino
Premi 'c' per codificare un messaggio
Premi 'd' per decodificare un messaggio
Premi 'q' per uscire
Scelta: x
Scelta non valida 'x'

Codificatore/decodificatore alfabeto Farfallino
Premi 'c' per codificare un messaggio
Premi 'd' per decodificare un messaggio
Premi 'q' per uscire
Scelta: c
Inserire testo da codificare: Tanto va la gatta al lardo
Messaggio codificato: Tafantofo vafa lafa gafattafa afal lafardofo

Codificatore/decodificatore alfabeto Farfallino
Premi 'c' per codificare un messaggio
Premi 'd' per decodificare un messaggio
Premi 'q' per uscire
Scelta: d
Messaggio da decodificare: Lefe frafagofolefe sofonofo mafatufurefe
Testo decodificato: Le fragole sono mature

Codificatore/decodificatore alfabeto Farfallino
Premi 'c' per codificare un messaggio
Premi 'd' per decodificare un messaggio
Premi 'q' per uscire
Scelta: q
$

Scrivi la classe AdvancedStringTool contenente i metodi desctitti in seguito:

isLetter

public static boolean isLetter(char c)

Ritorna true se il carattere c è una lettera, mentre ritorna false In caso contrario.

isConsonant

public static boolean isConsonant(char c)

Ritorna true se il carattere c è una consonante, false altrimenti.

isVowel

public static boolean isVowel(char c)

Ritorna true se c è una vocale, mentre ritorna false in tutti gli altri casi.

countVowels

public static int countVowels(String text)

Ritorna il numero di vocali presenti nella stringa text. Ad esempio countVowels("NOOOOOO") ritorna 6.

countConsonants

public static int countConsonants(String text)

Tale metodo ritorna il numero di consonanti presenti nella stringa text. Ad esempio countConsonants("NOOOOOO") ritorna 1.

vowelize

public static String vowelize(String text)

Ritorna una stringa contenente solamente le vocali della stringa text. Ad esempio vowelize("casa") ritorna "aa", mentre vowelize("lunotto") ritorna "uoo".

isAlternative

public static boolean isAlternative(String s)

Tale metodo ritorna true se la stringa s contiene consonanti e vocali alternate (es. isAlternative("patata") ritorna true).

countInString

public static int countInString(String text, char c)

Tale metodo conta quante volte il carattere c è presente nella stringa text.

isAnagram

public static boolean isAnagram(String firstWord, String secondWord)

Ritorna true se firstWord è un anagramma di secondWord, altrimenti ritorna false. Esempio isAnagram("calendario","locandiera") ritorna true.

Scrivi la classe NameFramer contenente il metodo:

pubic static String frameName(String name, char c, int width)

che ritorna una stringa contenente la stringa name incorniciata nel carattere c utilizzato con uno spessore width.

Ad esempio frameName("Piero",'*',2) ritorna la stringa:

*********
*********
**Piero**
*********
*********

mentre frameName("Andrea",'$',1) ritorna la stringa:

$$$$$$$$
$Andrea$
$$$$$$$$