Strings umzukehren (sie von rechts nach links statt von links nach rechts zu lesen) ist eine überraschend häufige Aufgabe beim Programmieren.
In der Bioinformatik zum Beispiel ist es oft wichtig, die Sequenz von DNA- oder RNA-Strings umzukehren, etwa für verschiedene Analysen wie das Finden komplementärer Stränge oder das Identifizieren palindromischer Sequenzen mit biologischer Bedeutung.
Deine Aufgabe ist es, einen gegebenen String umzukehren.
Ein paar Beispiele:
"stressed" "desserts"."strops" "sports"."racecar" "racecar".Auch wenn es für Strings die Methoden #reversed und #reverseDo: gibt: Kannst du herausfinden, wie du das selbst mit Zeichen-Iteration auf niedrigerer Ebene und Streams machst?
Um dir das Durchsuchen von Code zu erleichtern, hat Pharo ein praktisches Werkzeug zum Finden von Code. Drücke Shift-Enter, um es zu aktivieren.
HINWEIS: Wir sind der Exercism-Konvention gefolgt und haben die Lösung ReverseString genannt, ein typischerer Smalltalk-Name wäre allerdings StringReverser.
Was Strings angeht, gibt es einige offensichtliche kleine Details wie doppelte Anführungszeichen für Kommentare, einfache Anführungszeichen für Strings und eine spezielle Syntax für Zeichen (z. B. $x für das Zeichen „x“), die dich beim ersten Lesen verwirren können, weil die Konventionen anders sind als in anderen Sprachen.
Außerdem gibt es das Konzept des Symbols: ein String, der im gesamten Speicher einmalig ist. Wenn es erzeugt wird (typischerweise zur Compile-Zeit), wird der Speicher durchsucht, um festzustellen, ob ein gleiches Symbol bereits existiert, und nur das Original wird verwendet. Der Grund dafür ist nicht nur Speichereinsparung, sondern auch eine deutlich höhere Geschwindigkeit beim Vergleichen von Symbolen.
"this is a comment"
'this is a string'
#'this is a symbol'
#thisIsASymbolToo
In Smalltalk-Programmen gibt es außerdem nur sehr wenige Kommas, weil sie keine syntaktische Rolle spielen.
Deshalb kommen Array-Literale zum Beispiel ohne Kommas aus, z. B.
#(1 2 3 4 5)
Das Komma ist aber ein eigenständiger Operator, und du wirst es beim Verketten zweier Strings bemerken, z. B.
'string1', 'string2'
Schließlich solltest du wissen, dass Strings und Characters unterschiedliche Klassen sind. Ein String ist eine Sammlung von Characters. Das kann dich beim Iterieren über Strings überraschen, weil du am Ende Zeichen an eine Methode übergibst, die Strings erwartet. Schau dir das an ...
(('hello' at: 2) = $e) inspect.
(('hello' at: 2) = 'e') inspect.
Streams sind nützlich für das sequenzielle Lesen und Schreiben. Sie machen den Code sauberer, weil du keinen Index erhöhen musst. Streams arbeiten mit jeder Collection.
stream := WriteStream on: String new.
stream nextPut: $h ; nextPutAll: 'ell' ; nextPut: $o.
stream contents inspect
Melde dich bei Exercism an, um Pharo mit 50 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.
Entdecke 14 verschiedene Wege, einen String umzukehren, und tauche in Themen wie Unicode-Codepoints, Grapheme, Stack- vs. Heap-Allokationen und Pointer ein. Lehne dich zurück und genieße 45 Minuten Lernen mit Jeremy und Erik.