আজ বিশ্বের বেশিরভাগ মানুষ আরবি সংখ্যা (০–৯) ব্যবহার করে। কিন্তু আপনি যদি দুই হাজার বছর পিছিয়ে যেতেন, তাহলে দেখতে পেতেন যে বেশিরভাগ ইউরোপীয় বরং রোমান সংখ্যা ব্যবহার করছিলেন।
একটি রোমান সংখ্যা লিখতে আমরা নিচের লাতিন অক্ষরগুলো ব্যবহার করি, যার প্রত্যেকটির একটি মান আছে:
| M | D | C | L | X | V | I |
|---|---|---|---|---|---|---|
| 1000 | 500 | 100 | 50 | 10 | 5 | 1 |
একটি রোমান সংখ্যা হলো এই অক্ষরগুলোর একটি ক্রম, আর এর মান হলো অক্ষরগুলোর মানের যোগফল।
উদাহরণস্বরূপ, XVIII-এর মান ১৮ (10 + 5 + 1 + 1 + 1 = 18)।
তবে একটি নিয়ম বিষয়টা আরও জটিল করে তোলে, সেটি হলো একই অক্ষর পরপর তিনবারের বেশি ব্যবহার করা যাবে না।
এর মানে হলো, ৪-এর মতো সংখ্যা আপাতদৃষ্টিতে স্বাভাবিক লাগা IIII দিয়ে প্রকাশ করা যায় না।
তার বদলে ওই সংখ্যাগুলোর জন্য আমরা দুটি অক্ষরের মধ্যে বিয়োগ পদ্ধতি ব্যবহার করি।
তাই আমরা 4-কে 1 + 1 + 1 + 1 হিসেবে নয়, বরং 5 - 1 হিসেবে ভাবি।
আর আমাদের আধুনিক চিন্তাধারার কাছে একটু বিভ্রান্তিকর হলেও, আমরা ছোট সংখ্যাটি আগে লিখি।
এটি কেবল নিচের ক্ষেত্রগুলোতেই প্রযোজ্য: ৪ (IV), ৯ (IX), ৪০ (XL), ৯০ (XC), ৪০০ (CD) এবং ৯০০ (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 দিয়ে করা কিছু সহজ ফাঁকি।