Problem 2: Count van Count (100pts)

Consider the following implementations of count_factors and count_primes:

def count_factors(n): """Return the number of positive factors that n has. >>> count_factors(6) 4 # 1, 2, 3, 6 >>> count_factors(4) 3 # 1, 2, 4 """ i, count = 1, 0 while i <= n: if n % i == 0: count += 1 i += 1 return count def count_primes(n): """Return the number of prime numbers up to and including n. >>> count_primes(6) 3 # 2, 3, 5 >>> count_primes(13) 6 # 2, 3, 5, 7, 11, 13 """ i, count = 1, 0 while i <= n: if is_prime(i): count += 1 i += 1 return count def is_prime(n): return count_factors(n) == 2 # only factors are 1 and n

The implementations look quite similar! Generalize this logic by writing a function count_cond, which takes in a two-argument predicate function condition(n, i). count_cond returns a one-argument function that takes in n, which counts all the numbers from 1 to n that satisfy condition when called.

def count_cond(condition): """Returns a function with one parameter N that counts all the numbers from 1 to N that satisfy the two-argument predicate function Condition, where the first argument for Condition is N and the second argument is the number from 1 to N. >>> count_factors = count_cond(lambda n, i: n % i == 0) >>> count_factors(2) # 1, 2 2 >>> count_factors(4) # 1, 2, 4 3 >>> count_factors(12) # 1, 2, 3, 4, 6, 12 6 >>> is_prime = lambda n, i: count_factors(i) == 2 >>> count_primes = count_cond(is_prime) >>> count_primes(2) # 2 1 >>> count_primes(3) # 2, 3 2 >>> count_primes(4) # 2, 3 2 >>> count_primes(5) # 2, 3, 5 3 >>> count_primes(20) # 2, 3, 5, 7, 11, 13, 17, 19 8 """ "*** YOUR CODE HERE ***"