Inverser des strings (les lire de droite à gauche, plutôt que de gauche à droite) est une tâche étonnamment courante en programmation.
Par exemple, en bio-informatique, inverser la séquence de strings d'ADN ou d'ARN est souvent important pour diverses analyses, comme trouver des brins complémentaires ou identifier des séquences palindromiques qui présentent un intérêt biologique.
Ta tâche consiste à inverser une string donnée.
Quelques exemples :
"stressed" en "desserts"."strops" en "sports"."racecar" en "racecar".Bien qu'il existe les méthodes #reversed et #reverseDo: pour les strings, peux-tu trouver comment t'y prendre toi-même, en utilisant une itération sur les caractères de plus bas niveau et des streams ?
Pour t'aider à parcourir le code, Pharo dispose d'un outil bien pratique pour trouver du code. Appuie sur Shift-Enter pour l'activer.
NOTE : on a suivi la convention d'Exercism qui consiste à appeler la solution ReverseString, mais un nom plus Smalltalk serait StringReverser.
En ce qui concerne les strings, il y a quelques petits détails évidents, comme les guillemets doubles pour les commentaires, les guillemets simples pour les strings et une syntaxe particulière pour les caractères (par exemple, $x pour le caractère « x »), qui peuvent te dérouter à la première lecture, car ces conventions diffèrent de celles utilisées dans d'autres langages.
Il y a aussi la notion de symbole : un string qui est unique dans toute la mémoire ; c'est-à-dire que lorsqu'il est construit (généralement à la compilation), une recherche est faite en mémoire pour déterminer s'il en existe déjà un identique, et seul l'original est utilisé. La raison n'est pas seulement d'économiser de la mémoire, mais aussi d'accélérer considérablement la comparaison des symboles.
"this is a comment"
'this is a string'
#'this is a symbol'
#thisIsASymbolToo
Il y a également très peu de virgules dans les programmes Smalltalk, car elles n'y jouent aucun rôle syntaxique.
C'est pourquoi les littéraux de tableau, par exemple, s'écrivent sans virgule ; ainsi
#(1 2 3 4 5)
Cependant, la virgule est un opérateur à part entière, et tu la remarqueras quand tu concatènes deux strings ; par exemple
'string1', 'string2'
Enfin, il est bon de savoir que les strings et les characters sont des classes distinctes. Un string est une collection de characters. Cela peut te prendre au dépourvu quand tu itères sur des strings, car tu peux finir par passer des caractères à une méthode qui attend des strings. Prenons l'exemple suivant :
(('hello' at: 2) = $e) inspect.
(('hello' at: 2) = 'e') inspect.
Les streams sont utiles pour lire et écrire de manière séquentielle. Ils rendent le code plus propre en évitant d'avoir à incrémenter un indice. Les streams opèrent sur n'importe quelle collection.
stream := WriteStream on: String new.
stream nextPut: $h ; nextPutAll: 'ell' ; nextPut: $o.
stream contents inspect
Inscris-toi sur Exercism pour apprendre et maîtriser Pharo avec 50 exercices, et un vrai mentorat humain, le tout gratuitement.
Découvre 14 façons différentes d'inverser une chaîne de caractères, en explorant des sujets variés comme les points de code Unicode, les graphèmes, les allocations sur la pile et sur le tas, et les pointeurs. Installe-toi confortablement et profite de 45 minutes d'apprentissage avec Jeremy et Erik.