blob: fe3024c613964aec035b5b718d5d9630b88b5440 [file] [log] [blame]
Robert Griesemerddc7bc52008-09-12 17:39:29 -07001// $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
7package main
8
Russ Cox839a6842009-01-20 14:40:40 -08009type T chan uint64;
Robert Griesemerddc7bc52008-09-12 17:39:29 -070010
Russ Cox839a6842009-01-20 14:40:40 -080011func M(f uint64) (in, out T) {
Russ Cox55645042009-01-06 15:19:02 -080012 in = make(T, 100);
13 out = make(T, 100);
Russ Cox08ca30b2008-12-19 03:05:37 -080014 go func(in, out T, f uint64) {
Robert Griesemerddc7bc52008-09-12 17:39:29 -070015 for {
Rob Pike27c0eb82008-09-16 19:33:40 -070016 out <- f * <-in;
Robert Griesemerddc7bc52008-09-12 17:39:29 -070017 }
18 }(in, out, f);
19 return in, out;
20}
21
22
Russ Coxd47d8882008-12-18 22:37:22 -080023func min(xs []uint64) uint64 {
Robert Griesemerddc7bc52008-09-12 17:39:29 -070024 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
34func main() {
Russ Coxbe2edb52009-03-03 08:39:12 -080035 F := []uint64{2, 3, 5};
Russ Coxd47d8882008-12-18 22:37:22 -080036 var n = len(F);
Russ Coxbe2edb52009-03-03 08:39:12 -080037 OUT := []uint64{
Rob Pike85f8d452008-09-16 14:03:43 -070038 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 Coxbe2edb52009-03-03 08:39:12 -080044 1250, 1280, 1296, 1350, 1440, 1458, 1500, 1536, 1600 };
Robert Griesemerddc7bc52008-09-12 17:39:29 -070045
46 x := uint64(1);
Russ Cox55645042009-01-06 15:19:02 -080047 ins := make([]T, n);
48 outs := make([]T, n);
49 xs := make([]uint64, n);
Robert Griesemerddc7bc52008-09-12 17:39:29 -070050 for i := 0; i < n; i++ {
51 ins[i], outs[i] = M(F[i]);
52 xs[i] = x;
53 }
54
Rob Pike85f8d452008-09-16 14:03:43 -070055 for i := 0; i < len(OUT); i++ {
Robert Griesemerddc7bc52008-09-12 17:39:29 -070056 t := min(xs);
57 for i := 0; i < n; i++ {
Rob Pike27c0eb82008-09-16 19:33:40 -070058 ins[i] <- x;
Robert Griesemerddc7bc52008-09-12 17:39:29 -070059 }
60
61 for i := 0; i < n; i++ {
62 if xs[i] == x { xs[i] = <- outs[i]; }
63 }
Russ Cox08ca30b2008-12-19 03:05:37 -080064
Robert Griesemerddc7bc52008-09-12 17:39:29 -070065 x = min(xs);
Rob Pike85f8d452008-09-16 14:03:43 -070066 if x != OUT[i] { panic("bad: ", x, " should be ", OUT[i]); }
Robert Griesemerddc7bc52008-09-12 17:39:29 -070067 }
Robert Griesemerddc7bc52008-09-12 17:39:29 -070068}