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) }
結果
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