J'essaie de créer un programme capable de générer des combinaisons à partir d'une plage donnée.Générer des combinaisons à partir d'une plage donnée
j'ai commencé à éditer ce code ci-dessous qui génère des combinaisons:
package main
import "fmt"
func nextPassword(n int, c string) func() string {
r := []rune(c)
p := make([]rune, n)
x := make([]int, len(p))
return func() string {
p := p[:len(x)]
for i, xi := range x {
p[i] = r[xi]
}
for i := len(x) - 1; i >= 0; i-- {
x[i]++
if x[i] < len(r) {
break
}
x[i] = 0
if i <= 0 {
x = x[0:0]
break
}
}
return string(p)
}
}
func main() {
np := nextPassword(2, "ABCDE")
for {
pwd := np()
if len(pwd) == 0 {
break
}
fmt.Println(pwd)
}
}
Ceci est la sortie du code:
AA
AB
AC
AD
AE
BA
BB
BC
BD
BE
CA
CB
CC
CD
CE
DA
DB
DC
DD
DE
EA
EB
EC
ED
EE
Et ceci est le code que j'édité:
package main
import "fmt"
const (
Min = 5
Max = 10
)
func nextPassword(n int, c string) func() string {
r := []rune(c)
p := make([]rune, n)
x := make([]int, len(p))
return func() string {
p := p[:len(x)]
for i, xi := range x {
p[i] = r[xi]
}
for i := len(x) - 1; i >= 0; i-- {
x[i]++
if x[i] < len(r) {
break
}
x[i] = 0
if i <= 0 {
x = x[0:0]
break
}
}
return string(p)
}
}
func main() {
cont := 0
np := nextPassword(2, "ABCDE")
for {
pwd := np()
if len(pwd) == 0 {
break
}
if cont >= Min && cont <= Max{
fmt.Println(pwd)
} else if cont > Max{
break
}
cont += 1
}
}
Sortie:
BA
BB
BC
BD
BE
CA
Mon code fonctionne, mais si j'augmente la longueur de la combinaison et que ma gamme commence à partir du milieu, le programme générera même les combinaisons que je ne veux pas (et bien sûr cela prendra beaucoup de temps) . Comment puis-je résoudre ce problème?
Pouvez-vous réduire cela à code minimum nécessaire pour reproduire le problème, et de préciser exactement ce que la question est? – Adrian
Avez-vous modifié la fonction 'nextPassword'? Ugh, quiconque a écrit cette fonction l'a délibérément obscurci, ou a besoin d'une leçon de noms de variables utiles. – RayfenWindspear