مكتبة Luton

مكتبة Luton

تمرين تعلّمي

مقدمة

Char هو نوع بيانات في Crystal يمثل نقطة ترميز يونيكود بعرض 32 بت. حجمها يجعلها موفّرة للذاكرة، ويمنحها خصائص معيّنة لا تملكها السلاسل النصية. وتُنشأ باستخدام علامات التنصيص المفردة (') وتسمح بوضع نقطة ترميز يونيكود واحدة فقط بداخلها.

'a' # => 'a'
'a'.class # => Char

من الشائع جدًا التعامل مع قيم Char عند العمل مع السلاسل النصية في Crystal، لأن عددًا لا بأس به من الطرق في صنف String تُرجع قيم Char أو تأخذ قيم Char كوسائط. فمثلًا، تُرجع الطريقة String#[] قيمة Char، كما تُرجع الطريقة String#chars مجموعة من قيم Char.

الزيادة والإنقاص

ولأن Char يمثل نقطة ترميز يونيكود بعرض 32 بت، فهو يدعم الزيادة والإنقاص، وهذا يعني أنه إذا كانت لديك القيمة 'a' يمكنك الحصول على 'b' بإضافة واحد إليها.

'a' + 5
# => 'f'

'z' - 25
# => 'a'

توجد أيضًا طريقة تُسمى Char#succ تُرجع المحرف التالي في جدول يونيكود، وChar#pred تُرجع المحرف السابق في جدول يونيكود.

'a'.succ
# => 'b'

'z'.pred
# => 'y'

الدمج

ولأن Char مخصص فقط لتمثيل نقطة ترميز يونيكود بعرض 32 بت، فلا يمكن دمج محرفين معًا. لذلك يمكن دمج Char مع السلاسل النصية فقط.

'a' + "bc"
# => "abc"

'a' + 'b'
# => error: expected argument #1 to 'Char#+' to be Int or String, not Char

طرق الخصائص

يمتلك Crystal بعض الطرق للحصول على معلومات عن المحرف، مثل ما إذا كان عددًا أم حرفًا، أو ما إذا كان بحروف صغيرة أم كبيرة. إليك قائمة ببعض هذه الطرق، وللاطلاع على القائمة الكاملة راجع واجهة API الخاصة بـ Char:

الطريقة الوصف
Char#number? تُرجع true إذا كان المحرف عددًا
Char#letter? تُرجع true إذا كان المحرف حرفًا
Char#lowercase? تُرجع true إذا كان المحرف بحروف صغيرة
Char#uppercase? تُرجع true إذا كان المحرف بحروف كبيرة
Char#ascii? تُرجع true إذا كان المحرف محرف ASCII
Char#whitespace? تُرجع true إذا كان المحرف مسافة بيضاء

التحويل

التحويل بين نقاط الترميز وقيم Char

ولأن Char يمثل نقطة ترميز يونيكود بعرض 32 بت، يمكنك التحويل بين قيم Char ونقاط الترميز (من النوع Int). يمكن القيام بذلك باستخدام الطريقة Char#ord التي تُرجع نقطة ترميز المحرف، أو الطريقة Int#chr التي تُرجع المحرف المقابل لنقطة الترميز.

'a'.ord
# => 97

97.chr
# => 'a'

التحويل بين الأنواع

وكما هو الحال مع أنواع البيانات الأخرى، يمتلك Char بعض الطرق للتحويل بين الأنواع. أكثرها شيوعًا هي الطريقة Char#to_s التي تحوّل المحرف إلى سلسلة نصية. غير أن هناك أيضًا الطريقة Char#to_i التي تحوّل المحرف إلى عدد صحيح، والطريقة Char#to_f التي تحوّل المحرف إلى عدد عشري.

'a'.to_s
# => "a"

'4'.to_i
# => 4

'a'.to_i
# => Error: Invalid integer: a (ArgumentError)

التعليمات

مكتبة لوتون مكتبة كبيرة تضم مجموعة واسعة من المؤلفات، تمتد من الكتب إلى الفنون. وللمكتبة قسم يدرس الأدب ويضيف الكتب إلى نظام الحاسوب.

تهدف بعض الأجزاء إلى أن تكون مؤتمتة، ويُطلب منك مساعدتهم في ذلك. ويشمل هذا مساعدتهم في أمور تتراوح من أتمتة نماذج عملية الإدراج إلى المساعدة في فك تشفير النصوص.

1. احصل على الحرف الأول من العنوان

يفترض أن تكون كتب المكتبة سهلة العثور عليها، لذا تُرتَّب حسب الحرف الأول من العنوان.

نفّذ طريقة Library.first_letter، التي تأخذ وسيطًا title يحمل عنوان الكتاب. ينبغي للطريقة أن تُرجع الحرف الأول من العنوان.

Library.first_letter("Mystery of the Crystal Skull")
# => 'M'

2. احصل على الأحرف الأولى للمؤلف

تضم المكتبة الكثير من الكتب التي كتبها مؤلفون مختلفون. غالبًا ما يُشار إلى المؤلفين بأحرفهم الأولى، لذا طلبت المكتبة نظامًا يعطي الأحرف الأولى للمؤلف عند إدخال اسمه الأول واسمه الأخير. ينبغي تنسيق الأحرف الأولى على هذا النحو: {first_letter_of_first_name}.{first_letter_of_last_name}

نفّذ طريقة Library.initials التي تأخذ وسيطين هما first_name وlast_name، ويحملان الاسم الأول والاسم الأخير للمؤلف. ينبغي للطريقة أن تُرجع الأحرف الأولى للمؤلف.

Library.initials("William", "Shakespeare")
# => "W.S"

3. فك تشفير الحرف

بعض المؤلفات مشفّرة، ولدى المكتبة الكثير من النصوص المشفّرة. وترغب المكتبة في نظام فك تشفير جديد لتشفير خاص.

يعمل التشفير بأخذ الحرف واستبداله بالحرف الذي يسبقه في الأبجدية. على سبيل المثال، يصبح a هو z، ويصبح b هو a، ويصبح c هو b، وهكذا.

وترغب المكتبة في أن يكون قادرًا على فك تشفير الأحرف الكبيرة والصغيرة مع الحفاظ على حالة الحرف الأصلي.

نفّذ طريقة Library.decrypt_character، التي تأخذ وسيطًا character يحمل الحرف المراد فك تشفيره. ينبغي للطريقة أن تُرجع الحرف المفكوك التشفير.

Library.decrypt_character('a')
# => 'z'

4. فك تشفير النص

وترغب المكتبة أيضًا في فك تشفير نص كامل، بالتشفير الذي يأخذ الحرف السابق في الأبجدية.

ينبغي لأداة فك التشفير أن تفك تشفير الأحرف فقط وتترك جميع الأحرف الأخرى كما هي.

نفّذ طريقة Library.decrypt_text، التي تأخذ وسيطًا text يحمل النص المراد فك تشفيره. ينبغي للطريقة أن تُرجع النص المفكوك التشفير.

Library.decrypt_text("Ifmmp Xpsme!")
# => "Hello World!"
تعديل عبر GitHub يفتح الرابط في نافذة أو علامة تبويب جديدة
Crystal Exercism

مستعد لبدء مكتبة Luton؟

سجّل في Exercism لتتعلّم وتتقن Crystal عبر 26 مفهومًا142 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.