| /* | 
 | Redistribution and use in source and binary forms, with or without | 
 | modification, are permitted provided that the following conditions are met: | 
 |  | 
 |     * Redistributions of source code must retain the above copyright | 
 |     notice, this list of conditions and the following disclaimer. | 
 |  | 
 |     * Redistributions in binary form must reproduce the above copyright | 
 |     notice, this list of conditions and the following disclaimer in the | 
 |     documentation and/or other materials provided with the distribution. | 
 |  | 
 |     * Neither the name of "The Computer Language Benchmarks Game" nor the | 
 |     name of "The Computer Language Shootout Benchmarks" nor the names of | 
 |     its contributors may be used to endorse or promote products derived | 
 |     from this software without specific prior written permission. | 
 |  | 
 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | 
 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | 
 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | 
 | ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE | 
 | LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | 
 | CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | 
 | SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | 
 | INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | 
 | CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | 
 | ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | 
 | POSSIBILITY OF SUCH DAMAGE. | 
 | */ | 
 |  | 
 | /* The Computer Language Benchmarks Game | 
 |  * http://shootout.alioth.debian.org/ | 
 |  * | 
 |  * contributed by The Go Authors. | 
 |  */ | 
 |  | 
 | package main | 
 |  | 
 | import ( | 
 | 	"flag" | 
 | 	"fmt" | 
 | 	"os" | 
 | ) | 
 |  | 
 | var n = flag.Int("n", 1000, "how many passes") | 
 |  | 
 | const Nthread = 503 | 
 |  | 
 | func f(i int, in <-chan int, out chan<- int) { | 
 | 	for { | 
 | 		n := <-in | 
 | 		if n == 0 { | 
 | 			fmt.Printf("%d\n", i) | 
 | 			os.Exit(0) | 
 | 		} | 
 | 		out <- n - 1 | 
 | 	} | 
 | } | 
 |  | 
 | func main() { | 
 | 	flag.Parse() | 
 |  | 
 | 	one := make(chan int) // will be input to thread 1 | 
 | 	var in, out chan int = nil, one | 
 | 	for i := 1; i <= Nthread-1; i++ { | 
 | 		in, out = out, make(chan int) | 
 | 		go f(i, in, out) | 
 | 	} | 
 | 	go f(Nthread, out, one) | 
 | 	one <- *n | 
 | 	<-make(chan int) // hang until ring completes | 
 | } |