Треки
/
Pharo
Pharo
/
Вправи
/
Перевернутий рядок
Перевернутий рядок

Перевернутий рядок

Легка

Вступ

Обернення рядків тексту (англ. string) (читання їх справа наліво, а не зліва направо) є напрочуд поширеною задачею в програмуванні.

Наприклад, у біоінформатиці обернення послідовності рядків тексту ДНК або РНК часто важливе для різних аналізів, як-от пошук комплементарних ланцюгів або виявлення паліндромних послідовностей, що мають біологічне значення.

Вказівки

Переверніть заданий рядок тексту (англ. string).

Кілька прикладів:

  • Перетворіть "stressed" на "desserts".
  • Перетворіть "strops" на "sports".
  • Перетворіть "racecar" на "racecar".

Хоча для рядків тексту (англ. string) є методи #reversed і #reverseDo:, чи можемо ми самі розібратися, як зробити це за допомогою низькорівневої ітерації по символах і потоків?

Щоб допомогти нам переглядати код, Pharo має зручний інструмент пошуку коду. Натисніть Shift-Enter, щоб його активувати.

ПРИМІТКА: Ми дотрималися конвенції Exercism і назвали рішення ReverseString, проте назва, природніша для Smalltalk, була б StringReverser.

Smalltalk і рядки тексту

Що стосується рядків тексту, є кілька очевидних дрібниць: подвійні лапки для коментарів, одинарні лапки для рядків тексту й спеціальний синтаксис для символів (наприклад, $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.

Smalltalk і потоки

Потоки стають у пригоді для послідовного читання й запису. Вони роблять код чистішим, позбавляючи потреби збільшувати індекс на одиницю. Потоки працюють з будь-якою колекцією.

stream := WriteStream on: String new.
stream nextPut: $h ; nextPutAll: 'ell' ; nextPut: $o.
stream contents inspect
Редагувати через GitHub Посилання відкривається в новому вікні або вкладці
Pharo Exercism

Час розпочати Перевернутий рядок?

Зареєструйтеся на Exercism, щоб вивчати й опановувати Pharo, а також 50 вправ та справжнє наставництво від людей, і все це безкоштовно.

Глибоке занурення у Перевернутий рядок!

Дослідіть 14 різних способів перевернути рядок і низку тем, зокрема кодові точки Unicode, графеми, виділення памʼяті у стеку та купі і вказівники. Розслабтеся та насолоджуйтеся 45 хвилинами навчання разом із Джеремі та Еріком.