Inverter strings (lê-las da direita para a esquerda, em vez de as ler da esquerda para a direita) é uma tarefa surpreendentemente comum em programação.
Por exemplo, em bioinformática, inverter a sequência de strings de ADN ou ARN é muitas vezes importante para várias análises, como encontrar cadeias complementares ou identificar sequências palindrómicas com relevância biológica.
A tua tarefa é inverter uma determinada string.
Alguns exemplos:
"stressed" em "desserts"."strops" em "sports"."racecar" em "racecar".Embora existam os métodos #reversed e #reverseDo: para strings, consegues descobrir como fazer isto sozinho recorrendo a iteração de carateres de mais baixo nível e a streams?
Para te ajudar a explorar o código, o Pharo tem uma ferramenta engenhosa de pesquisa de código. Carrega em Shift-Enter para a ativar.
NOTA: Seguimos a convenção do Exercism de chamar à solução ReverseString, mas um nome mais ao estilo de Smalltalk seria StringReverser.
Quanto às strings, há alguns pequenos detalhes óbvios, como as aspas duplas para comentários, as aspas simples para strings e a sintaxe especial para carateres (por exemplo, $x para o caráter «x»), que te podem confundir à primeira leitura, já que as convenções são diferentes das usadas noutras linguagens.
Há também a noção de símbolo, que é uma string única em toda a memória; ou seja, quando é construído (normalmente em tempo de compilação), é feita uma pesquisa na memória para determinar se já existe outro igual; e só o original é usado. A razão não é apenas poupar memória, mas também um aumento significativo de velocidade ao comparar símbolos.
"this is a comment"
'this is a string'
#'this is a symbol'
#thisIsASymbolToo
Também há muito poucas vírgulas nos programas em Smalltalk, porque não desempenham nenhum papel sintático.
É por isso que os literais de array, por exemplo, não têm vírgulas; por exemplo,
#(1 2 3 4 5)
No entanto, a vírgula é um operador por direito próprio e vais repará-la quando concatenas duas strings; por exemplo,
'string1', 'string2'
Por fim, vale a pena saber que strings e carateres são classes distintas. Uma string é uma coleção de carateres. Isto pode apanhar-te desprevenido quando iteras sobre strings, pois podes acabar por passar carateres a um método que espera strings. Repara em...
(('hello' at: 2) = $e) inspect.
(('hello' at: 2) = 'e') inspect.
As streams são úteis para leitura e escrita sequenciais. Tornam o código mais limpo ao evitar a necessidade de incrementar um índice. As streams funcionam com qualquer coleção.
stream := WriteStream on: String new.
stream nextPut: $h ; nextPutAll: 'ell' ; nextPut: $o.
stream contents inspect
Inscreve-te no Exercism para aprenderes e dominares Pharo com 50 exercícios, e mentoria humana real, tudo grátis.
Explora 14 formas diferentes de inverter uma string, abordando vários temas, incluindo pontos de código Unicode, grafemas, alocações na pilha versus no heap e apontadores. Relaxa e aproveita 45 minutos de aprendizagem com o Jeremy e o Erik.