Robert Griesemer | ddc7bc5 | 2008-09-12 17:39:29 -0700 | [diff] [blame] | 1 | // $G $F.go && $L $F.$A && ./$A.out |
| 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 | |
| 7 | package main |
| 8 | |
Russ Cox | 839a684 | 2009-01-20 14:40:40 -0800 | [diff] [blame] | 9 | type T chan uint64; |
Robert Griesemer | ddc7bc5 | 2008-09-12 17:39:29 -0700 | [diff] [blame] | 10 | |
Russ Cox | 839a684 | 2009-01-20 14:40:40 -0800 | [diff] [blame] | 11 | func M(f uint64) (in, out T) { |
Russ Cox | 5564504 | 2009-01-06 15:19:02 -0800 | [diff] [blame] | 12 | in = make(T, 100); |
| 13 | out = make(T, 100); |
Russ Cox | 08ca30b | 2008-12-19 03:05:37 -0800 | [diff] [blame] | 14 | go func(in, out T, f uint64) { |
Robert Griesemer | ddc7bc5 | 2008-09-12 17:39:29 -0700 | [diff] [blame] | 15 | for { |
Rob Pike | 27c0eb8 | 2008-09-16 19:33:40 -0700 | [diff] [blame] | 16 | out <- f * <-in; |
Robert Griesemer | ddc7bc5 | 2008-09-12 17:39:29 -0700 | [diff] [blame] | 17 | } |
| 18 | }(in, out, f); |
| 19 | return in, out; |
| 20 | } |
| 21 | |
| 22 | |
Russ Cox | d47d888 | 2008-12-18 22:37:22 -0800 | [diff] [blame] | 23 | func min(xs []uint64) uint64 { |
Robert Griesemer | ddc7bc5 | 2008-09-12 17:39:29 -0700 | [diff] [blame] | 24 | m := xs[0]; |
| 25 | for i := 1; i < len(xs); i++ { |
| 26 | if xs[i] < m { |
| 27 | m = xs[i]; |
| 28 | } |
| 29 | } |
| 30 | return m; |
| 31 | } |
| 32 | |
| 33 | |
| 34 | func main() { |
Russ Cox | be2edb5 | 2009-03-03 08:39:12 -0800 | [diff] [blame] | 35 | F := []uint64{2, 3, 5}; |
Russ Cox | d47d888 | 2008-12-18 22:37:22 -0800 | [diff] [blame] | 36 | var n = len(F); |
Russ Cox | be2edb5 | 2009-03-03 08:39:12 -0800 | [diff] [blame] | 37 | OUT := []uint64{ |
Rob Pike | 85f8d45 | 2008-09-16 14:03:43 -0700 | [diff] [blame] | 38 | 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, 16, 18, 20, 24, 25, 27, 30, 32, 36, |
| 39 | 40, 45, 48, 50, 54, 60, 64, 72, 75, 80, 81, 90, 96, 100, 108, 120, 125, |
| 40 | 128, 135, 144, 150, 160, 162, 180, 192, 200, 216, 225, 240, 243, 250, |
| 41 | 256, 270, 288, 300, 320, 324, 360, 375, 384, 400, 405, 432, 450, 480, |
| 42 | 486, 500, 512, 540, 576, 600, 625, 640, 648, 675, 720, 729, 750, 768, |
| 43 | 800, 810, 864, 900, 960, 972, 1000, 1024, 1080, 1125, 1152, 1200, 1215, |
Russ Cox | be2edb5 | 2009-03-03 08:39:12 -0800 | [diff] [blame] | 44 | 1250, 1280, 1296, 1350, 1440, 1458, 1500, 1536, 1600 }; |
Robert Griesemer | ddc7bc5 | 2008-09-12 17:39:29 -0700 | [diff] [blame] | 45 | |
| 46 | x := uint64(1); |
Russ Cox | 5564504 | 2009-01-06 15:19:02 -0800 | [diff] [blame] | 47 | ins := make([]T, n); |
| 48 | outs := make([]T, n); |
| 49 | xs := make([]uint64, n); |
Robert Griesemer | ddc7bc5 | 2008-09-12 17:39:29 -0700 | [diff] [blame] | 50 | for i := 0; i < n; i++ { |
| 51 | ins[i], outs[i] = M(F[i]); |
| 52 | xs[i] = x; |
| 53 | } |
| 54 | |
Rob Pike | 85f8d45 | 2008-09-16 14:03:43 -0700 | [diff] [blame] | 55 | for i := 0; i < len(OUT); i++ { |
Robert Griesemer | ddc7bc5 | 2008-09-12 17:39:29 -0700 | [diff] [blame] | 56 | t := min(xs); |
| 57 | for i := 0; i < n; i++ { |
Rob Pike | 27c0eb8 | 2008-09-16 19:33:40 -0700 | [diff] [blame] | 58 | ins[i] <- x; |
Robert Griesemer | ddc7bc5 | 2008-09-12 17:39:29 -0700 | [diff] [blame] | 59 | } |
| 60 | |
| 61 | for i := 0; i < n; i++ { |
| 62 | if xs[i] == x { xs[i] = <- outs[i]; } |
| 63 | } |
Russ Cox | 08ca30b | 2008-12-19 03:05:37 -0800 | [diff] [blame] | 64 | |
Robert Griesemer | ddc7bc5 | 2008-09-12 17:39:29 -0700 | [diff] [blame] | 65 | x = min(xs); |
Rob Pike | 85f8d45 | 2008-09-16 14:03:43 -0700 | [diff] [blame] | 66 | if x != OUT[i] { panic("bad: ", x, " should be ", OUT[i]); } |
Robert Griesemer | ddc7bc5 | 2008-09-12 17:39:29 -0700 | [diff] [blame] | 67 | } |
Robert Griesemer | ddc7bc5 | 2008-09-12 17:39:29 -0700 | [diff] [blame] | 68 | } |