from eutility.eumath import divisors
from eutility.eusequence import gentriangle
from itertools import dropwhile

def euler012(n):
    ''' Highly divisible triangular number
    
    The sequence of triangle numbers is generated by adding the natural numbers. 
    So the 7th triangle number would be 1 + 2 + 3 + 4 + 5 + 6 + 7 = 28. 
    The first ten terms would be:
    1, 3, 6, 10, 15, 21, 28, 36, 45, 55, ...

    Let us list the factors of the first seven triangle numbers:

    1: 1
    3: 1, 3
    6: 1, 2, 3, 6
    10: 1, 2, 5, 10
    15: 1, 3, 5, 15
    21: 1, 3, 7, 21
    28: 1, 2, 4, 7, 14, 28
    We can see that 28 is the first triangle number to have over five divisors.

    What is the value of the first triangle number to have over five hundred divisors? 
    
    >>> euler012(5)
    28
    >>> euler012(500)
    76576500
    '''
    return dropwhile(lambda x: len(list(divisors(x))) <= n, gentriangle()).next()


def euler012b(n):
    ''' Original version of above function.

    >>> euler012b(5)
    28
    >>> euler012b(500)
    76576500
    '''
    t = gentriangle()
    while True:
        triangle = t.next()
        if len(list(divisors(triangle))) > n:
            return triangle
