আজ বিশ্বের বেশিরভাগ মানুষ আরবি সংখ্যা (০–৯) ব্যবহার করে। কিন্তু আপনি যদি দুই হাজার বছর পিছিয়ে যেতেন, তাহলে দেখতে পেতেন যে বেশিরভাগ ইউরোপীয় বরং রোমান সংখ্যা ব্যবহার করছিলেন।
একটি রোমান সংখ্যা লিখতে আমরা নিচের লাতিন অক্ষরগুলো ব্যবহার করি, যার প্রত্যেকটির একটি মান আছে:
| 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 ভিডিওটি দেখতে ভুলবেন না, যেখানে আপনি কোন কোন পদ্ধতি নিতে পারেন তা জানতে পারবেন!
একটু ভিন্ন কিছু করতে চাইলে আপনি unfold ফাংশন দিয়ে একটি সমাধানও করে দেখতে পারেন। foldLeft/Right সম্পর্কে আপনি নিশ্চয়ই আগে থেকেই জানেন: পুরো একটি কালেকশনকে অন্য কিছুতে "ম্যাপ" করা (সাধারণত একটি নন-কালেকশনে)। unfoldLeft/Right হলো এর "বিপরীত" অপারেশন: কোনো কিছুকে (সাধারণত একটি নন-কালেকশনকে) একটি কালেকশনে "ম্যাপ" করা। তাই unfold করা FP-এর প্রমিত রেপার্টোয়ারের একটি স্বাভাবিক সংযোজন এবং তারই একটি অংশ।
এই অনুশীলনীটিকে unfold করার একটি উদাহরণ হিসেবে দেখা যেতে পারে: একটি Int থেকে একটি String-এ "ম্যাপ" করা (যা অবশ্যই অন্তর্নিহিতভাবে একটি Seq[Char])।
দুর্ভাগ্যবশত Scala-র কালেকশন লাইব্রেরিতে unfoldLeft/Right নেই। তবে এখান থেকে ইমপ্লিমেন্টেশনটি নিয়ে নিতে পারেন।
Exercism-এ সাইন আপ করুন, Scala ট্র্যাকের 95টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।
এই কঠিন অনুশীলনীর নানা রকম সমাধান ঘুরে দেখুন, রিকার্সন থেকে টেবিল-ভিত্তিক লুকআপ পর্যন্ত, মিক্সড রেডিক্স সংখ্যা ব্যবহার করা একটি সমাধান, আর Common Lisp দিয়ে করা কিছু সহজ ফাঁকি।