Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

looking for a more elegant solution to this [closed]

Tags:

python

Return the sum of the numbers in the array, except ignore sections of numbers starting with a 6 and extending to the next 7 (every 6 will be followed by at least one 7). Return 0 for no numbers.

sum67([1, 2, 2]) ? 5
sum67([1, 2, 2, 6, 99, 99, 7]) ? 5
sum67([1, 1, 6, 7, 2]) ? 4
def sum67(nums):
    dontadd = 0
    sum = 0
    for i in range(0, len(nums)):
        if dontadd == 0:
            if nums[i] == 6:
                dontadd = 1
            else:
                sum += nums[i]
        else:
            if nums[i] == 7:
                dontadd = 0
            else:
                pass# nothing happens. It is useful as a placeholder when a statement is required syntactically
    return sum

Looking for a more elegant solution to this problem from codingbat. This answer doesn't seem as intuitive as it could be

like image 573
davidjglynn Avatar asked Nov 16 '25 20:11

davidjglynn


1 Answers

If we can just remove the elements that we don't want, then we can use a simple sum. Here is an example:

def sum67(nums):
    nums=nums[:]
    while 6 in nums:
        i=nums.index(6)
        j=nums.index(7,i)
        del nums[i:j+1]
    return sum(nums)

First, we use nums=nums[:] to make a copy. The caller probably isn't expecting nums to change.

nums.index(6) finds the index of the first element that has a value of 6. nums.index(7,i) finds the index of the first element that has a value of 7 after the index i. del nums[i:j+1] then deletes the elements in the range from i to j, including the element at j.

like image 75
Vaughn Cato Avatar answered Nov 19 '25 12:11

Vaughn Cato