LoginSignup
0
0

More than 1 year has passed since last update.

GoのEven Or Oddの問題から解決方法の豊富さ

Posted at

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() ...")
        })
    }
}
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0