blob: 03143a60d83fef499ccc34dd798cc7aecdb9e870 [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 Cox00f9f0c2010-03-30 10:34:57 -07009type 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 Cox00f9f0c2010-03-30 10:34:57 -070012 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 {
Russ Cox00f9f0c2010-03-30 10:34:57 -070016 out <- f*<-in
Robert Griesemerddc7bc52008-09-12 17:39:29 -070017 }
Russ Cox00f9f0c2010-03-30 10:34:57 -070018 }(in, out, f)
19 return in, out
Robert Griesemerddc7bc52008-09-12 17:39:29 -070020}
21
22
Russ Coxd47d8882008-12-18 22:37:22 -080023func min(xs []uint64) uint64 {
Russ Cox00f9f0c2010-03-30 10:34:57 -070024 m := xs[0]
Robert Griesemerddc7bc52008-09-12 17:39:29 -070025 for i := 1; i < len(xs); i++ {
26 if xs[i] < m {
Russ Cox00f9f0c2010-03-30 10:34:57 -070027 m = xs[i]
Robert Griesemerddc7bc52008-09-12 17:39:29 -070028 }
29 }
Russ Cox00f9f0c2010-03-30 10:34:57 -070030 return m
Robert Griesemerddc7bc52008-09-12 17:39:29 -070031}
32
33
34func main() {
Russ Cox00f9f0c2010-03-30 10:34:57 -070035 F := []uint64{2, 3, 5}
36 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 Cox00f9f0c2010-03-30 10:34:57 -070044 1250, 1280, 1296, 1350, 1440, 1458, 1500, 1536, 1600}
Robert Griesemerddc7bc52008-09-12 17:39:29 -070045
Russ Cox00f9f0c2010-03-30 10:34:57 -070046 x := uint64(1)
47 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++ {
Russ Cox00f9f0c2010-03-30 10:34:57 -070051 ins[i], outs[i] = M(F[i])
52 xs[i] = x
Robert Griesemerddc7bc52008-09-12 17:39:29 -070053 }
54
Rob Pike85f8d452008-09-16 14:03:43 -070055 for i := 0; i < len(OUT); i++ {
Robert Griesemerddc7bc52008-09-12 17:39:29 -070056 for i := 0; i < n; i++ {
Russ Cox00f9f0c2010-03-30 10:34:57 -070057 ins[i] <- x
Robert Griesemerddc7bc52008-09-12 17:39:29 -070058 }
59
60 for i := 0; i < n; i++ {
Russ Cox00f9f0c2010-03-30 10:34:57 -070061 if xs[i] == x {
62 xs[i] = <-outs[i]
63 }
Robert Griesemerddc7bc52008-09-12 17:39:29 -070064 }
Russ Cox08ca30b2008-12-19 03:05:37 -080065
Russ Cox00f9f0c2010-03-30 10:34:57 -070066 x = min(xs)
67 if x != OUT[i] {
68 println("bad: ", x, " should be ", OUT[i])
69 panic("235")
70 }
Robert Griesemerddc7bc52008-09-12 17:39:29 -070071 }
Robert Griesemerddc7bc52008-09-12 17:39:29 -070072}