# euler / go / src / euler / 12.go

 ``` 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81``` ```/* 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) } ```