आज दुनिया में अधिकांश लोग अरबी अंक (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)अधिक जानकारी के लिए attributes डॉक्यूमेंटेशन और attr डॉक्यूमेंटेशन देखिए।
attr के अलावा attrs फंक्शन भी काम का है: यह फंक्शन कॉल के सारे एट्रिब्यूट एक डिक्शनरी के रूप में लौटाता है।
ध्यान रखिए कि ये दोनों फंक्शन डेस्ट्रक्टिव हैं!
Arturo का इम्प्लीमेंटेशन एक "attributes table" इस्तेमाल करता है।
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 की थोड़ी-सी सीधी चीटिंग भी।