forked from mouredev/roadmap-retos-programacion
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmiguelex.go
188 lines (146 loc) · 5.79 KB
/
miguelex.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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
package main
import (
"fmt"
"sort"
"strings"
)
func main() {
// Operaciones básicas sobre cadenas de texto
texto := "Hola, mundo!"
// Interpolación de cadenas (uso de plantillas de cadena)
nombre := "Migue"
lenguaje := "PHP"
mensaje := fmt.Sprintf("Hola, me llamo %s y trabajo con %s años.", nombre, lenguaje)
fmt.Println(mensaje)
// Longitud de la cadena
longitud := len(texto)
fmt.Printf("La longitud de la cadena %s es %d caracteres\n", texto, longitud)
// Obtener el carácter en una posición específica
primerCaracter := string(texto[0])
fmt.Printf("El primer carácter de %s es %s\n", texto, primerCaracter)
// Concatenar dos cadenas
nuevaCadena := texto + " Go"
fmt.Printf("La nueva cadena de unir %s con Go es %s\n", texto, nuevaCadena)
// Convertir la cadena a minúsculas
minusculas := strings.ToLower(texto)
fmt.Printf("%s en minúsculas es %s\n", texto, minusculas)
// Convertir la cadena a mayúsculas
mayusculas := strings.ToUpper(texto)
fmt.Printf("%s en mayúsculas es %s\n", texto, mayusculas)
// Obtener una subcadena
subcadena := texto[0:4]
fmt.Printf("La subcadena de %s entre las posiciones 0 y 4 es %s\n", texto, subcadena)
// Reemplazar parte de la cadena
reemplazada := strings.Replace(texto, "Hola", "Saludos", 1)
fmt.Printf("Vamos a reemplazar Hola por Saludos: %s\n", reemplazada)
// Operaciones adicionales sobre cadenas de texto
textoConEspacios := " Hola, mundo! "
// Eliminar espacios en blanco al principio y al final
sinEspaciosExtremos := strings.TrimSpace(textoConEspacios)
fmt.Printf("Cadena sin espacios al principio y al final: %s\n", sinEspaciosExtremos)
// Eliminar todos los espacios en blanco
sinEspacios := strings.ReplaceAll(textoConEspacios, " ", "")
fmt.Printf("Cadena sin espacios: %s\n", sinEspacios)
// Unión de dos cadenas
cadena1 := "Moure"
cadena2 := "Dev"
unionCadenas := fmt.Sprintf("%s %s", cadena1, cadena2)
fmt.Printf("La unión de las cadenas %s y %s es %s\n", cadena1, cadena2, unionCadenas)
// Intersección de dos cadenas (caracteres comunes)
interseccionCadenas := interseccionDeCadenas(cadena1, cadena2)
fmt.Printf("Intersección de las cadenas %s y %s es %s\n", cadena1, cadena2, interseccionCadenas)
// Acceso a caracteres específicos (por posición)
tercerCaracter := string(texto[2])
fmt.Printf("El tercer carácter de %s es %s\n", texto, tercerCaracter)
// Repetición de una cadena
cadenaRepetida := strings.Repeat("Hola ", 3)
fmt.Printf("Cadena Hola repetida 3 veces queda %s\n", cadenaRepetida)
// Recorrido de una cadena (usando un bucle)
for i, char := range texto {
fmt.Printf("Carácter en posición %d: %c\n", i, char)
}
// Conversión a título (primera letra en mayúscula)
titulo := strings.Title(strings.ToLower(texto))
fmt.Printf("La cadena %s como título %s\n", texto, titulo)
// División de una cadena en un array de substrings
palabras := strings.Fields(texto)
fmt.Printf("Palabras en la cadena %s son %v\n", texto, palabras)
// Verificación de si una cadena comienza o termina con ciertos caracteres
comienzaCon := strings.HasPrefix(texto, "Hola")
fmt.Printf("¿La cadena %s comienza con 'Hola'? %t\n", texto, comienzaCon)
terminaCon := strings.HasSuffix(texto, "mundo!")
fmt.Printf("¿La cadena %s termina con 'mundo!'? %t\n", texto, terminaCon)
// Verificar si una cadena es palíndromo
fmt.Printf("¿Es '%s' un palíndromo? %t\n", texto, esPalindromo(texto))
fmt.Printf("¿Es 'Ana' un palíndromo? %t\n", esPalindromo("Ana"))
// Verificar si una cadena es un anagrama
fmt.Printf("¿Es 'listen' un anagrama de 'silent'? %t\n", esAnagrama("listen", "silent"))
// Verificar si una cadena es un isograma
fmt.Printf("¿Es 'programming' un isograma? %t\n", esIsograma("programming"))
}
// Función para la intersección de dos cadenas (caracteres comunes)
func interseccionDeCadenas(cadena1, cadena2 string) string {
set1 := make(map[rune]struct{})
set2 := make(map[rune]struct{})
for _, char := range cadena1 {
set1[char] = struct{}{}
}
for _, char := range cadena2 {
set2[char] = struct{}{}
}
var interseccion []rune
for char := range set1 {
if _, exists := set2[char]; exists {
interseccion = append(interseccion, char)
}
}
sort.Slice(interseccion, func(i, j int) bool {
return interseccion[i] < interseccion[j]
})
return string(interseccion)
}
// Función para verificar si una cadena es palíndromo
func esPalindromo(cadena string) bool {
sinEspacios := strings.Join(strings.Fields(cadena), "")
invertida := invertirCadena(sinEspacios)
return strings.ToLower(sinEspacios) == strings.ToLower(invertida)
}
// Función para invertir una cadena
func invertirCadena(cadena string) string {
runes := []rune(cadena)
for i, j := 0, len(runes)-1; i < j; i, j = i+1, j-1 {
runes[i], runes[j] = runes[j], runes[i]
}
return string(runes)
}
// Función para verificar si una cadena es un anagrama
func esAnagrama(cadena1, cadena2 string) bool {
limpiaCadena := func(cadena string) string {
return strings.Join(strings.Fields(cadena), "")
}
limpiaCadena1 := limpiaCadena(cadena1)
limpiaCadena2 := limpiaCadena(cadena2)
return ordenarCadena(limpiaCadena1) == ordenarCadena(limpiaCadena2)
}
// Función para ordenar una cadena
func ordenarCadena(cadena string) string {
runes := []rune(cadena)
sort.Sort(sortRunes(runes))
return string(runes)
}
// Tipo de datos para ordenar los runes
type sortRunes []rune
func (s sortRunes) Len() int { return len(s) }
func (s sortRunes) Less(i, j int) bool { return s[i] < s[j] }
func (s sortRunes) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
// Función para verificar si una cadena es un isograma
func esIsograma(cadena string) bool {
caracteres := make(map[rune]struct{})
for _, char := range cadena {
if _, exists := caracteres[char]; exists {
return false
}
caracteres[char] = struct{}{}
}
return true
}