قلب السلاسل النصية (أي قراءتها من اليمين إلى اليسار بدلًا من قراءتها من اليسار إلى اليمين) مهمة شائعة على نحو مفاجئ في البرمجة.
على سبيل المثال، في المعلوماتية الحيوية يكون قلب تسلسل سلاسل DNA أو RNA مهمًا في كثير من الأحيان لتحليلات متنوعة، مثل إيجاد الخيوط المكمّلة أو تحديد المتتاليات المتناظرة ذات الأهمية البيولوجية.
مهمتك هي عكس سلسلة نصية معطاة.
بعض الأمثلة:
"stressed" إلى "desserts"."strops" إلى "sports"."racecar" إلى "racecar".مع أن هناك الطريقتين #reversed و#reverseDo: للسلاسل النصية، فهل يمكنك أن تكتشف بنفسك كيف تفعل ذلك باستخدام التكرار على المحارف عند مستوى أدنى والتدفقات؟
لمساعدتك على تصفح الكود، يوفّر Pharo أداة أنيقة للبحث في الكود. اضغط Shift-Enter لتفعيلها.
ملاحظة: اتبعنا اصطلاح Exercism في تسمية الحل ReverseString، لكن الاسم الأقرب إلى Smalltalk هو StringReverser.
فيما يخص السلاسل النصية، هناك بعض التفاصيل الصغيرة الواضحة مثل علامات التنصيص المزدوجة للتعليقات، وعلامات التنصيص المفردة للسلاسل النصية، وصياغة خاصة للمحارف (مثل $x للمحرف «x») قد تربكك عند القراءة الأولى، لأن هذه الاصطلاحات تختلف عن تلك المستخدمة في لغات أخرى.
وهناك أيضًا مفهوم الرمز، وهو سلسلة نصية فريدة على مستوى الذاكرة كلها؛ أي أنه عند إنشائه (عادةً في وقت الترجمة) يُجرى بحث في الذاكرة لمعرفة ما إذا كان هناك رمز آخر مثله، ولا يُستخدم إلا الأصل. والسبب في ذلك ليس توفير الذاكرة فحسب، بل تسريع كبير عند مقارنة الرموز.
"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 دقيقة من التعلّم مع Jeremy و Erik.