計算機科学のブログ

関数(とその他の数学とコンピュータに関する予備知識) 入門 集合 mapで代用、共通部分、forループ、range

行列プログラマー (Philip N. Klein(著)、松田 晃一(翻訳)、弓林 司(翻訳)、脇本 佑紀(翻訳)、中田 洋(翻訳)、齋藤 大吾(翻訳)、オライリー・ジャパン)の0章(関数(とその他の数学とコンピュータに関する予備知識))、0.5(ラボ: Python入門 - 集合、リスト、辞書、内包表記)、0.5.4(集合)の課題0.5.5、0.5.6、0.5.7、0.5.8、0.5.9の解答をPythonではなくGoで求めてみる。

コード

package main

import (
	"fmt"
	"math"
)

// IntegerSet ...
type IntegerSet map[int]bool

// NewIntegerSet ...
func NewIntegerSet(nums []int) IntegerSet {
	numSet := IntegerSet(map[int]bool{})
	for _, num := range nums {
		numSet[num] = true
	}
	return numSet
}

// NewEmptyIntegerSet ...
func NewEmptyIntegerSet() IntegerSet {
	return IntegerSet(map[int]bool{})
}
func main() {
	fmt.Println("課題0.5.5")
	nums := NewIntegerSet([]int{1, 2, 3, 4, 5})
	fmt.Println(nums)
	squareNums := NewEmptyIntegerSet()
	for num := range nums {
		squareNums[num*num] = true
	}
	fmt.Println(nums)
	fmt.Println(squareNums)
	fmt.Println("課題0.5.6")
	nums = NewIntegerSet([]int{0, 1, 2, 3, 4})
	power2nums := NewEmptyIntegerSet()
	for num := range nums {
		power2nums[int(math.Pow(2, float64(num)))] = true
	}
	fmt.Println(power2nums)
	fmt.Println("課題0.5.7")
	nums = NewEmptyIntegerSet()
	nums1 := NewIntegerSet([]int{1, 2, 3})
	nums2 := NewIntegerSet([]int{2, 3, 4})
	for num1 := range nums1 {
		for num2 := range nums2 {
			nums[num1*num2] = true
		}
	}
	fmt.Println(nums)
	fmt.Println("課題0.5.8")
	nums = NewEmptyIntegerSet()
	nums1 = NewIntegerSet([]int{1, 3, 5})
	nums2 = NewIntegerSet([]int{2, 4, 6})
	for num1 := range nums1 {
		for num2 := range nums2 {
			if num1*num2 < 18 {
				nums[num1*num2] = true
			}
		}
	}
	fmt.Println(nums)
	fmt.Println(len(nums))
	fmt.Println("課題0.5.9")
	s := NewIntegerSet([]int{1, 2, 3, 4})
	t := NewIntegerSet([]int{3, 4, 5, 6})
	nums = NewEmptyIntegerSet()
	for n := range s {
		for m := range t {
			if n == m {
				nums[n] = true
			}
		}
	}
	fmt.Println(s)
	fmt.Println(t)
	fmt.Println(nums)
}

入出力結果

% go run ./main.go
課題0.5.5
map[1:true 2:true 3:true 4:true 5:true]
map[1:true 2:true 3:true 4:true 5:true]
map[1:true 4:true 9:true 16:true 25:true]
課題0.5.6
map[1:true 2:true 4:true 8:true 16:true]
課題0.5.7
map[2:true 3:true 4:true 6:true 8:true 9:true 12:true]
課題0.5.8
map[2:true 4:true 6:true 10:true 12:true]
5
課題0.5.9
map[1:true 2:true 3:true 4:true]
map[3:true 4:true 5:true 6:true]
map[3:true 4:true]
%