كيفية إيجاد المعكوس الجمعي لكل رقم في JavaScript: حل تحدي CodeWars خطوة بخطوة
مقدمة: فهم فكرة المعكوس الجمعي في JavaScript
في هذا المقال سنشرح بطريقة عملية كيفية حل مسألة إيجاد المعكوس الجمعي لكل عنصر داخل مصفوفة أعداد في JavaScript، وهي من التحديات الشائعة على منصة CodeWars. الهدف ليس فقط الوصول إلى الحل، بل فهم منطق المسألة، وتحليل المدخلات والمخرجات، ثم كتابة خطوات شبه برمجية قبل الانتقال إلى التنفيذ الفعلي.
هذا الأسلوب يساعدك على كتابة كود أنظف، وفهم أعمق للمشكلة، وتجنّب الحلول العشوائية التي قد تنجح مؤقتاً دون بناء مهارة حقيقية.

قراءة وصف المسألة وفهم المطلوب
تنص المسألة على الآتي: لديك مجموعة من الأرقام، والمطلوب هو إعادة المعكوس الجمعي لكل رقم. أي أن الرقم الموجب يصبح سالباً، والرقم السالب يصبح موجباً. ويمكنك افتراض أن جميع القيم أعداد صحيحة. كما يُشترط عدم تعديل المصفوفة الأصلية.
لفهم هذا النوع من التحديات بشكل صحيح، من المفيد أن نطرح على أنفسنا بعض الأسئلة الأساسية:
- ما نوع المدخلات؟
- ما النتيجة المتوقعة؟
- هل نُعدّل المصفوفة الأصلية أم نُرجع مصفوفة جديدة؟
ما هي المدخلات؟
من وصف المسألة، نعرف أن الدالة ستستقبل مصفوفة من الأعداد الصحيحة. كما توضّح الأمثلة أن هذه القيم تأتي داخل Array.

بالتالي يمكننا صياغة المدخلات كالتالي:
- المدخل: مصفوفة من الأعداد الصحيحة.
- مثل:
[1, -2, 3, -4]
ما هي المخرجات؟
المطلوب إرجاع مصفوفة جديدة تحتوي على القيم نفسها بعد تحويل كل عنصر إلى معكوسه الجمعي.
مثلاً:
[2, 3, -4]تصبح[-2, -3, 4]
هذا يعني أن كل عنصر في المصفوفة يجب أن تتغير إشارته فقط، من دون المساس ببنية البيانات الأصلية.
أمثلة توضيحية على المدخلات والمخرجات
كتابة أمثلة إضافية تساعد كثيراً على تثبيت الفكرة قبل البرمجة.
// input
[2, 3, -4]
// output
[-2, -3, 4]
أمثلة أخرى:
[1, -1, 0]تصبح[-1, 1, 0][-10, 20, -30]تصبح[10, -20, 30]
لاحظ أن العدد 0 يبقى كما هو، لأن معكوسه الجمعي هو نفسه.
ما المقصود بالمعكوس الجمعي؟
في الرياضيات، المعكوس الجمعي لعدد ما هو العدد الذي إذا جمعناه معه كانت النتيجة صفراً.
على سبيل المثال:
- المعكوس الجمعي للعدد
10هو-10 - المعكوس الجمعي للعدد
-2هو2
ويمكن تمثيل ذلك كالتالي:
10 + (-10) = 0-2 + 2 = 0
وللحصول على المعكوس الجمعي لأي عدد، يكفي ضربه في -1.
أمثلة سريعة:
10 * -1 = -10-2 * -1 = 2
إذن، جوهر الحل يتمثل في المرور على عناصر المصفوفة وضرب كل عنصر في -1.
تفكيك المشكلة قبل كتابة الكود
قبل كتابة الحل مباشرة، من الأفضل تقسيم المسألة إلى خطوات واضحة. هذا الأسلوب يجعل الحل أسهل في الفهم والمراجعة.
لماذا نستخدم map()؟
نحتاج إلى تنفيذ عملية على كل عنصر داخل المصفوفة، ثم إرجاع مصفوفة جديدة تحتوي على النتائج. هنا تبرز أهمية الدالة map() في JavaScript.
تقوم map() بإنشاء مصفوفة جديدة عبر تطبيق دالة على كل عنصر من عناصر المصفوفة الأصلية، وهذا يتوافق تماماً مع شرط المسألة الذي يطلب عدم تعديل المدخلات الأصلية.
الخطوات شبه البرمجية Pseudocode
يمكننا كتابة الحل على شكل خطوات منطقية قبل تحويله إلى كود:
/*
step one: go through each number in the array using the map method
step two: multiply each number by -1
step three: return new array
*/
هذه الخطوات البسيطة توضّح المنهج كاملاً:
- المرور على كل عنصر في المصفوفة.
- تغيير إشارة العنصر عبر ضربه في
-1. - إرجاع مصفوفة جديدة تحتوي على النتائج.
الحل البرمجي في JavaScript
بعد فهم المطلوب وكتابة الخطوات، يمكننا الآن تحويل الفكرة إلى كود فعلي:
function invert(array) {
return array.map(num => {
return num * -1;
});
}
هذا الحل يعمل كالتالي:
- الدالة
invert()تستقبل مصفوفة اسمهاarray. - نستخدم
array.map()للمرور على كل عنصر. - كل عنصر
numيتم ضربه في-1. - يتم إرجاع مصفوفة جديدة بالقيم المعكوسة.
صياغة مختصرة وأنيقة للحل
يمكن كتابة الحل بشكل أكثر اختصاراً باستخدام الإرجاع الضمني داخل الدالة السهمية:
function invert(array) {
return array.map(num => num * -1);
}
هذا الإصدار يؤدي الوظيفة نفسها، لكنه أبسط بصرياً وأسهل في القراءة.
لماذا هذا الحل صحيح؟
الحل صحيح لأنه يحقق جميع شروط المسألة:
- يعالج كل عنصر في المصفوفة بشكل منفصل.
- يحوّل كل عدد إلى معكوسه الجمعي بدقة.
- لا يغيّر المصفوفة الأصلية، لأن
map()تُرجع مصفوفة جديدة. - يعمل بكفاءة مع الأعداد الموجبة والسالبة والصفر.
مقارنة سريعة بين النتيجة والمدخلات
| المدخل | العملية | المخرج |
|---|---|---|
2 |
2 * -1 |
-2 |
-3 |
-3 * -1 |
3 |
0 |
0 * -1 |
0 |
هذا يوضح أن الفكرة الأساسية ثابتة مع كل القيم.
نصائح مهمة لحل تحديات البرمجة المشابهة
- ابدأ دائماً بقراءة المسألة أكثر من مرة.
- حدّد نوع المدخلات والمخرجات بدقة.
- اكتب أمثلة بسيطة من عندك لتتأكد من فهمك.
- استخدم
Pseudocodeقبل الكود عندما تكون الفكرة غير واضحة. - اختر دوال المصفوفات المناسبة مثل
map()وfilter()وreduce()بحسب المطلوب.
الخلاصة التقنية
يُعد هذا التحدي مثالاً ممتازاً على أهمية فهم المسألة قبل كتابة الحل. استخدام map() هنا ليس مجرد اختيار نحوي جميل، بل قرار تقني مناسب لأنه يحافظ على المصفوفة الأصلية ويُنتج نسخة جديدة كما تتطلب المسألة. وإذا كنت تتعلم JavaScript، فإن مثل هذه التحديات تعلّمك كيف تربط بين المفاهيم الرياضية البسيطة وأدوات اللغة البرمجية بكفاءة ووضوح.