package main
import (
"fmt"
"math"
"reflect"
)
func get_partitionr(ss []int) [][][]int {
if len(ss) <= 1 {
// fmt.Printf("first=&v\n", first)
return [][][]int{{ss}}
}
to := int(math.Pow(2, float64(len(ss)))) / 2
out := [][][]int{}
ii := 0
for i := 0; i < to; i++ {
ii = i // need to use another var to avoid mutation of
parts := [][]int{{}, {}}
for _, item := range ss {
ix := ii & 1
parts[ix] = append(parts[ix], item)
ii >>= 1
}
bb := get_partitionr(parts[1])
for _, b := range bb {
p := [][]int{parts[0]}
for _, el := range b {
if len(el) > 0 {
p = append(p, el)
}
}
out = append(out, p)
}
}
return out
}
func main() {
fmt.Println("golang version")
part := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}
lr := get_partitionr(part)
fmt.Println(len(lr))
fmt.Printf("%v\n", reflect.TypeOf(lr))
fmt.Printf("%v\n", lr[0:10])
}