関数(とその他の数学とコンピュータに関する予備知識) 入門 モジュールと制御構造、mathモジュール、定数、関数、forループ
行列プログラマー (Philip N. Klein(著)、松田 晃一(翻訳)、弓林 司(翻訳)、脇本 佑紀(翻訳)、中田 洋(翻訳)、齋藤 大吾(翻訳)、オライリー・ジャパン)の0章(関数(とその他の数学とコンピュータに関する予備知識))、0.6(ラボ: Pythonと逆インデックス - モジュールと制御構造)、0.6.1(既存のモジュールの利用)の課題0.6.1、0.6.2、0.6.2(モジュールの作成)の課題0.6.4、0.6.4(字下げによるPythonのグルー化機能)の課題0.6.5の解答をPythonではなくGoで求めてみる。
コード
package main
import (
"fmt"
"math"
"math/rand"
"time"
)
func main() {
fmt.Println("課題0.6.1")
a := 3.0
b := math.Sqrt(a)
c := math.Pow(b, 2)
fmt.Println(a, b, c)
fmt.Println(math.Sqrt(-1))
fmt.Println(math.Cos(math.Pi))
fmt.Println(math.Log(math.E))
fmt.Println("課題0.6.2")
rand.Seed(time.Now().UnixNano())
for i := 0; i < 10; i++ {
fmt.Println(rand.Intn(10))
}
reviews := []string{"見るべし!", "素晴らしい!"}
for i := 0; i < 10; i++ {
fmt.Println(reviews[rand.Intn(len(reviews))])
}
}
入出力結果
% go doc math
package math // import "math"
Package math provides basic constants and mathematical functions.
This package does not guarantee bit-identical results across architectures.
const E = 2.71828182845904523536028747135266249775724709369995957496696763 ...
const MaxFloat32 = 3.40282346638528859811704183484516925440e+38 ...
const MaxInt8 = 1<<7 - 1 ...
func Abs(x float64) float64
...
func Yn(n int, x float64) float64
% go run main.go
課題0.6.1
3 1.7320508075688772 2.9999999999999996
NaN
-1
1
課題0.6.2
1
9
3
7
0
3
8
5
8
4
見るべし!
素晴らしい!
見るべし!
見るべし!
素晴らしい!
見るべし!
素晴らしい!
見るべし!
素晴らしい!
素晴らしい!
課題0.6.4は別のファイルに
課題0.6.5
0
1
4
9
%
コード
maputil.go
package maputil
// MapToSlice ...
func MapToSlice(m map[string]string,
keySlice []string) []string {
t := []string{}
for _, k := range keySlice {
t = append(t, m[k])
}
return t
}
// SliceToMap ...
func SliceToMap(strSlice, keyStrSlice []string) map[string]string {
m := map[string]string{}
for i, v := range strSlice {
m[keyStrSlice[i]] = v
}
return m
}
// SliceRangeToMap ...
func SliceRangeToMap(strSlice []string) map[int]string {
m := map[int]string{}
for i, s := range strSlice {
m[i] = s
}
return m
}
maputil_test.go
package maputil
import "testing"
func TestSliceRangeToMap(t *testing.T) {
s := []string{"A", "B", "C"}
got := SliceRangeToMap(s)
want := map[int]string{0: "A", 1: "B", 2: "C"}
eq := true
if len(got) == len(want) {
for k, v := range got {
if want[k] != v {
eq = false
}
}
} else {
eq = false
}
if !eq {
t.Errorf("SliceRangeToMap(%v) got %v, want %v", s, got, want)
}
}
入出力結果
% go test
# codingmatrix/maputil [codingmatrix/maputil.test]
./maputil_test.go:7:9: undefined: SliceRangeToMap
FAIL codingmatrix/maputil [build failed]
% go test
# codingmatrix/maputil [codingmatrix/maputil.test]
./maputil_test.go:9:9: invalid operation: got != want (map can only be compared to nil)
FAIL codingmatrix/maputil [build failed]
% go test
PASS
ok codingmatrix/maputil 0.441s
%