-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathnumber.go
executable file
·48 lines (39 loc) · 1.26 KB
/
number.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
package solveuranimateur
type NumberIndex int
type NumberValue int
type numbersMap map[NumberIndex]NumberValue
func (values numbersMap) Indexes() []NumberIndex {
indexes := make([]NumberIndex, len(values))
for index := range indexes {
indexes[index] = NumberIndex(index)
}
return indexes
}
func (values numbersMap) iteratePermutations(n int, callback func(permutation []NumberIndex)) {
iterator := &numbersPermutationsIterator{
permuation: make([]NumberIndex, n),
callback: callback,
}
iterator.recursion(values.Indexes(), iterator.permuation)
}
type numbersPermutationsIterator struct {
permuation []NumberIndex
callback func(permutation []NumberIndex)
}
func (iterator *numbersPermutationsIterator) recursion(partialIndexes, partialPermutation []NumberIndex) {
if len(partialPermutation) == 0 {
iterator.callback(iterator.permuation)
return
}
for i := 0; i < len(partialIndexes); i++ {
partialPermutation[0] = partialIndexes[i]
iterator.swap(partialIndexes, i)
iterator.recursion(partialIndexes[1:], partialPermutation[1:])
iterator.swap(partialIndexes, i)
}
}
func (iterator *numbersPermutationsIterator) swap(partialIndexes []NumberIndex, i int) {
tmp := partialIndexes[i]
partialIndexes[i] = partialIndexes[0]
partialIndexes[0] = tmp
}