表紙 編集 差分 一覧 最近 短縮 付箋 ログイン 凍結中

FizzBuzz

N2Wiki > Go言語学習帳 > 09_FizzBuzz

FizzBuzz

package main
import "fmt"

func natsGen() chan int {
    ch := make(chan int);
    go func() {
        for i := 1; ; i++ {
            ch <- i
        }
    }();
    return ch;
}

func fizzGen() chan string {
    ch := make(chan string);
    go func() {
        for {
            ch <- "";
            ch <- "";
            ch <- "Fizz";
        }
    }();
    return ch;
}

func buzzGen() chan string {
    ch := make(chan string);
    go func() {
        for {
            ch <- "";
            ch <- "";
            ch <- "";
            ch <- "";
            ch <- "Buzz";
        }
    }();
    return ch;
}

func fizzBuzz() chan string {
    out := make(chan string);
    go func() {
        nats := natsGen();
        fizz := fizzGen();
        buzz := buzzGen();
        for {
            n := <- nats;
            f := <- fizz;
            b := <- buzz;
            if f != "" || b != "" {
                out <- f + b;
            }
            else {
                out <- fmt.Sprintf("%d", n);
            }
        }
    }();
    return out;
}

func main() {
    fizzbuzz := fizzBuzz();
    for i := 1 ; i <= 30 ; i++ {
        fmt.Println(<-fizzbuzz);
    }
}