go で algorithm : FizzBuzz
はじめに
諸事情で暇になったので atcoder でも始めようかと思いましたが、まずは有名アルゴリズムを身につけていこうかと思います。
アルゴリズムかどうかはわかりませんが、まずは go で FizzBuzz とテストを書きます。
go で FizzBuzz
0~100 の int をもらってFizzBuzzを返します。
package main import ( "fmt" ) // FizzBuzz is return usual FizzBuzz and error func FizzBuzz(n int) (string, error) { if n < 1 || n > 100 { return "", fmt.Errorf("Invalid number: %v", n) } switch { case n%15 == 0: return "FizzBuzz", nil case n%3 == 0: return "Fizz", nil case n%5 == 0: return "Buzz", nil default: return fmt.Sprint(n), nil } }
FizzBuzz のテストです。
Table Driven Tests で書いていこうと思います。
package main import "testing" func TestFizzBuzz(t *testing.T) { tests := []struct { input int want string err bool }{ {input: -1, want: "", err: true}, {input: 0, want: "", err: true}, {input: 1, want: "1", err: false}, {input: 2, want: "2", err: false}, {input: 3, want: "Fizz", err: false}, {input: 5, want: "Buzz", err: false}, {input: 15, want: "FizzBuzz", err: false}, {input: 101, want: "", err: true}, } for _, test := range tests { got, err := FizzBuzz(test.input) if !test.err && err != nil { t.Fatalf("should not be error for %v but: %v", test.input, err) } if test.err && err == nil { t.Fatalf("should be error for %v but not:", test.input) } if got != test.want { t.Fatalf("want %q, but %q:", test.want, got) } } }
まとめ
特にまとめる必要のない内容ですが、次回以降のフォーマットになればと FizzBuzz をまとめました。
安心安全の mattn さんの記事を参考にさせていただきました。