|
|
@@ -0,0 +1,64 @@
|
|
|
+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)
|
|
|
+}
|