higan96技術メモ

https://github.com/higan96

Go TourのExercise

GoのTourのExerciseの回答

go-tour-jp.appspot.com

プログラミング言語 Goには、初学者が言語仕様を学べるTourというコンテンツがあります。

その中に練習問題(Exercise)があったので、自分の回答を学習メモとして記していきます。

Exercise: Slices

A Tour of Go

これちょっと説明文が分かりづらい気がしました。Pixメソッドの仕様のポイントを羅列します。

  • Picメソッドの引数で受け取るdx×dyのサイズの2次元配列を返す
  • 配列の中身は各座標のxyをもとにした整数値(uint8)を渡す
    • 別にxyをもとにしなくても整数値が0〜255の範囲であれば画像は生成される
      • 0を渡せば青一色の画像になる
    • 中身の整数値によって青色の濃さが変わる
      • 0に近いほど色が濃くなり、255に近いほど色が薄くなる
    • 例示されている整数値の計算パターン は使わなくてもよい
      • (x+y)/2x*yx^yが面白い画像ができるというだけ

コード

package main

import "golang.org/x/tour/pic"

func Pic(dx, dy int) [][]uint8 {
    // 2次元配列の初期化
    pic := make([][]uint8, dy)
    for y := 0; y < dy ;y++ {
        // 横列の配列を初期化
        row := make([]uint8, dx)
        for x := 0; x < dx ;x++ {
            // 色を表現する整数値を代入
            row[x] = uint8((x+y)/2)
        }
        // 横列の配列を保存
        pic[y] = row
    }
    return pic
}

func main() {
    pic.Show(Pic)
}

出力

f:id:higan_n:20190629144853p:plain

Exercise: Maps

A Tour of Go

コード

package main

import (
    "golang.org/x/tour/wc"
    "strings"
)

func WordCount(s string) map[string]int {
    // 文字列をスライスに分割
    words := strings.Fields(s)
    // Mapsの初期化
    m := make(map[string]int)
    // intのゼロ値は0なので、同じ単語(同じKey)のたびに1を足す
    // m[value]++でも可
    for _, value := range words {
        m[value] = m[value] + 1
    }
    return m
}

func main() {
    wc.Test(WordCount)
}

出力

PASS
 f("I am learning Go!") = 
  map[string]int{"Go!":1, "I":1, "am":1, "learning":1}
PASS
 f("The quick brown fox jumped over the lazy dog.") = 
  map[string]int{"The":1, "brown":1, "dog.":1, "fox":1, "jumped":1, "lazy":1, "over":1, "quick":1, "the":1}
PASS
 f("I ate a donut. Then I ate another donut.") = 
  map[string]int{"I":2, "Then":1, "a":1, "another":1, "ate":2, "donut.":2}
PASS
 f("A man a plan a canal panama.") = 
  map[string]int{"A":1, "a":2, "canal":1, "man":1, "panama.":1, "plan":1}

Exercise: Fibonacci closure

A Tour of Go

コード

package main

import "fmt"

func fibonacci() func() int {
    // 保存されるスライスの`s`
    s := []int{}
    return func () int {
        length := len(s)
        value:= 0
        switch length {
            case 0:
                value = 0
            case 1:
                value = 1
            default:
                value = s[length - 1] + s[length - 2]
        }
        s = append(s, value)
        return value
    }
}

func main() {
    f := fibonacci()
    for i := 0; i < 10; i++ {
        fmt.Println(f())
    }
}

出力

0
1
1
2
3
5
8
13
21
34