Published
Edited
Sep 27, 2022
3 stars
A Nifty Algorithm for Converting Positive Integers to Roman Numerals
A Dead Simple Algorithm for Converting Positive Integers to Roman Numerals
Insert cell
Insert cell
R = {
BRUTE_FORCE: for (let n = 0; n < stop; n++) {
yield {
decimal: n,
Roman: romanizeNumber(n)
};
}
}
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
/**
* Convert positive integer to Roman numeral
*
* @param {number} n - integer in range [0, 3999]
* @return {string} Roman numeral with value n
*/
function romanizeNumber(n) {
if (n < 0 || n > 3999 || n % 1 !== 0) {
throw RangeError("Only positive integers between 0 and 3999 are allowed");
}

return Array(+n + 1)
.join("I")
.replace(/IIIII/g, "V")
.replace(/IIII/g, "IV")
.replace(/VV/g, "X")
.replace(/VIV/g, "IX")
.replace(/XXXXX/g, "L")
.replace(/XXXX/g, "XL")
.replace(/LL/g, "C")
.replace(/LXL/g, "XC")
.replace(/CCCCC/g, "D")
.replace(/CCCC/g, "CD")
.replace(/DD/g, "M")
.replace(/DCD/g, "CM");
}
Insert cell
deromanize = {
let symbols = { I: 1, V: 5, X: 10, L: 50, C: 100, D: 500, M: 1000 };

/**
* Convert Roman numeral to positive integer
*
* @param {string} $ - Roman numeral or empty string
* @return {number} integer in range [0, 3999]
*/
return function deromanize($) {
/* thank you, Jonathan Snook & Steven Levithan - mg */
if (
null ===
$.match(/^M{0,3}(?:D?C{0,3}|C[MD])(?:L?X{0,3}|X[CL])(?:V?I{0,3}|I[XV])$/i)
) {
throw Error("Only Roman numerals are allowed");
}
$ = $.toUpperCase().split("");
let number = 0;
while ($.length) {
let value = symbols[$.shift()];
number += value * (value < symbols[$[0]] ? -1 : 1);
}
return number;
};
}
Insert cell
// @example
deromanize(limit)
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell

Purpose-built for displays of data

Observable is your go-to platform for exploring data and creating expressive data visualizations. Use reactive JavaScript notebooks for prototyping and a collaborative canvas for visual data exploration and dashboard creation.
Learn more