sumDigPow.js

Codewars 알고리즘 풀이


Problem

  • The number 89 is the first integer with more than one digit that fulfills the property partially introduced in the title of this kata.
    • 숫자 89는 이 kata를 충족시키는 두 자리 이상의 첫 번째 정수이다.
  • The next number in having this property is 135.
    • 이 속성을 가지는 다음 숫자는 135이다.
For example:

89 = 8^1 + 9^2

135 = 1^1 + 3^2 + 5^3


  • We need a function to collect these numbers, that may receive two integers ‘a’, ‘b’ that defines the range ‘[a, b]’ and outputs a list of the sorted numbers in the range that fulfills the property described above.
    • 이러한 숫자를 수집하는 함수를 작성한다.
    • ’[a, b]’ 범위를 정의하는 두 개의 정수 ‘a’, ‘b’를 사용한다.



Solution 01

function sumDigPow(a, b) {
  let result = [];
  
  for (let i = a; i <= b; i++) {
    let arr = i.toString().split('');
    let sum = 0;
    
    for (let j = 0; j <= arr.length; j++) {
      sum += Math.pow(arr[j], j + 1);
      
      if (sum === i) {
        result.push(i);
      }
    }
  }
  return result;
}

sumDigPow(1, 10);     // [1, 2, 3, 4, 5, 6, 7, 8, 9]
sumDigPow(1, 100);    // [1, 2, 3, 4, 5, 6, 7, 8, 9, 89]
sumDigPow(10, 100);   // [89]
sumDigPow(100, 150);  // [89, 135]


Solution 02

function sumDigPow(a, b) {
  const eurekas = [1, 2, 3, 4, 5, 6, 7, 8, 9, 89, 135, 175, 518, 598, 1306, 1676, 2427, 2646798];
  return eurekas.filter(i => a <= i && i <= b);
}

sumDigPow(1, 10);     // [1, 2, 3, 4, 5, 6, 7, 8, 9]
sumDigPow(1, 100);    // [1, 2, 3, 4, 5, 6, 7, 8, 9, 89]
sumDigPow(10, 100);   // [89]
sumDigPow(100, 150);  // [89, 135]


Solution 03

function sumDigPow(a, b) {
  let result = [];
  
  for (let i = a; i <= b; i++) {
    if (i === i.toString().split('').map((item, index) => {
        return Math.pow(+item, index + 1);
      }).reduce((a, b) => {
        return a + b;
      })
    ) {
      result.push(i);
    }
  }
  return result;
}

sumDigPow(1, 10);     // [1, 2, 3, 4, 5, 6, 7, 8, 9]
sumDigPow(1, 100);    // [1, 2, 3, 4, 5, 6, 7, 8, 9, 89]
sumDigPow(10, 100);   // [89]
sumDigPow(100, 150);  // [89, 135]