blob: 6745dde41ab7d8560f32e1ee526c1d6efd63f611 [file] [log] [blame]
Russ Cox0b477ef2012-02-16 23:48:57 -05001// run
Robert Griesemerddc7bc52008-09-12 17:39:29 -07002
3// Copyright 2009 The Go Authors. All rights reserved.
4// Use of this source code is governed by a BSD-style
5// license that can be found in the LICENSE file.
6
Rob Pikefc0dc042012-02-19 13:19:43 +11007// Solve the 2,3,5 problem (print all numbers with 2, 3, or 5 as factor) using channels.
8// Test the solution, silently.
9
Robert Griesemerddc7bc52008-09-12 17:39:29 -070010package main
11
Russ Cox00f9f0c2010-03-30 10:34:57 -070012type T chan uint64
Robert Griesemerddc7bc52008-09-12 17:39:29 -070013
Russ Cox839a6842009-01-20 14:40:40 -080014func M(f uint64) (in, out T) {
Russ Cox00f9f0c2010-03-30 10:34:57 -070015 in = make(T, 100)
16 out = make(T, 100)
Russ Cox08ca30b2008-12-19 03:05:37 -080017 go func(in, out T, f uint64) {
Robert Griesemerddc7bc52008-09-12 17:39:29 -070018 for {
Russ Cox00f9f0c2010-03-30 10:34:57 -070019 out <- f*<-in
Robert Griesemerddc7bc52008-09-12 17:39:29 -070020 }
Russ Cox00f9f0c2010-03-30 10:34:57 -070021 }(in, out, f)
22 return in, out
Robert Griesemerddc7bc52008-09-12 17:39:29 -070023}
24
25
Russ Coxd47d8882008-12-18 22:37:22 -080026func min(xs []uint64) uint64 {
Russ Cox00f9f0c2010-03-30 10:34:57 -070027 m := xs[0]
Robert Griesemerddc7bc52008-09-12 17:39:29 -070028 for i := 1; i < len(xs); i++ {
29 if xs[i] < m {
Russ Cox00f9f0c2010-03-30 10:34:57 -070030 m = xs[i]
Robert Griesemerddc7bc52008-09-12 17:39:29 -070031 }
32 }
Russ Cox00f9f0c2010-03-30 10:34:57 -070033 return m
Robert Griesemerddc7bc52008-09-12 17:39:29 -070034}
35
36
37func main() {
Russ Cox00f9f0c2010-03-30 10:34:57 -070038 F := []uint64{2, 3, 5}
39 var n = len(F)
Russ Coxbe2edb52009-03-03 08:39:12 -080040 OUT := []uint64{
Rob Pike85f8d452008-09-16 14:03:43 -070041 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, 16, 18, 20, 24, 25, 27, 30, 32, 36,
42 40, 45, 48, 50, 54, 60, 64, 72, 75, 80, 81, 90, 96, 100, 108, 120, 125,
43 128, 135, 144, 150, 160, 162, 180, 192, 200, 216, 225, 240, 243, 250,
44 256, 270, 288, 300, 320, 324, 360, 375, 384, 400, 405, 432, 450, 480,
45 486, 500, 512, 540, 576, 600, 625, 640, 648, 675, 720, 729, 750, 768,
46 800, 810, 864, 900, 960, 972, 1000, 1024, 1080, 1125, 1152, 1200, 1215,
Russ Cox00f9f0c2010-03-30 10:34:57 -070047 1250, 1280, 1296, 1350, 1440, 1458, 1500, 1536, 1600}
Robert Griesemerddc7bc52008-09-12 17:39:29 -070048
Russ Cox00f9f0c2010-03-30 10:34:57 -070049 x := uint64(1)
50 ins := make([]T, n)
51 outs := make([]T, n)
52 xs := make([]uint64, n)
Robert Griesemerddc7bc52008-09-12 17:39:29 -070053 for i := 0; i < n; i++ {
Russ Cox00f9f0c2010-03-30 10:34:57 -070054 ins[i], outs[i] = M(F[i])
55 xs[i] = x
Robert Griesemerddc7bc52008-09-12 17:39:29 -070056 }
57
Rob Pike85f8d452008-09-16 14:03:43 -070058 for i := 0; i < len(OUT); i++ {
Robert Griesemerddc7bc52008-09-12 17:39:29 -070059 for i := 0; i < n; i++ {
Russ Cox00f9f0c2010-03-30 10:34:57 -070060 ins[i] <- x
Robert Griesemerddc7bc52008-09-12 17:39:29 -070061 }
62
63 for i := 0; i < n; i++ {
Russ Cox00f9f0c2010-03-30 10:34:57 -070064 if xs[i] == x {
65 xs[i] = <-outs[i]
66 }
Robert Griesemerddc7bc52008-09-12 17:39:29 -070067 }
Russ Cox08ca30b2008-12-19 03:05:37 -080068
Russ Cox00f9f0c2010-03-30 10:34:57 -070069 x = min(xs)
70 if x != OUT[i] {
71 println("bad: ", x, " should be ", OUT[i])
72 panic("235")
73 }
Robert Griesemerddc7bc52008-09-12 17:39:29 -070074 }
Robert Griesemerddc7bc52008-09-12 17:39:29 -070075}