Invertire le stringhe (leggendole da destra a sinistra invece che da sinistra a destra) è un'operazione sorprendentemente comune in programmazione.
Per esempio, nella bioinformatica, invertire la sequenza di stringhe di DNA o RNA è spesso importante per diverse analisi, come trovare filamenti complementari o identificare sequenze palindrome di rilevanza biologica.
Il tuo compito è invertire una determinata stringa.
Alcuni esempi:
"stressed" in "desserts"."strops" in "sports"."racecar" in "racecar".Sebbene per le stringhe esistano i metodi #reversed e #reverseDo:, riesci a capire da solo come farlo usando l'iterazione dei caratteri a basso livello e gli stream?
Per aiutarti a esplorare il codice, Pharo ha un comodo strumento per trovare il codice. Premi Shift-Enter per attivarlo.
NOTA: abbiamo seguito la convenzione di Exercism di chiamare la soluzione ReverseString, però un nome più Smalltalk sarebbe StringReverser.
Per quanto riguarda le stringhe, ci sono alcuni piccoli dettagli evidenti, come le virgolette doppie per i commenti, gli apici singoli per le stringhe ed una sintassi speciale per i caratteri (ad esempio, $x per il carattere «x»), che potrebbero confonderti alla prima lettura, dato che le convenzioni sono diverse da quelle usate dagli altri linguaggi.
C'è anche la nozione di simbolo, cioè una stringa unica in tutta la memoria; quando viene costruito (di solito in fase di compilazione), si effettua una ricerca in memoria per stabilire se ne esiste già un altro uguale, e viene usato solo l'originale. La ragione non è solo il risparmio di memoria, ma anche un notevole guadagno di velocità nel confronto tra simboli.
"this is a comment"
'this is a string'
#'this is a symbol'
#thisIsASymbolToo
Ci sono anche pochissime virgole nei programmi Smalltalk, perché non svolgono alcun ruolo sintattico. Ecco perché i letterali degli array, per esempio, sono privi di virgole, ad esempio
#(1 2 3 4 5)
Tuttavia la virgola è un operatore a sé stante e la noterai quando concateni due stringhe, ad esempio
'string1', 'string2'
Infine, vale la pena sapere che le stringhe ed i caratteri sono classi distinte. Una stringa è una collezione di caratteri. Questo può coglierti alla sprovvista quando iteri sulle stringhe, perché potresti finire per passare dei caratteri a un metodo che si aspetta delle stringhe. Considera...
(('hello' at: 2) = $e) inspect.
(('hello' at: 2) = 'e') inspect.
Gli stream sono utili per la lettura e la scrittura sequenziali. Rendono il codice più pulito evitando la necessità di incrementare un indice. Gli stream funzionano su qualsiasi collezione.
stream := WriteStream on: String new.
stream nextPut: $h ; nextPutAll: 'ell' ; nextPut: $o.
stream contents inspect
Iscriviti a Exercism per imparare e padroneggiare Pharo con 50 esercizi e il mentoring di persone reali, tutto gratis.
Esplora 14 modi diversi di invertire una stringa, toccando vari argomenti tra cui i code point Unicode, i grafemi, le allocazioni sullo stack e sullo heap e i puntatori. Rilassati e goditi 45 minuti di apprendimento con Jeremy e Erik.