Skip to content

Instantly share code, notes, and snippets.

@iandioch
Created December 30, 2015 04:00
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save iandioch/50486513d65b8165c7f2 to your computer and use it in GitHub Desktop.
Save iandioch/50486513d65b8165c7f2 to your computer and use it in GitHub Desktop.
Basic permutation functions for Ints and Bytes in Go
// to use these functions, place this file in ./permute/permute.go and import "./permute"
// uses the "recursive algorithm" method from here: http://www.cut-the-knot.org/do_you_know/AllPerm.shtml
package permute
var level int
var value []int
var N int
var num int
var intPerms [][]int
var bytePerms [][]byte
func visitInt(k int, input []int) {
level += 1
value[k] = level
if level == N {
num ++
arr := make([]int, len(value))
for i, v := range value {
arr[i] = input[v-1]
}
intPerms = append(intPerms, arr)
}else {
for i := 0; i < N; i ++ {
if value[i] == 0 {
visitInt(i,input)
}
}
}
level --
value[k] = 0
}
func visitByte(k int, input []byte) {
level += 1
value[k] = level
if level == N {
num ++
arr := make([]byte, len(value))
for i, v := range value {
arr[i] = input[v-1]
}
bytePerms = append(bytePerms, arr)
}else {
for i := 0; i < N; i ++ {
if value[i] == 0 {
visitByte(i,input)
}
}
}
level --
value[k] = 0
}
func Ints(in []int) [][]int{
value = make([]int, len(in))
for i := range value {
value[i] = 0
}
intPerms = [][]int{}
N = len(in)
level = -1
num = 0
visitInt(0,in)
return intPerms
}
func Bytes(in []byte) [][]byte {
value = make([]int, len(in))
for i := range value {
value[i] = 0
}
bytePerms = [][]byte{}
N = len(in)
level = -1
num = 0
visitByte(0,in)
return bytePerms
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment