pythonalgorithmpython-2.7python-3.xdigit

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


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


Solution

  • 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.