thirose’s blog

openstackやpythonなどなど

A tour of Go の More Types の exercise

Exercise: Slices

この問題を読んでいくと、
この関数は、長さ dy のslice と書かれているので、imageのsliceのlengthはdyが入ることになる。そうなると、image := make([][]uint, dy) となるのが自然な気がします。
次に、各要素が8bitのunsigned int型で長さ dxとなっているので、各列の長さdxとなるはずだから、for文でimageのlenngh = dy のぶんだけ、forを繰り返し、各要素が、dxになります。
なので、forの中で、 image[y] = make()[]uint8, dx) とすると、なんとなく骨格が見えてきました。
最後に各要素に生成する画像のための数式をいれていくと良さそうだなーと思い書きました。

コード

package main

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

func Pic(dx, dy int) [][]uint8 {
    image := make([][]uint8, dy) 
    for y := range image {
        image[y] = make([]uint8, dx)
    }

    for image_y := 0; image_y < dy; image_y++ {
        for image_x := 0; image_x < dx; image_x++ {
            image[image_y][image_x] = uint8((image_x * image_y) / 2)
        }
    }
    return image
}

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

結果

f:id:hirosetakahito:20190101232238p:plain
result_of_slice

exercise-maps.go

コード

package main

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

func WordCount(s string) map[string]int {
    return_value := make(map[string]int)
    str_field := strings.Fields(s)
    for _, value := range(str_field) {
        return_value[value]++
    }
    return return_value
}

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

まずは、returnされるmapを作る。
strings.Fieldsをみると何かヒントが得られるようなことが書かれてるので、ドキュメントを読んでみると、文字列を分割してくれるようなので宣言します。
strings - The Go Programming Language

その値をmapに入れてreturnをすれば、今回importしたgolang.org/x/tour/wc の期待した動作になりました。

結果

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

Fibonacci closure

クロージャを使ってフィボナッチを出力する問題

コード

package main

import "fmt"

// fibonacci is a function that returns
// a function that returns an int.
func fibonacci() func() int {
    previous, next := 0, 1
    return func() int {
        next, previous = previous, next+previous
        return next
    }
}

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

結果

0
1
1
2
3
5
8
13
21
34