طريقة تحويل الأرقام الرومانية إلى الأرقام العربية

الأرقام الرومانية (Roman Numerals) تستخدم سبعة رموز فقط للتعبير عن الأعداد وهذه الرموز هي : I و V و X و L و C و  D و M. كل رمز من السبعة رموز هو عبارة عن حرف كبير من الحروف اللاتينية، وكل واحد فيهم يعبر عن قيمة معينة.

الرمز I يساوى 1
الرمز V يساوى 5
الرمز X  يساوي 10
الرمز L يساوي 50
الرمز C يساوي 100
الرمز D يساوي 500
الرمز M يساوي 1000

الرقم II في الأرقام الرومانية يعني واحد مضاف إلى واحد أي أن الرقم هو ٢
الرقم XII هو عبارة عن ١٠ + ١ + ١ أي أن الرقم النهائي هو ١١
وبذلك الرقم ٢٧ يكتب بالأرقام الرومانية XXVII

تُكتب الأرقام الرومانية من الأكبر إلى الأصغر من الشمال إلى اليمين. ولكن الرقم ٤ لا يكتب IIII ولكنه يكتب IV لأن الـ I سبق الـ V لذلك نطرحه منه وبذلك يصبح الرقم IV يساوي 4.

نفس فكرة طرح الأرقام تستخدم في كتابة الرقم ٩ حيث يكتب IX وبشكل عام هناك ٦ حالات تستخدم فيهم عملية الطرح لتكوين الأعداد.

١. استخدام الرمز I قبل الرمز V  أو الرمز X لكتابة الأرقام ٤ و ٩
٢. استخدام الرمز X قبل الرمز L أو الرمز C للدلالة على الأرقام  ٤٠ و ٩٠
٣. وضع الرمز C قبل الرمز D أو الرمز M لكتابة العدد ٤٠٠ أو العدد ٩٠٠

بعد أن فهمنا كيف تكتب الأرقام الرومانية، فلنبدأ في كتابة كود لتحويل الأرقام الرومانية إلى الأرقام العربية.

تحويل الأرقام الرومانية إلى العربية سهل ولكن النمط غير متكرر بشكل كامل لأن هناك حالات شاذة. الأرقام الأكبر ناحية اليسار والأصغر ناحية اليمين ونضيفهم لبعض لكي نحصل على القيمة الكلية للرقم. ولكن هناك ٦ حالات توجد بها الأرقام الأصغر علي اليسار ونقوم بطرح قيمتها من الرقم الذي علي اليمين مباشرةً وهذه الـ ٦ حالات هم سبب صعوبة التحويل.

يمكننا كتابة الكود بطريقة تجعلنا نعامل الحالات الشاذة للرمزين كأنهم رمز واحد له قيمه إجماليه ولكن هذه الطريقة ستجعل الكود كبير ومعقد والحالات الشرطية ستكون كثيرة ومتشعبه!

ماذا لو طرحنا فرق العمليتين؟ أى أن CMX هي في الحقيقة ٩١٠ ولكن إن حسبتها كأنها عملية جمع فقط دون النظر للحالة الشاذة CM فإن الناتج سيكون ١١١٠ ما هو فرق الخطأ؟ فرق الخطأ هو ٢٠٠

ماذا لو طرحنا ٢٠٠ عندما نجد CM في الرقم الروماني! أى أننا نجمع كل قيم الرموز الرومانية على بعضها ثم نطرح فرق الحالات الشاذة الستة من القيمة الإجمالية.

كيف سنكتب الكود؟
سنبدأ بإعطاء قيمة لكل رمز من رموز الأرقام الرومانية ثم نعلن متغير بأنه صفر. ثم نطرح فرق الدقة للحالات الشاذة إن كان هناك الحالة في الرقم. بعد إجراء الحالات الشرطية للأرقام الشاذة نقوم بإضافة قيم المتغيرات كلها للمتغير الذي أعلناه أنه يساوي صفر.

ما حدث هو أن المتغير number كان يساوي صفر، ثم إن وجدنا CM في الرقم الروماني نطرح ٢٠٠ من number وبذلك number يساوي -200 وبذلك عندما نقوم بجمع كل قيم الرموز على بعضها علي المتغير number سنجد أن الناتج دقيق لأن الفرق بين طرح وجمع الحالات الشاذة أخذناه في عين الإعتبار قبل إجراء الإضافة. وهذا هو كود تحويل الأرقام الرومانية إلى الأرقام العربية في لغة جافاسكربت.

var romanToInt = function(s) {
    var map = {
        'I': 1,
        'V': 5,
        'X': 10,
        'L': 50,
        'C': 100,
        'D': 500,
        'M': 1000
    }
    var number = 0;
    var index;
    if (s.indexOf('CM') != -1) number -= 200;
    if (s.indexOf('CD') != -1) number -= 200;
    if (s.indexOf('XC') != -1) number -= 20;
    if (s.indexOf('XL') != -1) number -= 20;
    if (s.indexOf('IX') != -1) number -= 2;
    if (s.indexOf('IV') != -1) number -= 2;
    for (let i=0; i<s.length; i++) {
        number += map[s[i]];
    }
    return number;
}

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

انتهينا من شرح طريقة تحويل الأرقام الرومانية إلى الأرقام العربية بالكود بلغة جافاسكربت، وأداة جاهزة لتحويل الأرقام. وإن أردت متابعة الموضوعات التقنية الجديدة اشترك بـ بريدك الإلكترونى من هنا.

0 comments:

إرسال تعليق