
Эльфы в восторге от новых технологий. Они убедили Санту все модернизировать. Они превращают тысячи бумажных документов в цифровые документы. Однако они поняли, что чем больше они возвращаются в прошлое, тем сложнее это сделать. Долго-долго эльфы использовали римскую систему счисления. Тот, у которого буквы вместо цифр. Теперь это все в арабской нумерации, с цифрами от 0 до 9. Как быстрее всего преобразовать римскую цифру в арабскую?
Головоломка: Преобразование чисел 🏛️

Преобразование римских цифр в десятичные — непростая задача. Невозможно использовать собственные методы JavaScript: мы должны сами создать специальную функцию. Кроме того, латинская нумерация основана на сгруппированных буквах. Значение буквы варьируется в зависимости от букв, которые следуют за ней или предшествуют ей.
Например, буква I обозначает цифру 1. Буква V обозначает число 5. Мы можем комбинировать эти два символа двумя разными способами: IV и VI. В нашей системе счисления они стали бы 15 и 51. Но это не так. Потому что I перед V означает minus 1 to 5 или 4. Вместо этого I после V означает 5 plus 1 или 6.
Преобразование римских цифр в десятичные числа
Таким образом, преобразование римских цифр в арабские требует двух типов операций. Сначала я анализирую положение отдельных букв строки. Затем я извлекаю отдельные значения и складываю их.
Чтобы решить эту головоломку, я использовал обсуждение, опубликованное несколько лет назад на StackOverflow. В комментариях представлено множество возможных решений. Начиная оттуда, я написал свое решение:
Как это работает?
Сначала я определяю объект с римскими цифрами как свойство. Значением каждого свойства является значение буквы:
Затем я беру число для преобразования, которое будет строкой, и преобразовываю его в массив, содержащий символы:
Сначала я превращаю все содержимое в символы верхнего регистра; таким образом я могу упростить последующий анализ.
Для перебора всех букв я использую метод Array.prototype.reduce(). В отличие от других случаев, я использую его расширенную форму:
Что я хочу сделать, так это сравнить значение, которое я анализирую, с тем, которое следует за ним:
Я беру этот номер в качестве примера: ["M","X","X","I","V"].
С index = 0 условие становится:
Следующий:
Что мне теперь делать?
Теперь мне нужно вычислить значение, которое указывает этот символ.
Поэтому, если следующее значение больше предыдущего, мы должны вычесть текущее значение из общего числа:
Наоборот, если следующее значение меньше, я могу добавить его к сумме:
Если я выполняю все шаги последовательно, я получаю:

Небольшое замечание к гифке. Чтобы отложить выполнение кода в JavaScript, я использовал функцию sleep():
Преобразование арабских цифр в римские
В этот момент я задумался, как сделать наоборот. Затем я искал, как преобразовать десятичное число в римские цифры. Я нашел интересную статью Carlos da Costa, объясняющую, как это сделать. Я немного изменил его код, пытаясь его упростить. Это мой метод:
Хотя я надеюсь, что эльфы не решат перевести все из арабских чисел обратно в десятичные числа.
Спасибо за прочтение! Оставайтесь с нами, чтобы узнать больше.
Не пропустите мою следующую статью — подпишитесь на мой Список адресов электронной почты среднего уровня
Первоначально опубликовано на https://blog.stranianelli.com 14 декабря 2021 г.
Больше контента на plainenglish.io. Подпишитесь на нашу бесплатную еженедельную рассылку здесь.