## A217: Solution

'''
1. Write a function sum_powers(N,k) that yields, 
given positive integers N and k, 
the sum of the powers n**k, 
for n in the range 1,2,...,N.
'''

def sum_powers(N, k):
    if not positive_integer(N):
        return 'A217/sum_powers: %d is not a positive integer'%N
    if not positive_integer(k):
        return 'A217/sum_powers: %d is not a positive integer'%k
    return sum(n**k for n in range(1,N+1))


'''
2. Write a function delete_multiples(k,L) that returns, 
given an integer k and a list L of integers, 
the list obtained after deleting from L all the multiples of k.
'''
    
def delete_multiples(k, L):
    if not isinstance(k,int): return 'A217/delete_multiples: %s is not an integer'%str(k)
    if not is_integer_list(L): return 'A217/delete_multiples: the second parameter is not list-like'
    # deal with the case k=0
    if k==0: return [x for x in L if x!=0]
    return [x for x in L if x%k != 0]

'''
3. Upgrade the previous function to a function delete_multi_multiples(K,L), 
where now K is an integer or a list of integers, 
that returns the list obtained from L 
after deleting all the multiples of all the integers in K.
'''
    
def delete_multi_multiples(K, L):
    if isinstance(K, int): K = [K]
    if not is_integer_list(K):
        return 'A217/delete_multi_multiples: first parameter is not integer or list of integers'
    for k in K: L = delete_multiples(k, L)
    return L
    
    
def positive_integer(n): return isinstance(n,int) and n>0 
def is_integer_list(L): return isinstance(L,list) and all(isinstance(l,int) for l in L)   

## Tests
# positive_integer
for k in (-5,0,7,3.14):
    print('   positive_integer(%s)?'%k, positive_integer(k))
print()
# is_integer_list
for L in (2,[-3,0,1,2],list(range(-3,4)),(1,2)):
    print('   is_integer_list(%s)?'%str(L), is_integer_list(L))
print()
# sum_powers
for N in (-1,0,10,50):
    for k in (0,2,7):
        print('   sum_powers(%s,%s)?'%(str(N),str(k)), sum_powers(N,k))
print()
# delete_multiples
L=list(range(1,30))
K = (0,2,3,5)
for k in K:
    print('   delete_multiples(%d,L) ='%k, delete_multiples(k,L))
print()
# delete_multi_multiples
L=list(range(1,30))+5*[0]
print('   delete_multi_multiples(0,L) =', delete_multi_multiples(0,L))
print('   delete_multi_multiples(6,L) =', delete_multi_multiples(6,L))
print('   delete_multi_multiples([2,3,5],L) =', delete_multi_multiples([2,3,5],L))
