Codewars. Some tests are passed, but i need to get tests which outputs the following mistake: 3263 should equal -1

Question:

Can you explain it what problems are here? To my mind, this code is like a heap of crap but with the right solving. I beg your pardon for my english.
the task of this kata:

Some numbers have funny properties. For example:

89 --> 8¹ + 9² = 89 * 1

695 --> 6² + 9³ + 5⁴= 1390 = 695 * 2

46288 --> 4³ + 6⁴+ 2⁵ + 8⁶ + 8⁷ = 2360688 = 46288 * 51

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, p will always be given as strictly positive integers.

dig_pow(89, 1) should return 1 since 8¹ + 9² = 89 = 89 * 1

dig_pow(92, 1) should return -1 since there is no k such as 9¹ + 2² equals 92 * k

dig_pow(695, 2) should return 2 since 6² + 9³ + 5⁴= 1390 = 695 * 2

dig_pow(46288, 3) should return 51 since 4³ + 6⁴+ 2⁵ + 8⁶ + 8⁷ = 2360688 = 46288 * 51

def dig_pow(n, p):
    if n > 0 and p > 0:
        b = []
        a = str(n)
        result = []
        for i in a:
            b.append(int(i))
            for x in b:
                if p != 1:
                    result.append(x ** p)
                    p += 1
                else:
                    result.append(x ** (p + 1))

        if int((sum(result)) / n) < 1:
            return -1
        elif int((sum(result)) / n) < 2:
            return 1
        else:
            return int((sum(result)) / n)

test results:

Test Passed

Test Passed

Test Passed

Test Passed

3263 should equal -1

Asked By: Oleg Radchenko

||

Answers:

I don’t know what exact version of Python you’re using. This following code are in Python 3. And if I get you correctly, the code can be as simple as

def dig_pow(n, p):
    assert n > 0 and p > 0
    digits = (int(i) for i in str(n)) # replaces your a,b part with generator
    result = 0 # you don't use result as a list, so an int suffice
    for x in digits: # why do you need if in the loop? (am I missing something?)
        result += x ** p
        p += 1

    if result % n: # you just test for divisibility
        return -1
    else:
        return result // n

The major problem is that, in your objective, you have only two option of returning, but you wrote if elif else, which is definitely unnecessary and leads to problems and bugs. The % is modulus operator.

Also, having an if and not returning anything in the other branch is often not a good idea (see the assert part). Of course, if you don’t like it, just fall back to if.

Answered By: YiFei

I believe this could work as well and I find it a little easier to read, however it can definitely be improved:

def dig_pow(n, p):
    value = 0
    for digit in str(n):
        value += int(digit)**p
        p += 1
    for k in range(1,value):
        if value/k == n:
        return k
    return -1

this is some example simple example than using:

digits = (int(i) for i in str(n))

I’m opting to use this version since I am still a beginner which can be done with this alt way:

result = 0

for digits in str(n):
    #iterate through each digit from n
    # single of digits turn to int & power to p
    for number in digits: 
        result += int(number) ** p
        p += 1

as for the full solution, it goes like this:

def dig_pow(n, p):
    # example n = 123 , change it to string = 1, 2, 3
    # each string[] **p, and p iterate by 1
    # if n % p not equal to p  return - 1

result = 0

for digits in str(n):

    #iterate through each digit from n
    # single digit turn to int & power to p
    for number in digits: 
        result += int(number) ** p
        p += 1  
        
if result % n:
    return -1
else:
    return result // n
Answered By: Hakeem Adli