"""
Problem 12
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 numpy as np


def generate_triangle_numbers(n):
    # triangular numbers can be calculated with dynamic formula below
    # instead of summing all numbers from 1 till n...
    return int(n * (n + 1) / 2)


def number_of_divisors(n):
    factors = set()

    # a factor will always be a pair.
    # the lesser of the pairs can never be greater than sqrt(n)
    for i in range(1, int(np.sqrt(n) + 1)):
        if n % i == 0:  # finds the "lesser" factors
            factors.update([i])  # saves "lesser"
            factors.update([n // i])  # saves floor division of "lesser" - complement in the 'pair'
    return len(factors)


j = 1

while number_of_divisors(generate_triangle_numbers(j)) < 500:
    j += 1

print('winner winnner: {0}'.format(generate_triangle_numbers(j)))
