امروزه بیشتر مردم جهان از اعداد عربی (۰ تا ۹) استفاده میکنند. اما اگر دو هزار سال به عقب برگردید، میبینید که بیشتر اروپاییها بهجای آن از اعداد رومی استفاده میکردند.
برای نوشتن یک عدد رومی از حروف لاتین زیر استفاده میکنیم که هر کدام یک مقدار دارند:
| M | D | C | L | X | V | I |
|---|---|---|---|---|---|---|
| ۱۰۰۰ | ۵۰۰ | ۱۰۰ | ۵۰ | ۱۰ | ۵ | ۱ |
یک عدد رومی دنبالهای از این حروف است و مقدارش برابر با مجموع مقدارهای آن حروف است.
برای نمونه، 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 (یا ۳٬۹۹۹) است.
راههای مختلف زیادی برای تبدیل بین اعداد عربی و رومی وجود دارد. توصیه میکنیم ابتدا یک رویکرد ساده را در پیش بگیرید تا با مفهوم اعداد رومی آشنا شوید و سپس به دنبال روشهای کارآمدتر بگردید.
حتماً ویدیوی «Deep Dive» ما را در انتها ببینید تا با رویکردهای مختلفی که میتوانید در پیش بگیرید آشنا شوید!
در Exercism ثبتنام کنید تا Groovy را همراه با 66 تمرین و مربیگری انسانی واقعی یاد بگیرید و در آن استاد شوید، همهی اینها رایگان.
راهحلهای متنوعی برای این تمرین دشوار را بررسی کنید؛ از بازگشت تا جستوجوهای مبتنی بر جدول، راهحلی که از اعداد با مبنای مختلط بهره میبرد و مقداری تقلب سادهلوحانه از سوی Common Lisp.