اليوم، يستخدم معظم الناس في العالم الأرقام العربية (0–9). لكن لو سافرت ألفي سنة إلى الوراء، لوجدت أن معظم الأوروبيين كانوا يستخدمون الأرقام الرومانية بدلًا منها.
لكتابة رقم روماني نستخدم الأحرف اللاتينية التالية، ولكل منها قيمة:
| M | D | C | L | X | V | I |
|---|---|---|---|---|---|---|
| 1000 | 500 | 100 | 50 | 10 | 5 | 1 |
الرقم الروماني هو تسلسل من هذه الأحرف، وقيمته مجموع قيم هذه الأحرف.
على سبيل المثال، قيمة XVIII هي 18 (10 + 5 + 1 + 1 + 1 = 18).
لكن هناك قاعدة واحدة تجعل الأمر أكثر صعوبة، وهي أنه لا يمكن استخدام الحرف نفسه أكثر من ثلاث مرات متتالية.
وهذا يعني أننا لا نستطيع التعبير عن أعداد مثل 4 بالكتابة IIII التي تبدو طبيعية.
بدلًا من ذلك، نستخدم في تلك الأعداد أسلوب طرح بين حرفين.
لذلك نفكّر في 4 لا على أنها 1 + 1 + 1 + 1 بل على أنها 5 - 1.
وبما يربك قليلًا تفكيرنا الحديث، نكتب العدد الأصغر أولًا.
وهذا ينطبق فقط في الحالات التالية: 4 (IV)، و9 (IX)، و40 (XL)، و90 (XC)، و400 (CD)، و900 (CM).
الترتيب مهم في الأرقام الرومانية! يجب ترتيب الأحرف (والتراكيب الخاصة أعلاه) تنازليًا حسب القيمة من اليسار إلى اليمين.
إليك بعض الأمثلة:
105 => CV
---- => --
100 => C
+ 5 => V
106 => CVI
---- => --
100 => C
+ 5 => V
+ 1 => I
104 => CIV
---- => ---
100 => C
+ 4 => IV
ومثال أخير أكثر تعقيدًا:
1996 => MCMXCVI
----- => -------
1000 => M
+ 900 => CM
+ 90 => XC
+ 5 => V
+ 1 => I
مهمتك هي تحويل عدد من الأرقام العربية إلى الأرقام الرومانية.
في هذا التمرين، لا نعنى إلا بالأرقام الرومانية التقليدية، التي يكون فيها أكبر عدد هو MMMCMXCIX (أو 3,999).
هناك طرق عديدة ومختلفة للتحويل بين الأرقام العربية والأرقام الرومانية. نوصي بأن تتبع أسلوبًا بسيطًا في البداية لتتعرف على مفهوم الأرقام الرومانية، ثم تبحث عن طرق أكثر كفاءة.
احرص على مشاهدة فيديو Deep Dive الخاص بنا في النهاية لاستكشاف الأساليب المختلفة التي يمكنك اتباعها!
في هذا التمرين، ستحتاج إلى دعم أسلوبين مختلفين لاستدعاء الكلمة stringify:
roman (مثال: stringify.roman 3999)roman (مثال: stringify 3999)لمزيد من المعلومات، اطّلع على توثيق السمات وكذلك توثيق attr.
بالإضافة إلى attr، فإن الدالة attrs مفيدة: فهي تُرجع كل سمات استدعاء الدالة على هيئة قاموس.
احذر، فهاتان الدالتان مُدمِّرتان!
يستخدم تطبيق Arturo "جدول سمات".
attrs الجدول صراحةً بعد استرجاع السمات.attr تحذف السمة من الجدول ("تقتلعها").مثال:
showAttributes: function [x][
print attr 'question
print attrs
print attrs
]
showAttributes .question:"6 * 9" .answer:42 'arg
فتُخرِج
6 * 9
[answer:42]
[]
في كل خطوة، نرى قاموس السمات يتقلّص.
الخلاصة: اعلم أنك لا تستطيع جلب السمات إلا مرة واحدة. إذا احتجت إلى الرجوع إلى السمات، فالتقطها في بداية دوالك.
سجّل في Exercism لتتعلّم وتتقن Arturo عبر 79 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.
استكشف مجموعة متنوعة من الحلول المختلفة لهذا التمرين الصعب، بدءًا من الاستدعاء الذاتي وصولًا إلى البحث المعتمد على الجداول، وحل يستفيد من الأعداد ذات الأساس المختلط، وبعض أساليب الغش المبسطة من Common Lisp.