43 lines
869 B
JavaScript
43 lines
869 B
JavaScript
(() => {
|
|
"use strict";
|
|
|
|
// ------------- ROMAN NUMERALS DECODED --------------
|
|
|
|
// Folding from right to left,
|
|
// lower leftward characters are subtracted,
|
|
// others are added.
|
|
|
|
// fromRoman :: String -> Int
|
|
const fromRoman = s =>
|
|
[...s]
|
|
.map(glyphValue)
|
|
.reduceRight(
|
|
([r, n], l) => [
|
|
l,
|
|
l >= r
|
|
? n + l
|
|
: n - l
|
|
],
|
|
[0, 0]
|
|
)[1];
|
|
|
|
|
|
// glyphValue :: Char -> Maybe Int
|
|
const glyphValue = k => ({
|
|
I: 1,
|
|
V: 5,
|
|
X: 10,
|
|
L: 50,
|
|
C: 100,
|
|
D: 500,
|
|
M: 1000
|
|
}) [k] || 0;
|
|
|
|
// ---------------------- TEST -----------------------
|
|
return [
|
|
"MDCLXVI", "MCMXC", "MMVIII", "MMXVI", "MMXVII"
|
|
]
|
|
.map(fromRoman)
|
|
.join("\n");
|
|
})();
|