# 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?

import progressbar


def get_triangle(num):

    """Returns the value of the nth triangle number"""

    return (num * (num + 1)) / 2


def factors(n):

    """Receives a triangle number as argument; returns the number of factors for that number."""

    fcount = set(reduce(list.__add__, ([i, n//i] for i in range(1, int(n**0.5) + 1) if n % i == 0)))
    return len(fcount)


def evaluate():

    """No arguments; initializes a check of factor counts, starting from the first triangle number."""

    x = 1
    bar = progressbar.ProgressBar(max_value=progressbar.UnknownLength)
    while True:
        t = get_triangle(x)
        check = factors(t)
        bar.update(x)
        if check >= 500:
            print " "
            print "Solution: ", t
            print "Index: ", x
            break
        if check < 500:
            x += 1

evaluate()
# SOLVED
