Russ Cox | 0b477ef | 2012-02-16 23:48:57 -0500 | [diff] [blame] | 1 | // run |
Robert Griesemer | ddc7bc5 | 2008-09-12 17:39:29 -0700 | [diff] [blame] | 2 | |
| 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 Pike | fc0dc04 | 2012-02-19 13:19:43 +1100 | [diff] [blame] | 7 | // 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 Griesemer | ddc7bc5 | 2008-09-12 17:39:29 -0700 | [diff] [blame] | 10 | package main |
| 11 | |
Russ Cox | 00f9f0c | 2010-03-30 10:34:57 -0700 | [diff] [blame] | 12 | type T chan uint64 |
Robert Griesemer | ddc7bc5 | 2008-09-12 17:39:29 -0700 | [diff] [blame] | 13 | |
Russ Cox | 839a684 | 2009-01-20 14:40:40 -0800 | [diff] [blame] | 14 | func M(f uint64) (in, out T) { |
Russ Cox | 00f9f0c | 2010-03-30 10:34:57 -0700 | [diff] [blame] | 15 | in = make(T, 100) |
| 16 | out = make(T, 100) |
Russ Cox | 08ca30b | 2008-12-19 03:05:37 -0800 | [diff] [blame] | 17 | go func(in, out T, f uint64) { |
Robert Griesemer | ddc7bc5 | 2008-09-12 17:39:29 -0700 | [diff] [blame] | 18 | for { |
Russ Cox | 00f9f0c | 2010-03-30 10:34:57 -0700 | [diff] [blame] | 19 | out <- f*<-in |
Robert Griesemer | ddc7bc5 | 2008-09-12 17:39:29 -0700 | [diff] [blame] | 20 | } |
Russ Cox | 00f9f0c | 2010-03-30 10:34:57 -0700 | [diff] [blame] | 21 | }(in, out, f) |
| 22 | return in, out |
Robert Griesemer | ddc7bc5 | 2008-09-12 17:39:29 -0700 | [diff] [blame] | 23 | } |
| 24 | |
| 25 | |
Russ Cox | d47d888 | 2008-12-18 22:37:22 -0800 | [diff] [blame] | 26 | func min(xs []uint64) uint64 { |
Russ Cox | 00f9f0c | 2010-03-30 10:34:57 -0700 | [diff] [blame] | 27 | m := xs[0] |
Robert Griesemer | ddc7bc5 | 2008-09-12 17:39:29 -0700 | [diff] [blame] | 28 | for i := 1; i < len(xs); i++ { |
| 29 | if xs[i] < m { |
Russ Cox | 00f9f0c | 2010-03-30 10:34:57 -0700 | [diff] [blame] | 30 | m = xs[i] |
Robert Griesemer | ddc7bc5 | 2008-09-12 17:39:29 -0700 | [diff] [blame] | 31 | } |
| 32 | } |
Russ Cox | 00f9f0c | 2010-03-30 10:34:57 -0700 | [diff] [blame] | 33 | return m |
Robert Griesemer | ddc7bc5 | 2008-09-12 17:39:29 -0700 | [diff] [blame] | 34 | } |
| 35 | |
| 36 | |
| 37 | func main() { |
Russ Cox | 00f9f0c | 2010-03-30 10:34:57 -0700 | [diff] [blame] | 38 | F := []uint64{2, 3, 5} |
| 39 | var n = len(F) |
Russ Cox | be2edb5 | 2009-03-03 08:39:12 -0800 | [diff] [blame] | 40 | OUT := []uint64{ |
Rob Pike | 85f8d45 | 2008-09-16 14:03:43 -0700 | [diff] [blame] | 41 | 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 Cox | 00f9f0c | 2010-03-30 10:34:57 -0700 | [diff] [blame] | 47 | 1250, 1280, 1296, 1350, 1440, 1458, 1500, 1536, 1600} |
Robert Griesemer | ddc7bc5 | 2008-09-12 17:39:29 -0700 | [diff] [blame] | 48 | |
Russ Cox | 00f9f0c | 2010-03-30 10:34:57 -0700 | [diff] [blame] | 49 | x := uint64(1) |
| 50 | ins := make([]T, n) |
| 51 | outs := make([]T, n) |
| 52 | xs := make([]uint64, n) |
Robert Griesemer | ddc7bc5 | 2008-09-12 17:39:29 -0700 | [diff] [blame] | 53 | for i := 0; i < n; i++ { |
Russ Cox | 00f9f0c | 2010-03-30 10:34:57 -0700 | [diff] [blame] | 54 | ins[i], outs[i] = M(F[i]) |
| 55 | xs[i] = x |
Robert Griesemer | ddc7bc5 | 2008-09-12 17:39:29 -0700 | [diff] [blame] | 56 | } |
| 57 | |
Rob Pike | 85f8d45 | 2008-09-16 14:03:43 -0700 | [diff] [blame] | 58 | for i := 0; i < len(OUT); i++ { |
Robert Griesemer | ddc7bc5 | 2008-09-12 17:39:29 -0700 | [diff] [blame] | 59 | for i := 0; i < n; i++ { |
Russ Cox | 00f9f0c | 2010-03-30 10:34:57 -0700 | [diff] [blame] | 60 | ins[i] <- x |
Robert Griesemer | ddc7bc5 | 2008-09-12 17:39:29 -0700 | [diff] [blame] | 61 | } |
| 62 | |
| 63 | for i := 0; i < n; i++ { |
Russ Cox | 00f9f0c | 2010-03-30 10:34:57 -0700 | [diff] [blame] | 64 | if xs[i] == x { |
| 65 | xs[i] = <-outs[i] |
| 66 | } |
Robert Griesemer | ddc7bc5 | 2008-09-12 17:39:29 -0700 | [diff] [blame] | 67 | } |
Russ Cox | 08ca30b | 2008-12-19 03:05:37 -0800 | [diff] [blame] | 68 | |
Russ Cox | 00f9f0c | 2010-03-30 10:34:57 -0700 | [diff] [blame] | 69 | x = min(xs) |
| 70 | if x != OUT[i] { |
| 71 | println("bad: ", x, " should be ", OUT[i]) |
| 72 | panic("235") |
| 73 | } |
Robert Griesemer | ddc7bc5 | 2008-09-12 17:39:29 -0700 | [diff] [blame] | 74 | } |
Robert Griesemer | ddc7bc5 | 2008-09-12 17:39:29 -0700 | [diff] [blame] | 75 | } |