forked from mouredev/roadmap-retos-programacion
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathFreyFonseca117.go
151 lines (122 loc) · 4.53 KB
/
FreyFonseca117.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
// # #04 CADENAS DE CARACTERES
// > #### Dificultad: Media | Publicación: 22/01/24 | Corrección: 29/01/24
// ## Ejercicio
// ```
// /*
// * EJERCICIO:
// * Muestra ejemplos de todas las operaciones que puedes realizar con cadenas de caracteres
// * en tu lenguaje. Algunas de esas operaciones podrían ser (busca todas las que puedas):
// * - Acceso a caracteres específicos, subcadenas, longitud, concatenación, repetición, recorrido,
// * conversión a mayúsculas y minúsculas, reemplazo, división, unión, interpolación, verificación...
// *
// * DIFICULTAD EXTRA (opcional):
// * Crea un programa que analice dos palabras diferentes y realice comprobaciones
// * para descubrir si son:
// * - Palíndromos
// * - Anagramas
// * - Isogramas
// */
// ```
// #### Tienes toda la información extendida sobre el roadmap de retos de programación en **[retosdeprogramacion.com/roadmap](https://retosdeprogramacion.com/roadmap)**.
// Sigue las **[instrucciones](../../README.md)**, consulta las correcciones y aporta la tuya propia utilizando el lenguaje de programación que quieras.
// > Recuerda que cada semana se publica un nuevo ejercicio y se corrige el de la semana anterior en directo desde **[Twitch](https://twitch.tv/mouredev)**. Tienes el horario en la sección "eventos" del servidor de **[Discord](https://discord.gg/mouredev)**.
package main
import (
"fmt"
"sort"
"strings"
)
// palindromo verifica si una palabra es un palíndromo.
func palindromo(s string) bool {
s = strings.ToLower(s)
runes := []rune(s)
i, j := 0, len(runes)-1
for i < j {
if runes[i] != runes[j] {
return false
}
i++
j--
}
return true
}
// anagrama verifica si dos palabras son anagramas.
func anagrama(a, b string) bool {
a = strings.ReplaceAll(strings.ToLower(a), " ", "")
b = strings.ReplaceAll(strings.ToLower(b), " ", "")
if len(a) != len(b) {
return false
}
aRunes := []rune(a)
bRunes := []rune(b)
// Ordenar los caracteres para comparar
sort.Slice(aRunes, func(i, j int) bool { return aRunes[i] < aRunes[j] })
sort.Slice(bRunes, func(i, j int) bool { return bRunes[i] < bRunes[j] })
return string(aRunes) == string(bRunes)
}
// isograma verifica si una palabra es un isograma (no tiene letras repetidas).
func isograma(s string) bool {
s = strings.ToLower(s)
seen := make(map[rune]bool)
for _, r := range s {
if r < 'a' || r > 'z' { // Ignorar caracteres que no sean letras
continue
}
if seen[r] {
return false
}
seen[r] = true
}
return true
}
func main() {
// OPERACIONES CON CADENAS (STRINGS)
s := "Hello, GoLang!"
fmt.Println("=== OPERACIONES CON STRINGS ===")
// 1. Acceso a caracteres específicos
fmt.Println("Primer carácter:", string(s[0]))
// 2. Subcadenas
fmt.Println("Subcadena (índices 7 a 13):", s[7:13])
// 3. Longitud de la cadena
fmt.Println("Longitud:", len(s))
// 4. Concatenación
s2 := " Welcome!"
fmt.Println("Concatenado:", s+s2)
// 5. Repetición
fmt.Println("Repetido:", strings.Repeat("Go! ", 3))
// 6. Recorrido (iterar sobre cada carácter)
fmt.Print("Recorrido: ")
for _, ch := range s {
fmt.Printf("%c ", ch)
}
fmt.Println()
// 7. Conversión a mayúsculas y minúsculas
fmt.Println("Mayúsculas:", strings.ToUpper(s))
fmt.Println("Minúsculas:", strings.ToLower(s))
// 8. Reemplazo
fmt.Println("Reemplazado:", strings.Replace(s, "GoLang", "Go", 1))
// 9. División y unión
dividido := strings.Split(s, " ")
fmt.Println("Dividido:", dividido)
fmt.Println("Unido:", strings.Join(dividido, " | "))
// 10. Interpolación
fmt.Println("Interpolado:", fmt.Sprintf("La cadena '%s' tiene longitud %d.", s, len(s)))
// 11. Verificación de contenido
fmt.Println("Contiene 'Go':", strings.Contains(s, "Go"))
fmt.Println("Empieza con 'Hello':", strings.HasPrefix(s, "Hello"))
fmt.Println("Termina con '!':", strings.HasSuffix(s, "!"))
// -------------------------------------------------------------------
// DIFICULTAD EXTRA: Análisis de palabras (palíndromos, anagramas, isogramas)
fmt.Println("\n=== ANÁLISIS DE PALABRAS ===")
// Ejemplo para palíndromo
word1, word2 := "racecar", "hello"
fmt.Printf("'%s' es palíndromo? %v\n", word1, palindromo(word1))
fmt.Printf("'%s' es palíndromo? %v\n", word2, palindromo(word2))
// Ejemplo para anagramas
word3, word4 := "listen", "silent"
fmt.Printf("'%s' y '%s' son anagramas? %v\n", word3, word4, anagrama(word3, word4))
// Ejemplo para isograma
word5, word6 := "machine", "programming"
fmt.Printf("'%s' es isograma? %v\n", word5, isograma(word5))
fmt.Printf("'%s' es isograma? %v\n", word6, isograma(word6))
}