Data update
This commit is contained in:
parent
29a5eea0d4
commit
5c1bb7bfa9
2011 changed files with 35081 additions and 3229 deletions
|
|
@ -1,6 +1,7 @@
|
|||
(() => {
|
||||
"use strict";
|
||||
|
||||
// -------------- ROMAN NUMERALS DECODED ---------------
|
||||
// ------------- ROMAN NUMERALS DECODED --------------
|
||||
|
||||
// Folding from right to left,
|
||||
// lower leftward characters are subtracted,
|
||||
|
|
@ -8,49 +9,34 @@
|
|||
|
||||
// fromRoman :: String -> Int
|
||||
const fromRoman = s =>
|
||||
foldr(l => ([r, n]) => [
|
||||
l,
|
||||
l >= r ? (
|
||||
n + l
|
||||
) : n - l
|
||||
])([0, 0])(
|
||||
[...s].map(charVal)
|
||||
[...s]
|
||||
.map(glyphValue)
|
||||
.reduceRight(
|
||||
([r, n], l) => [
|
||||
l,
|
||||
l >= r
|
||||
? n + l
|
||||
: n - l
|
||||
],
|
||||
[0, 0]
|
||||
)[1];
|
||||
|
||||
// charVal :: Char -> Maybe Int
|
||||
const charVal = k => {
|
||||
const v = {
|
||||
I: 1,
|
||||
V: 5,
|
||||
X: 10,
|
||||
L: 50,
|
||||
C: 100,
|
||||
D: 500,
|
||||
M: 1000
|
||||
} [k];
|
||||
return v !== undefined ? v : 0;
|
||||
};
|
||||
|
||||
// ----------------------- TEST ------------------------
|
||||
const main = () => [
|
||||
'MDCLXVI', 'MCMXC', 'MMVIII', 'MMXVI', 'MMXVII'
|
||||
]
|
||||
.map(fromRoman)
|
||||
.join('\n');
|
||||
// glyphValue :: Char -> Maybe Int
|
||||
const glyphValue = k => ({
|
||||
I: 1,
|
||||
V: 5,
|
||||
X: 10,
|
||||
L: 50,
|
||||
C: 100,
|
||||
D: 500,
|
||||
M: 1000
|
||||
}) [k] || 0;
|
||||
|
||||
|
||||
// ----------------- GENERIC FUNCTIONS -----------------
|
||||
|
||||
// foldr :: (a -> b -> b) -> b -> [a] -> b
|
||||
const foldr = f =>
|
||||
// Note that that the Haskell signature of foldr
|
||||
// differs from that of foldl - the positions of
|
||||
// accumulator and current value are reversed.
|
||||
a => xs => [...xs].reduceRight(
|
||||
(a, x) => f(x)(a),
|
||||
a
|
||||
);
|
||||
|
||||
// MAIN ---
|
||||
return main();
|
||||
// ---------------------- TEST -----------------------
|
||||
return [
|
||||
"MDCLXVI", "MCMXC", "MMVIII", "MMXVI", "MMXVII"
|
||||
]
|
||||
.map(fromRoman)
|
||||
.join("\n");
|
||||
})();
|
||||
|
|
|
|||
|
|
@ -0,0 +1,39 @@
|
|||
function Rim2Arab(S : String) : Integer;
|
||||
const //римские числа на соответствующие десятичные числа
|
||||
R : array[1..14] of String[2] = ('M','CM','D','CD','C','XC','L','XL','X','IX','V','IV','I',' ');
|
||||
A : array[1..14] of Integer = (1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1, 0);
|
||||
begin
|
||||
var i := 1;
|
||||
Result := 0;
|
||||
while S.Length > 0 do
|
||||
begin
|
||||
while S.IndexOf(R[i]) = 0 do
|
||||
begin
|
||||
S := S.Remove(0, R[i].Length);
|
||||
Result += A[i]
|
||||
end;
|
||||
i += 1;
|
||||
end;
|
||||
end;
|
||||
|
||||
const
|
||||
L = 'IVXLCDM';
|
||||
begin
|
||||
var S := 'MDCLXVI';//'roman numeral:';
|
||||
Write(S,': ');
|
||||
var index := 1;
|
||||
repeat
|
||||
if L.IndexOf(S[index]) < 0 then
|
||||
index += 1
|
||||
else
|
||||
begin
|
||||
var Rim : String := '';
|
||||
repeat
|
||||
Rim += S[index];
|
||||
S := S.Remove(index - 1, 1);
|
||||
until (S.Length < index) or (L.IndexOf(S[index]) < 0);
|
||||
S := S.Insert(index - 1, Rim2Arab(Rim).ToString);
|
||||
end;
|
||||
until index > S.Length;
|
||||
WriteLn(S);
|
||||
end.
|
||||
Loading…
Add table
Add a link
Reference in a new issue