Алгоритм конвертации чисел в римские цифры на JavaScript работает правильно, но не проходит автоматические тесты на FreeCodeCamp

Проблема с автоматическими тестами на FreeCodeCamp

Решаю задачи курса JavaScript на FreeCodeCamp. Написал функцию для преобразования обычных чисел в римские цифры. Когда проверяю свой код вручную через console.log, он выдает правильные результаты для всех тестовых случаев. Но автоматический тестер FreeCodeCamp почему-то говорит, что все тесты провалены.

Мой код:

// Преобразование числа в римские цифры
function numberToRoman() {
  let [value] = arguments;
  
  // Обрабатываем число от самых больших римских символов к самым маленьким
  if (value == 0) {
    return romanOutput;
  } else {
    // Начинаем с тысяч (M)
    if (value >= 1000) {
      let threshold = 1000;
      let quotient = value / threshold;
      processConversion(value, threshold, quotient, "M");
    } else if (value >= 900) {
      let threshold = 900;
      let quotient = value / threshold;
      processConversion(value, threshold, quotient, "CM");
    } else if (value >= 500) {
      let threshold = 500;
      let quotient = value / threshold;
      processConversion(value, threshold, quotient, "D");
    } else if (value >= 400) {
      let threshold = 400;
      let quotient = value / threshold;
      processConversion(value, threshold, quotient, "CD");
    } else if (value >= 100) {
      let threshold = 100;
      let quotient = value / threshold;
      processConversion(value, threshold, quotient, "C");
    } else if (value >= 90) {
      let threshold = 90;
      let quotient = value / threshold;
      processConversion(value, threshold, quotient, "XC");
    } else if (value >= 50) {
      let threshold = 50;
      let quotient = value / threshold;
      processConversion(value, threshold, quotient, "L");
    } else if (value >= 40) {
      let threshold = 40;
      let quotient = value / threshold;
      processConversion(value, threshold, quotient, "XL");
    } else if (value >= 10) {
      let threshold = 10;
      let quotient = value / threshold;
      processConversion(value, threshold, quotient, "X");
    } else if (value >= 9) {
      let threshold = 9;
      let quotient = value / threshold;
      processConversion(value, threshold, quotient, "IX");
    } else if (value >= 5) {
      let threshold = 5;
      let quotient = value / threshold;
      processConversion(value, threshold, quotient, "V");
    } else if (value >= 4) {
      let threshold = 4;
      let quotient = value / threshold;
      processConversion(value, threshold, quotient, "IV");
    } else if (value >= 1) {
      let threshold = 1;
      let quotient = value / threshold;
      processConversion(value, threshold, quotient, "I");
    }
  }
  return romanOutput;
}

function processConversion() {
  const [value, threshold, quotient, romanSymbol] = arguments;
  let integerPart = Math.trunc(quotient);
  let convertedRoman = "";
  
  for (let j = integerPart; j > 0; j--) {
    convertedRoman += romanSymbol;
  }
  
  romanOutput += convertedRoman;
  let fractionalPart = quotient - integerPart;
  if (fractionalPart > 0) {
    numberToRoman(value - (integerPart * threshold), romanOutput);
  }
}

let romanOutput = "";
console.log(numberToRoman(16));

Результаты тестов от FreeCodeCamp:

Все тесты показывают статус провала, хотя в консоли видно правильный результат XVI для числа 16. Не могу понять, в чем проблема. Может быть, дело в том, как я использую глобальную переменную или рекурсию?

Код логически правильный и выдает корректные римские цифры для всех проверенных случаев. Подскажите, что может быть не так с моим подходом?

Проблема в глобальной переменной romanOutput - она не сбрасывается между вызовами и накапливает результаты. Просто добавь romanOutput = "" в начало функции numberToRoman вместо объявления снаружи. Или еще лучше - убери глобальную переменную совсем и передавай результат через параметры.

У тебя рекурсия в processConversion сломана. Ты передаёшь numberToRoman(value - (integerPart * threshold), romanOutput) с двумя параметрами, а в самой функции numberToRoman берёшь только первый через деструктуризацию. Второй просто игнорируется. Ещё проблема — глобальная romanOutput не очищается при новом вызове, поэтому результаты склеиваются. Добавь romanOutput = "" в начало функции numberToRoman.

Проблема в arguments - это устаревший подход и глючит. Замени на обычные параметры function numberToRoman(value) и function processConversion(value, threshold, quotient, romanSymbol). И убери глобальную переменную - возвращай результат через return, автотесты будут работать стабильнее.