forked from mouredev/roadmap-retos-programacion
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy paththegera4.go
154 lines (122 loc) · 4.45 KB
/
thegera4.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
/*
* EJERCICIO:
* DIFICULTAD EXTRA (opcional):
* Crea un programa que analice dos palabras diferentes y realice comprobaciones
* para descubrir si son:
* - Palíndromos
* - Anagramas
* - Isogramas
*/
package main
import (
"fmt"
"strings"
)
func main() {
//Algunas operaciones con strings. Para mas operaciones revisar documentacion de paquete "strings"
// Acceso a caracteres específicos (ASCII)
fmt.Println("***Acceso a caracteres específicos***")
fmt.Println("Hola"[0]) // 72
fmt.Println("Hola"[1]) // 111
fmt.Println("Hola"[2]) // 108
fmt.Println("Hola"[3]) // 97
// Subcadenas
fmt.Println("***Subcadenas***")
fmt.Println("Hola"[0:2]) // Ho
fmt.Println("Hola"[1:3]) // ol
fmt.Println("Hola"[2:4]) // la
// Longitud
fmt.Println("***Longitud***")
fmt.Println(len("Hola")) // 4
//Count
fmt.Println("***Conteo***")
fmt.Println(strings.Count("Hola mundo", "o")) // 2
// Concatenación
fmt.Println("***Concatenación***")
fmt.Println("Hola" + " mundo") // Hola mundo
var s string = "nuevo"
fmt.Printf("Otro string %s\n",s) // Otro string nuevo
var s1 string = "mas"
var s2 string = "variables"
fmt.Printf("Otro string %s con %s %s\n",s,s1,s2) // Otra cadena doble cadena
// Repetición
fmt.Println("***Repetición***")
fmt.Println(strings.Repeat("Hola", 3)) // HolaHolaHola
// Conversión a mayúsculas y minúsculas
fmt.Println("***Conversión a mayúsculas y minúsculas***")
fmt.Println(strings.ToUpper("Hola")) // HOLA
fmt.Println(strings.ToLower("Hola")) // hola
// Reemplazo
fmt.Println("***Reemplazo***")
fmt.Println(strings.Replace("Hola mundo", "mundo", "gente", 1)) // Hola gente
// División
fmt.Println("***División***")
fmt.Println(strings.Split("Hola mundo", " ")) // [Hola mundo]
// Unión
fmt.Println("***Unión***")
slice := []string{"Hola", "mundo"}
fmt.Println(strings.Join(slice, " ")) // Hola mundo
// Verificación
fmt.Println("***Verificación***")
fmt.Println(strings.Contains("Hola mundo", "mundo")) // true
fmt.Println(strings.Contains("Hola mundo", "gente")) // false
//Prefijo y sufijo
fmt.Println("***Prefijo y sufijo***")
fmt.Println(strings.HasPrefix("Hola mundo", "Hola")) // true
fmt.Println(strings.HasSuffix("Hola mundo", "mundo")) // true
// Palíndromos
fmt.Println("***Extra: Palindromos***")
fmt.Println(isPalindrome("Anita lava la tina")) // true
fmt.Println(isPalindrome("Roma")) // false
// Anagramas
fmt.Println("***Extra: Anagramas***")
fmt.Println(isAnagram("gato", "Toga")) // true
fmt.Println(isAnagram("Anita", "tina")) // false
// Isogramas
fmt.Println("***Extra: Isogramas***")
fmt.Println(isIsogram("murcielago")) // true
fmt.Println(isIsogram("anita")) // false
}
// Palíndromos - Palabras que se leen igual de izquierda a derecha que de derecha a izquierda
func isPalindrome(str string) bool {
str = strings.ToLower(str) // Convierte la cadena a minúsculas
str = strings.Replace(str, " ", "", -1) // Elimina los espacios en blanco
for i := 0; i < len(str)/2; i++ { // Recorre la mitad de la cadena
if str[i] != str[len(str)-1-i] { // Compara el caracter actual con el simétrico
return false // Si no son iguales, regresa false
}
}
return true // Si no se encontraron diferencias, regresa true
}
// Anagramas
func isAnagram(s1, s2 string) bool {
s1 = strings.ToLower(s1) // Convierte las cadenas a minúsculas
s2 = strings.ToLower(s2)
if len(s1) != len(s2) { // Si las cadenas no tienen la misma longitud, regresa false directamente (no pueden ser anagramas)
return false
}
m := make(map[rune]int) // Crea un mapa para contar las ocurrencias de cada caracter
for _, c := range s1 { // Recorre cada caracter de la primera cadena
m[c]++ // Cuenta cuantas veces aparece cada caracter
}
for _, c := range s2 { //Recorre cada caracter de la segunda cadena
m[c]-- // Resta 1 a la cuenta de cada caracter
}
for _, v := range m { // Recorre el mapa
if v != 0 { // Si alguna cuenta no es 0,
return false // regresa false (no son anagramas)
}
}
return true // Si todas las cuentas son 0, regresa true (son anagramas)
}
// Isogramas
func isIsogram(s string) bool {
m := make(map[rune]bool) // Crea un mapa para almacenar los caracteres únicos
for _, c := range s { // Recorre cada caracter de la cadena
if m[c] { // Si el caracter ya está en el mapa,
return false // regresa false (no es un isograma)
}
m[c] = true // Si el caracter no está en el mapa, lo agrega
}
return true // Si no se encontraron caracteres repetidos, regresa true (es un isograma)
}