Skip to content

Instantly share code, notes, and snippets.

@kylelemons
Created December 9, 2012 05:58
Show Gist options
  • Select an option

  • Save kylelemons/4243521 to your computer and use it in GitHub Desktop.

Select an option

Save kylelemons/4243521 to your computer and use it in GitHub Desktop.
Project Euler #24 in Go - Answer: [2 7 8 3 9 1 5 4 6 0]
package main
import (
"fmt"
)
var _ = fmt.Printf
const Max = 10
const Index = 1000000 - 1
func main() {
numbers := make([]byte, 0, Max)
for i := 0; i < Max; i++ {
numbers = append(numbers, byte(i))
}
count := 1
for i := 2; i <= Max; i++ {
count *= i
}
if count > Index {
count = Index+1
}
perms = make([][Max]byte, 0, count)
perm(numbers, 0, len(numbers))
if len(perms) > Index {
fmt.Println(perms[Index])
} else {
fmt.Println("only", len(perms), "perms generated")
}
}
var perms [][Max]byte
func perm(numbers []byte, lo, hi int) {
if len(perms) > Index {
return
}
if hi-lo < 2 {
var p [Max]byte
copy(p[:], numbers)
perms = append(perms, p)
return
}
for i := 1; i < hi-lo+1; i++ {
rotateR(numbers, lo, lo+i)
perm(numbers, lo+1, hi)
rotateL(numbers, lo, lo+i)
}
}
func rotateL(numbers []byte, lo, hi int) {
for i := lo + 1; i < hi; i++ {
numbers[i-1], numbers[i] = numbers[i], numbers[i-1]
}
}
func rotateR(numbers []byte, lo, hi int) {
for i := hi - 1; i > lo; i-- {
numbers[i-1], numbers[i] = numbers[i], numbers[i-1]
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment