Given a positive integer n written as abcd… (a, b, c, d… being digits) and a positive integer p
we want to find a positive integer k, if it exists, such as the sum of the digits of n taken to the successive powers of p is equal to k * n.
In other words:
Is there an integer k such as : (a ^ p + b ^ (p+1) + c ^(p+2) + d ^ (p+3) + …) = n * k
If it is the case we will return k, if not return -1.
Note: n and p will always be given as strictly positive integers.
1 2 3 4
dig_pow(89, 1) should return1 since 8¹ + 9² = 89 = 89 * 1 dig_pow(92, 1) should return -1 since there is no k such as9¹ + 2² equals 92 * k dig_pow(695, 2) should return2 since 6² + 9³ + 5⁴= 1390 = 695 * 2 dig_pow(46288, 3) should return51 since 4³ + 6⁴+ 2⁵ + 8⁶ + 8⁷ = 2360688 = 46288 * 51
# Solution 1 defdig_pow(n, p) number = n.to_s.split('').map(&:to_i) sum = number.map.with_index(p) { |num, idx| num ** idx }.reduce(:+) sum % n == 0 ? sum/n : -1 end
defdig_pow(n, p) sum = n.to_s.chars.map.with_index(p) { |num, idx| num.to_i ** idx }.reduce(:+) sum % n == 0 ? sum / n : -1 end
Javascript
1 2 3 4 5 6 7
// Solution 1 functiondigPow(n, p){ var sum = n.toString().split('') .map((num, idx) =>Math.pow(parseInt(num), idx+p)) .reduce((a,b) => a + b) / n; return sum % 1 == 0 ? sum : -1; }