Алгоритм перевода арабские цифр в римские, без if

1,00
р.
Придумал алгоритм перевода арабских в римские без условий if. Аналогов в интернете не нашёл. Как вам такой вариант?


function myFunction()
{
let r = [["I","V"],["X","L"],["C","D"],["M",""]]
let f = [[],[[0,1,0]],[[0,2,0]],[[0,3,0]],[[0,1,1],[0,1,0]],[[0,1,1]],
[[0,1,0],[0,1,1]],[[0,2,0],[0,1,1]],[[0,3,0],[0,1,1]],[[1,1,0],[0,1,0]]]
let num = document.getElementById("num").value let rim = ""

String(num).split("").reverse().forEach((element, i) =>
f[element].forEach((d) =>
rim = rim.concat (r[i+d[0]][d[2]].repeat(d[1]))))

console.log(rim.split("").reverse().join(""))
} Перевод арабские в римские

Перевод


Ответ
let num = "927"
Вся концепция алгоритма строится на том, что если число разбить на порядки, то для каждого числа в отдельном порядке будет одна и так же формула подстановки из арабского числа в римские.
Так, для числа 927, мы получает 9 - третьего порядка, 2 - второго порядка, 7 первого порядка.
let m = [ ["I","V"], // 1 порядок ["X","L"], // 2 порядок ["C","D"], // 3 порядок ["M",""]] // 4 порядок
Далее, если взять любое число из любого порядка, для 927 это 9 или 2 или 7, или для любого числа от 1 до 9, то можно написать универсальные формулы
Точнее 9 универсальных формул:
где P - порядок числа, r - повтор (сколько раз этот символ нужно повторить), и M - место в массиве порядка первое или второе
Тогда формулы чисел можно представить как:
1 - P.r(1).M(1) 2 - P.r(2).M(1) 3 - P.r(3).M(1) 4 - P.r(1).M(1) + P.r(1).M(2) 5 - P.r(1).M(2) 6 - P.r(1).M(2) + P.r(1).M(1) 7 - P.r(1).M(2) + P.r(2).M(1) 8 - P.r(1).M(2) + P.r(3).M(1) 9 - P.r(1).M(1) + P+1.r(1).M(1)
Наше число 927 преобразуется по формулам
9 (P=3) : P.r(1).M(1) + P+1.r(1).M(1), , состоит из двух частей 1 часть: P.r(1).M(1), где P=3: ["C","D"], место 1, повторов 1. Значит: C 2 часть: P+1.r(1).M(1), где P=4 (так как P+1): ["M",""], место 1, повторов 1, значит: M
2 (P=2) : P.r(2).M(1), где P=2: ["X","L"], место 1, повторов 2, значит: ХХ
7:(P=1) : P.r(1).M(2) + P.r(2).M(1), состоит из двух частей 1 часть: P.r(1).M(2), где P=1: ["I","V"], место 2, повторов 1. Значит: V 2 часть: P.r(2).M(1), где P=1: ["I","V"], место 1, повторов 2, значит: II
И теперь эти формулы можно зашить в массив для каждого числа. Например для числа 6 - это 6 элемент массива f
[0,1,0], [0,1,1]
То есть два элемента Где каждая часть - это формула для набора символов
Первый символ: [0,1,0]
3 элемента:
1 - порядок 2 - количество повторов символа 3 - место в массиве "m" к примеру: ["X","L"] - 1 или 2 место
Сама формула работает так:
разбиваем число на массив из символов 927 -> [9,2,7] делаем реверс [9,2,7]->[7,2,9], так как первый порядок актуален для первого элемента В цикле берём отдельное число 9, 2 или 7, по этому числу берём формулу в массиве f, и разбираем вторым циклом группу формул, чтобы взять отдельный блок формулы (например [0,1,0]), и уже этот блок нам скажет какой символ брать из массив "m", его место и количество повторов num.split("").reverse().forEach((e, i) => f[e].forEach((d) => r = r.concat (m[i+d[0]][d[2]].repeat(d[1]))))
собираем в обратном порядке строку и выводим результат. alert (r.split("").reverse().join(""))

Ну и неминифицированная формула
num.split("").reverse().forEach((element, i) => { // element - элемент из числа 9 2 или 7 formula = f[element] // для числа 7 = [[0,2,0],[0,1,1]] // тут 2 элемента массива по 3 числа, теперь нужно перебрать их
formula.forEach((d) => { // первый элемент для числа 7 - [0,2,0] // вытащим 3 элемента poradok = d[0] // 0 povtor = d[1] // 2 mesto = d[2] // 0
simbolMas = m[i+poradok] // ["I","V"] findsimbol = simbolMas[mesto] // "I" simbolRepeat = findsimbol.repeat(povtor) // "II" r = r.concat ( simbolRepeat ) // собираем строчку }) })