Source

euler / go / src / euler / 12.go

Full commit
/*
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?

Answer: 76576500
*/

package main

import "fmt"

func triangleNums() chan uint {
	out := make(chan uint)
	go func() {
		t, i := uint(0), uint(1)
		for {
			t += i
			out <- t
			i++
		}
	}()

	return out
}

func numDivisors(n uint) uint {
	d := uint(2) // 1 and the number itself
	for i := uint(2); i <= n/2+1; i++ {
		if n%i == 0 {
			d++
		}
	}

	return d
}

func worker(in chan uint, out chan uint) {
	for {
		t := <-in
		if numDivisors(t) > 500 {
			out <- t
		}
	}
}

const (
	NUM_WORKERS = 1000
)

func e12() {
	out := make(chan uint)
	in := triangleNums()
	for i := 0; i < NUM_WORKERS; i++ {
		go worker(in, out)
	}

	t := <-out
	fmt.Println(t)
}

func init() {
    register("12", e12)
}