計算機科学のブログ

関数(とその他の数学とコンピュータに関する予備知識) 入門 モジュールと制御構造、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
%