Эльфы в восторге от новых технологий. Они убедили Санту все модернизировать. Они превращают тысячи бумажных документов в цифровые документы. Однако они поняли, что чем больше они возвращаются в прошлое, тем сложнее это сделать. Долго-долго эльфы использовали римскую систему счисления. Тот, у которого буквы вместо цифр. Теперь это все в арабской нумерации, с цифрами от 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. Подпишитесь на нашу бесплатную еженедельную рассылку здесь.