計算機科学のブログ

関数(とその他の数学とコンピュータに関する予備知識) 入門 タプルの代わりに配列、配列のスライス

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

コード

package main

import "fmt"

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

// NewIntegerSet ...
func NewIntegerSet(ns []int) IntegerSet {
	t := map[int]bool{}
	for _, n := range ns {
		t[n] = true
	}
	return IntegerSet(t)
}
func main() {
	fmt.Println("課題0.5.14")
	s := NewIntegerSet([]int{-4, -2, 1, 2, 5, 0})
	arySlice := [][3]int{}
	for i := range s {
		for j := range s {
			for k := range s {
				if i+j+k == 0 {
					arySlice = append(arySlice, [3]int{i, j, k})
				}
			}
		}
	}
	fmt.Println(arySlice)
	fmt.Println("課題0.5.15")
	arySlice = [][3]int{}
	for i := range s {
		for j := range s {
			for k := range s {
				if !(i == 0 && j == 0 && k == 0) && i+j+k == 0 {
					arySlice = append(arySlice, [3]int{i, j, k})
				}
			}
		}
	}
	fmt.Println(arySlice)
	fmt.Println("課題0.5.16")
	fmt.Println(arySlice[0])
}

入出力結果

% go run ./main.go
課題0.5.14
[[-4 2 2] [-2 0 2] [-2 1 1] [-2 2 0] [1 1 -2] [1 -2 1] [2 2 -4] [2 0 -2] [2 -4 2] [2 -2 0] [0 0 0] [0 -2 2] [0 2 -2]]
課題0.5.15
[[-2 1 1] [-2 2 0] [-2 0 2] [1 -2 1] [1 1 -2] [2 -2 0] [2 2 -4] [2 0 -2] [2 -4 2] [0 -2 2] [0 2 -2] [-4 2 2]]
課題0.5.16
[-2 1 1]
%