Goの勉強がてら問題をといており、解き方が複数あり個人的なポエム。
bit wise and が結構優秀だったので、覚書。
課題
引数number(int)を渡すEvenOrOdd関数を作成して、引数が偶数の場合は"Even"、奇数の場合は"Odd"を返却する関数を作成しなさい。
解決方法1. あまりを計算してstringを返却する
main.go
package main
func EvenOrOdd(number int) string {
if result := number % 2; result == 0 {
return "Even"
}
return "Odd"
}
解決方法2. 連想配列を作成して、計算結果をkeyにしてvalueを返す
main.go
package main
import "math"
func EvenOrOdd(number int) string {
dict := map[int]string{0:"Even", 1:"Odd"}
return dict[int(math.Abs(float64(number))) % 2]
}
解決方法3. 配列を作成して計算結果をkeyにしてvalueを返す
解決方法2に近い。
main.go
package main
import "math"
func EvenOrOdd(number int) string {
return []string{"Even", "Odd"}[int(math.Abs(float64(number))) % 2]
}
解決方法4. 連想配列でbit wise andを利用して計算を実施する
main.go
package main
func EvenOrOdd(number int) string {
dict := map[int]string{0:"Even", 1:"Odd"}
return dict[number & 1]
}
解決方法5. 配列を作成して、bit wise andを利用して計算を実施する
main.go
package main
func EvenOrOdd(number int) string {
return []string{ "Event", "Odd" }[number & 1]
}
テスト
以下のテストケースで確認
main_test.go
package main
import (
"testing"
)
func TestEvenOrOdd(t *testing.T) {
tests := []struct {
name string
arg int
want string
}{
{ name: "Even", arg: 2 , want: "Even" },
{ name: "Odd", arg: 1, want: "Odd" },
{ name: "Zero", arg: 0, want: "Even" },
{ name: "minus Odd", arg: -1, want: "Odd" },
{ name: "minus Even", arg: -2, want: "Even" },
}
for _, tt := range tests {
t.Run(tt.name, func (t *testing.T) {
t.Cleanup(func() {
t.Log("clean up !")
})
defer t.Log("defer!")
if result := EvenOrOdd(tt.arg); result != tt.want {
t.Fatalf("EvenOrOdd() = %v, want %v", result, tt.want)
}
t.Log("after EvenOrOdd() ...")
})
}
}