A stringek megfordítása (jobbról balra olvasni őket, nem pedig balról jobbra) meglepően gyakori feladat a programozásban.
A bioinformatikában például gyakran fontos a DNS- vagy RNS-stringek sorrendjének megfordítása a különféle elemzésekhez, például a komplementer szálak megkereséséhez vagy a biológiai jelentőségű palindrom szekvenciák felismeréséhez.
A feladatod, hogy megfordíts egy adott stringet.
Néhány példa:
"stressed"-ból "desserts" lesz."strops"-ból "sports" lesz."racecar"-ból "racecar" lesz.Bár a Stringekhez vannak #reversed és #reverseDo: metódusok, ki tudod találni, hogyan csinálhatod meg ezt magad, alacsonyabb szintű karakteriterációval és streamekkel?
Hogy könnyebben böngészhess a kódban, a Pharo-ban van egy remek kódkereső eszköz. A Shift-Enter lenyomásával aktiválhatod.
MEGJEGYZÉS: Az Exercism konvencióját követve a megoldás neve ReverseString, egy Smalltalkosabb név viszont a StringReverser lenne.
A stringek kapcsán van néhány nyilvánvaló apróság, például hogy a megjegyzésekhez kettős idézőjelet, a stringekhez szimpla idézőjelet használunk, a karaktereknek pedig külön szintaxisuk van (pl. $x az „x” karakterre), és ezek első olvasásra összezavarhatnak, mert a konvenciók eltérnek a más nyelvekben használtaktól.
Szó van továbbá a szimbólum fogalmáról is: ez egy olyan string, amely a teljes memóriában egyedi; azaz amikor létrehozzák (tipikusan fordításkor), egy memóriakeresés indul annak megállapítására, hogy létezik-e hozzá hasonló; és csak az eredetit használják. Az indok nemcsak a memóriamegtakarítás, hanem a szimbólumok összehasonlításakor elért jelentős gyorsulás is.
"this is a comment"
'this is a string'
#'this is a symbol'
#thisIsASymbolToo
A Smalltalk programokban ráadásul nagyon kevés vessző van, mert azoknak nincs szintaktikai szerepük.
Ezért például a tömbliterálokban sincs vessző; pl.
#(1 2 3 4 5)
A vessző viszont önálló operátor, és akkor találkozol vele, amikor két stringet fűzöl össze; pl.
'string1', 'string2'
Végezetül érdemes tudni, hogy a String és a Character külön osztályok. A String a Characterek gyűjteménye. Ez váratlanul érhet, amikor stringeken iterálsz, mert könnyen előfordulhat, hogy karaktereket adsz át egy olyan metódusnak, amely stringeket vár. Vegyük például a következőt:
(('hello' at: 2) = $e) inspect.
(('hello' at: 2) = 'e') inspect.
A streamek hasznosak a szekvenciális olvasáshoz és íráshoz. Tisztábbá teszik a kódot, mert nincs szükség egy index léptetésére. A streamek bármilyen kollekción működnek.
stream := WriteStream on: String new.
stream nextPut: $h ; nextPutAll: 'ell' ; nextPut: $o.
stream contents inspect
Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Pharo nyelvet 50 feladat segítségével, valódi emberi mentorálással, mindez ingyen.
Fedezz fel 14 különböző módot egy string megfordítására, olyan témák érintésével, mint a Unicode-kódpontok, a grafémaegységek, a verem- és kupacallokáció, valamint a mutatók. Dőlj hátra, és élvezd a 45 perces tanulást Jeremy és Erik társaságában!