53 lines
790 B
Go
53 lines
790 B
Go
package q1116
|
|
|
|
type void struct{}
|
|
|
|
type ZeroEvenOdd struct {
|
|
n int
|
|
c0, c1, c2 chan void
|
|
}
|
|
|
|
func NewZeroEvenOdd(n int) *ZeroEvenOdd {
|
|
zeo := &ZeroEvenOdd{
|
|
n: n,
|
|
c0: make(chan void, 1),
|
|
c1: make(chan void, 1),
|
|
c2: make(chan void, 1),
|
|
}
|
|
zeo.c0 <- void{}
|
|
return zeo
|
|
}
|
|
|
|
func (z *ZeroEvenOdd) Zero(printNumber func(int)) {
|
|
for i := range z.n {
|
|
<-z.c0
|
|
printNumber(0)
|
|
if (i+1)%2 == 0 {
|
|
z.c2 <- void{}
|
|
} else {
|
|
z.c1 <- void{}
|
|
}
|
|
}
|
|
}
|
|
|
|
func (z *ZeroEvenOdd) Even(printNumber func(int)) {
|
|
for i := range z.n {
|
|
if (i+1)%2 != 0 {
|
|
continue
|
|
}
|
|
<-z.c2
|
|
printNumber(i + 1)
|
|
z.c0 <- void{}
|
|
}
|
|
}
|
|
|
|
func (z *ZeroEvenOdd) Odd(printNumber func(int)) {
|
|
for i := range z.n {
|
|
if (i+1)%2 == 0 {
|
|
continue
|
|
}
|
|
<-z.c1
|
|
printNumber(i + 1)
|
|
z.c0 <- void{}
|
|
}
|
|
}
|