-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmutator_vowel_change.go
68 lines (56 loc) · 1.76 KB
/
mutator_vowel_change.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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
// Archivo: vowels.go
package mutator
import (
"math/rand"
)
// Conjunto de vocales en minúsculas y mayúsculas
var lowercaseVowels = "aeiou"
var uppercaseVowels = "AEIOU"
// Función para cambiar las vocales en el texto
func (m *Mutator) vowelChange(runes []rune, mutationType MutationType) []rune {
var counterVowelChange int
var validPositions []int
// Encuentra las posiciones de las vocales en la cadena
for i, r := range runes {
if containsRune(lowercaseVowels+uppercaseVowels, r) {
validPositions = append(validPositions, i)
}
}
// Baraja las posiciones válidas para el cambio de vocales
rand.Shuffle(len(validPositions), func(i, j int) {
validPositions[i], validPositions[j] = validPositions[j], validPositions[i]
})
// Cambia las vocales en las posiciones aleatorias
for i := 0; i < len(validPositions) && counterVowelChange < mutationType.Length; i++ {
pos := validPositions[i]
oldVowel := runes[pos]
// Genera una nueva vocal diferente de la vocal actual
newVowel := m.randomDifferentVowel(oldVowel)
runes[pos] = newVowel // Cambia la vocal
counterVowelChange++
}
return runes
}
// Helper para seleccionar una vocal aleatoria diferente de la vocal actual
func (m *Mutator) randomDifferentVowel(currentVowel rune) rune {
var newVowel rune
var vowelSet string
// Determina el conjunto de vocales en función del caso de la vocal actual
if isLowercase(currentVowel) {
vowelSet = lowercaseVowels
} else {
vowelSet = uppercaseVowels
}
// Genera una nueva vocal diferente de la vocal actual
for {
newVowel = rune(vowelSet[rand.Intn(len(vowelSet))])
if newVowel != currentVowel {
break
}
}
return newVowel
}
// Función para verificar si un rune es minúscula
func isLowercase(r rune) bool {
return r >= 'a' && r <= 'z'
}