package main import ( "fmt" "os" ) func numEquivDominoPairs(dominoes [][]int) int { var ret int = 0 var out_size int = len(dominoes) var seen map[string][]int = make(map[string][]int) var ok bool var i int = 0 for i = 0; i < out_size; i += 1 { var a, b rune = rune(dominoes[i][0]), rune(dominoes[i][1]) var key string = string([]rune{a, b}) var idxs []int idxs, ok = seen[key] if ok { seen[key] = append(idxs, i); continue } var inv_key string = string([]rune{b, a}) idxs, ok = seen[inv_key] if ok { seen[inv_key] = append(idxs, i); continue } seen[key] = []int{ i } } permuts_num := func (list []int) int { var ret int = 0 var list_size int = len(list) var i int = 0 for ; i < list_size; i += 1 { var j int = i+1 for ; j < list_size; j += 1 { ret += 1 } } return ret } for _, v := range seen { ret += permuts_num(v) } return ret } func main() { r := func(dominoes [][]int, exp int) { fmt.Printf( "numEquivDominoPairs(%v) = %v | exp: %v\n", dominoes, numEquivDominoPairs(dominoes), exp, ) } r([][]int{{1, 2}, {2, 1}, {3, 4}, {5, 6}}, 1) r([][]int{{1, 2}, {1, 2}, {1, 1}, {1, 2}, {2, 2}}, 3) r([][]int{{2, 1}, {1, 2}, {1, 2}, {1, 2}, {2, 1}, {1, 1}, {1, 2}, {2, 2}}, 15) os.Exit(0) }