Написать js-программу для создания функции map_armstrong

#javascript

#javascript

Вопрос:

Создайте функцию с двумя параметрами pre_map и arr. Где pre_map будет встроенной картой, предоставленной вам в наших тестовых примерах, а arr будет массивом чисел. Для каждого элемента из заданного массива ваша функция должна проверять, существует ли этот элемент в вашем заданном pre_map в качестве одного из его ключей или нет.

  • например:
    • pre_map { 0 => true, 1 => true, 10 => false, 19 => false, 370 => true }
    • arr [10, 407]
  • Если она существует, то delete она из pre_map
    • например:
      • pre_map { 0 => true, 1 => true, 19 => false, 370 => true }
  • в противном случае, add a new key в этом заданном pre_map, где его значением будет логическое значение как или true или false в зависимости от того, является ли этот ключ an armstrong number или нет. (Помните номера Armstrong из вашего предыдущего репозитория?)
    • например:
      • pre_map { 0 => true, 1 => true, 19 => false, 370 => true, 407 => true}
  • Затем верните обновленную карту (pre_map)

 function task09(pre_map, arr) {
  let obj = Object.fromEntries(pre_map);
  function isArmstrong(number) {
    if (number < 0) {
      return false;
    }
    let num_to_str = number.toString();
    let sum = 0;
    for (let i = 0; i < num_to_str.length; i  ) {
      let num = parseInt(num_to_str[i]);
      sum  = Math.pow(num, num_to_str.length);
    }
    return (number == sum);
  }
  for (let i = 0; i < arr.length; i  ) {
    let entry = arr[i].toString();
    if (obj.entry !== undefined) {
      delete obj.entry;
    } else {
      obj.entry = isArmstrong(parseInt(entry));
    }
  }
  return new Map(Object.entries(obj));
}  

Что не так с моим кодом и почему он не проходит некоторые тестовые примеры.

Комментарии:

1. Я думаю, что проблема в вашей isArmstrong() функции. Число Армстронга — это » число, равное сумме кубов его цифр «, поэтому вы должны заменить sum = Math.pow(num, num_to_str.length); на sum = Math.pow(num, 3);

2. спасибо, я внес изменения, но они все еще не проходят тестовые примеры.

Ответ №1:

[РЕДАКТИРОВАТЬ: поскольку из требований неясно, следует ли изменять исходную карту напрямую или нет, я добавляю второе решение]

Решение 1 (исходная карта изменяется напрямую):

 function task09(pre_map, arr) {
  function isArmstrong(num) {
    if (num < 0) return false;
    
    const numToStr = num.toString();
    let sum = 0;

    for (let i = 0; i < numToStr.length; i  ) {
      sum  = Math.pow(parseInt(numToStr[i]), 3);
    }

    return num === sum;
  }

  arr.forEach(item => {
    if (pre_map.has(item)) {
      pre_map.delete(item);
    } else {
      pre_map.set(item, isArmstrong(item));
    }
  });
  
  return pre_map;
}


/********
 * test *
 ********/

const myMap = new Map();
myMap.set(0, true);
myMap.set(1, true);
myMap.set(10, false);
myMap.set(19, false);
myMap.set(370, true);

const myArr = [10, 407];

console.log('myArr:', myArr);
console.log('myMap (before):');
for (let item of myMap) {
  console.log(item);
}

task09(myMap, myArr);

console.log('myMap (after):');
for (let item of myMap) {
  console.log(item);
}  

Решение 2 (исходная карта НЕ изменяется):

 function task09(pre_map, arr) {
  const post_map = new Map(pre_map);

  function isArmstrong(num) {
    if (num < 0) return false;

    const numToStr = num.toString();
    let sum = 0;

    for (let i = 0; i < numToStr.length; i  ) {
      sum  = Math.pow(parseInt(numToStr[i]), 3);
    }

    return num === sum;
  }

  arr.forEach(item => {
    if (post_map.has(item)) {
      post_map.delete(item);
    } else {
      post_map.set(item, isArmstrong(item));
    }
  });

  return post_map;
}


/********
 * test *
 ********/

const myMap = new Map();
myMap.set(0, true);
myMap.set(1, true);
myMap.set(10, false);
myMap.set(19, false);
myMap.set(370, true);

const myArr = [10, 407];

const myUpdatedMap = task09(myMap, myArr);

console.log('myArr:', myArr);
console.log('myMap:');
for (let item of myMap) {
  console.log(item);
}
console.log('myUpdatedMap:');
for (let item of myUpdatedMap) {
  console.log(item);
}