Обернення рядків тексту (англ. string) (читання їх справа наліво, а не зліва направо) є напрочуд поширеною задачею в програмуванні.
Наприклад, у біоінформатиці обернення послідовності рядків тексту ДНК або РНК часто важливе для різних аналізів, як-от пошук комплементарних ланцюгів або виявлення паліндромних послідовностей, що мають біологічне значення.
Переверніть заданий рядок тексту (англ. string).
Кілька прикладів:
"stressed" на "desserts"."strops" на "sports"."racecar" на "racecar".Хоча для рядків тексту (англ. string) є методи #reversed і #reverseDo:, чи можемо ми самі розібратися, як зробити це за допомогою низькорівневої ітерації по символах і потоків?
Щоб допомогти нам переглядати код, Pharo має зручний інструмент пошуку коду. Натисніть Shift-Enter, щоб його активувати.
ПРИМІТКА: Ми дотрималися конвенції Exercism і назвали рішення ReverseString, проте назва, природніша для Smalltalk, була б StringReverser.
Що стосується рядків тексту, є кілька очевидних дрібниць: подвійні лапки для коментарів, одинарні лапки для рядків тексту й спеціальний синтаксис для символів (наприклад, $x для символу «x»), які можуть збити з пантелику під час першого читання, адже ці конвенції відрізняються від тих, які використовують в інших мовах.
Є також поняття symbol. Це рядок тексту, унікальний у межах усієї памʼяті; тобто коли його створюють (зазвичай під час компіляції), виконується пошук у памʼяті, щоб зʼясувати, чи вже існує такий самий, і використовується лише оригінал. Причина не лише в економії памʼяті, а й у значному прискоренні порівняння symbol.
"this is a comment"
'this is a string'
#'this is a symbol'
#thisIsASymbolToo
У програмах Smalltalk також дуже мало ком, бо вони не відіграють жодної синтаксичної ролі.
Саме тому літерали масивів, наприклад, обходяться без ком; наприклад,
#(1 2 3 4 5)
Однак кома і сама є оператором, і ми помітимо це, коли зʼєднуємо два рядки тексту; наприклад,
'string1', 'string2'
Нарешті, варто знати, що рядки тексту й символи є різними класами. Рядок тексту є колекцією символів. Це може заскочити нас зненацька, коли ми перебираємо рядки тексту, бо можемо передати символи методу, який приймає рядки тексту. Розгляньмо...
(('hello' at: 2) = $e) inspect.
(('hello' at: 2) = 'e') inspect.
Потоки стають у пригоді для послідовного читання й запису. Вони роблять код чистішим, позбавляючи потреби збільшувати індекс на одиницю. Потоки працюють з будь-якою колекцією.
stream := WriteStream on: String new.
stream nextPut: $h ; nextPutAll: 'ell' ; nextPut: $o.
stream contents inspect
Зареєструйтеся на Exercism, щоб вивчати й опановувати Pharo, а також 50 вправ та справжнє наставництво від людей, і все це безкоштовно.
Дослідіть 14 різних способів перевернути рядок і низку тем, зокрема кодові точки Unicode, графеми, виділення памʼяті у стеку та купі і вказівники. Розслабтеся та насолоджуйтеся 45 хвилинами навчання разом із Джеремі та Еріком.