OLD | NEW |
1 // $G $F.go && $L $F.$A && ./$A.out | 1 // $G $F.go && $L $F.$A && ./$A.out |
2 | 2 |
3 // Copyright 2009 The Go Authors. All rights reserved. | 3 // Copyright 2009 The Go Authors. All rights reserved. |
4 // Use of this source code is governed by a BSD-style | 4 // Use of this source code is governed by a BSD-style |
5 // license that can be found in the LICENSE file. | 5 // license that can be found in the LICENSE file. |
6 | 6 |
7 package main | 7 package main |
8 | 8 |
9 type T chan uint64; | 9 type T chan uint64 |
10 | 10 |
11 func M(f uint64) (in, out T) { | 11 func M(f uint64) (in, out T) { |
12 » in = make(T, 100); | 12 » in = make(T, 100) |
13 » out = make(T, 100); | 13 » out = make(T, 100) |
14 go func(in, out T, f uint64) { | 14 go func(in, out T, f uint64) { |
15 for { | 15 for { |
16 » » » out <- f * <-in; | 16 » » » out <- f*<-in |
17 } | 17 } |
18 » }(in, out, f); | 18 » }(in, out, f) |
19 » return in, out; | 19 » return in, out |
20 } | 20 } |
21 | 21 |
22 | 22 |
23 func min(xs []uint64) uint64 { | 23 func min(xs []uint64) uint64 { |
24 » m := xs[0]; | 24 » m := xs[0] |
25 for i := 1; i < len(xs); i++ { | 25 for i := 1; i < len(xs); i++ { |
26 if xs[i] < m { | 26 if xs[i] < m { |
27 » » » m = xs[i]; | 27 » » » m = xs[i] |
28 } | 28 } |
29 } | 29 } |
30 » return m; | 30 » return m |
31 } | 31 } |
32 | 32 |
33 | 33 |
34 func main() { | 34 func main() { |
35 » F := []uint64{2, 3, 5}; | 35 » F := []uint64{2, 3, 5} |
36 » var n = len(F); | 36 » var n = len(F) |
37 OUT := []uint64{ | 37 OUT := []uint64{ |
38 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, 16, 18, 20, 24, 25, 27, 30, 32,
36, | 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, 12
0, 125, | 39 40, 45, 48, 50, 54, 60, 64, 72, 75, 80, 81, 90, 96, 100, 108, 12
0, 125, |
40 128, 135, 144, 150, 160, 162, 180, 192, 200, 216, 225, 240, 243,
250, | 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, | 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, | 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, | 43 800, 810, 864, 900, 960, 972, 1000, 1024, 1080, 1125, 1152, 1200
, 1215, |
44 » » 1250, 1280, 1296, 1350, 1440, 1458, 1500, 1536, 1600 }; | 44 » » 1250, 1280, 1296, 1350, 1440, 1458, 1500, 1536, 1600} |
45 | 45 |
46 » x := uint64(1); | 46 » x := uint64(1) |
47 » ins := make([]T, n); | 47 » ins := make([]T, n) |
48 » outs := make([]T, n); | 48 » outs := make([]T, n) |
49 » xs := make([]uint64, n); | 49 » xs := make([]uint64, n) |
50 for i := 0; i < n; i++ { | 50 for i := 0; i < n; i++ { |
51 » » ins[i], outs[i] = M(F[i]); | 51 » » ins[i], outs[i] = M(F[i]) |
52 » » xs[i] = x; | 52 » » xs[i] = x |
53 } | 53 } |
54 | 54 |
55 for i := 0; i < len(OUT); i++ { | 55 for i := 0; i < len(OUT); i++ { |
56 for i := 0; i < n; i++ { | 56 for i := 0; i < n; i++ { |
57 » » » ins[i] <- x; | 57 » » » ins[i] <- x |
58 } | 58 } |
59 | 59 |
60 for i := 0; i < n; i++ { | 60 for i := 0; i < n; i++ { |
61 » » » if xs[i] == x { xs[i] = <- outs[i]; } | 61 » » » if xs[i] == x { |
| 62 » » » » xs[i] = <-outs[i] |
| 63 » » » } |
62 } | 64 } |
63 | 65 |
64 » » x = min(xs); | 66 » » x = min(xs) |
65 » » if x != OUT[i] { panic("bad: ", x, " should be ", OUT[i]); } | 67 » » if x != OUT[i] { |
| 68 » » » println("bad: ", x, " should be ", OUT[i]) |
| 69 » » » panic("235") |
| 70 » » } |
66 } | 71 } |
67 } | 72 } |
OLD | NEW |