المسارات
/
Cairo
Cairo
/
التمارين
/
ساحر متدرّب
ساحر متدرّب

ساحر متدرّب

تمرين تعلّمي

مقدمة

المصفوفات

توفّر مكتبة Cairo الأساسية نوع Array.

وهو مشابه لأنواع المصفوفات المعتادة في لغات البرمجة الأخرى، لكن مع بعض الاختلافات الجوهرية:

  • يمكن إضافة العناصر بكفاءة إلى مؤخرة نوع Array فقط، ولا يمكن إزالتها بكفاءة إلا من مقدمته.
  • من المستحيل تعيين عنصر يدويًا باستخدام فهرس المصفوفة.

يمكن إنشاء المصفوفات باستخدام دالة ArrayTrait::new وكذلك ماكرو array!:

let empty: Array<u32> = ArrayTrait::new();
let one_to_four = array![1, 2, 3, 4];

يمكن إضافة عناصر إلى المصفوفة باستخدام دالة ArrayTrait::append:

let mut num_array = array![1, 2, 3, 4];
num_array.append(5);
// -> [1, 2, 3, 4, 5]

يمكن إزالة عناصر من المصفوفة باستخدام دالة ArrayTrait::pop_front:

let mut one_to_four = array![1, 2, 3, 4];

one_to_four.pop_front();
// -> [2, 3, 4]

تقدّم Cairo أيضًا نوع Span يتصرّف كلقطة من Array.

يمكن تحويل كل Array إلى Span باستخدام دالة ToSpanTrait::span:

let one_to_four = array![1, 2, 3, 4];
let one_to_four_span = one_to_four.span();
// -> [1, 2, 3, 4]

تحويل مصفوفة إلى Span فعّال جدًا، لأن Span مجرد بنية بيانات تتيح لـ Cairo أن «يطّلع» على قسم من المصفوفة، ولا تعدّلها بأي شكل.

وبتحويل مصفوفة إلى Span، تتيح Cairo تنفيذ عمليات أكثر مما هو مسموح به على Array مباشرة، مثل إزالة عنصر من مقدمة Span.

let one_to_four = array![1, 2, 3, 4];
let mut one_to_four_span = one_to_four.span();
one_to_four_span.pop_back();
// -> [2, 3, 4]

لاحظ أننا اضطررنا إلى جعل one_to_four_span قابلًا للتغيير باستخدام الكلمة المفتاحية mut حتى نستدعي pop_back، وهو ما يعدّل الـ Span عبر تقصير القسم الذي «يطّلع» عليه من المصفوفة.

التعليمات

بصفتها ساحرةً مبتدئة، تحتاج Elyse إلى التدرّب على بعض الأساسيات.

لديها مكدس من البطاقات تريد التلاعب به.

ولتسهيل الأمور قليلًا، تستخدم البطاقات من 1 إلى 10 فقط.

يمثّل مكدس البطاقات قيمة من نوع Array، بحيث يكون أسفل المكدس في مقدمة المصفوفة، وأعلى المكدس في نهايتها.

1. أدخل بطاقة في أعلى المكدس

نفّذ الدالة insert_top التي تُرجع نسخة من المكدس بعد إضافة البطاقة الجديدة المعطاة إلى أعلى المكدس.

let stack = array![5, 9, 7, 1];
insert_top(stack, 8);
// -> [5, 9, 7, 1, 8]

2. أزل البطاقة العلوية من المكدس

نفّذ الدالة remove_top_card التي تُرجع نسخة من المكدس بعد إزالة بطاقته العلوية.

إذا كان المكدس المعطى فارغًا، فيجب إرجاع المكدس الأصلي دون تغيير.

let stack = array![3, 2, 6, 4, 8];
remove_top_card(stack);
// -> [3, 2, 6, 4]

3. أدخل بطاقة في أسفل المكدس

نفّذ الدالة insert_bottom التي تُرجع نسخة من المكدس بعد إضافة البطاقة الجديدة المعطاة إلى أسفل المكدس.

let stack = array![5, 9, 7, 1];
insert_bottom(stack, 8);
// -> [8, 5, 9, 7, 1]

4. أزل بطاقة من أسفل المكدس

نفّذ الدالة remove_bottom_card التي تُرجع نسخة من المكدس بعد إزالة بطاقته السفلية.

إذا كان المكدس المعطى فارغًا، فيجب إرجاع المكدس الأصلي دون تغيير.

let stack = array![8, 5, 9, 7, 1];
remove_bottom_card(stack);
// -> [5, 9, 7, 1]

5. تحقّق من حجم المكدس

نفّذ الدالة check_size_of_stack التي تتحقق مما إذا كان حجم المكدس يساوي قيمة stack_size المعطاة أم لا.

let stack = array![3, 2, 6, 4, 8];
check_size_of_stack(stack, 4);
// -> false

لفهم سبب كون التعامل مع المصفوفات في Cairo ليس بالأمر البسيط كما في لغات البرمجة الأخرى، من المفيد أن تضع في اعتبارك أن Cairo يستخدم نموذج ذاكرة غير قابل للتغيير، أي أنه بمجرد الكتابة في خلية ذاكرة، لا يمكن الكتابة فوقها أبدًا، بل القراءة منها فقط.

تخفي اللغة هذه الميزة إلى حد ما، إذ تسمح للمطورين بتعريف متغيراتهم واستخدامها كما لو كانت قابلة للتغيير.

وعلى الرغم من أن هذا يجعل كتابة الكود أكثر صعوبة بعض الشيء، لا سيما الكود الذي يستخدم نوع Array (بما في ذلك ByteArray، وهو في حقيقته «مصفوفة من البايتات»)، فإنه يتيح كتابة برامج قابلة للإثبات يمكن تنفيذها بثقة حتى على أجهزة غير موثوقة، مما يجعل هذه المقايضة تستحق كل ذلك.

تعديل عبر GitHub يفتح الرابط في نافذة أو علامة تبويب جديدة
Cairo Exercism

مستعد لبدء ساحر متدرّب؟

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