Skip to content

Commit 4e811ce

Browse files
committed
1 parent b8f8151 commit 4e811ce

File tree

1 file changed

+214
-0
lines changed

1 file changed

+214
-0
lines changed
Lines changed: 214 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,214 @@
1+
package main
2+
3+
import (
4+
"bufio"
5+
"fmt"
6+
"os"
7+
"strings"
8+
"unicode"
9+
)
10+
11+
func main() {
12+
scanner := bufio.NewScanner(os.Stdin)
13+
14+
for {
15+
fmt.Println("Introduce una palabra (o escribe 'exit' para salir):")
16+
scanner.Scan()
17+
palabra := strings.TrimSpace(scanner.Text())
18+
19+
if palabra == "exit" {
20+
break
21+
}
22+
23+
if esPalindromo(palabra) {
24+
fmt.Println(palabra, "es un palíndromo.")
25+
} else {
26+
fmt.Println(palabra, "no es un palíndromo.")
27+
}
28+
29+
if esIsograma(palabra) {
30+
fmt.Println(palabra, "es un isograma.")
31+
} else {
32+
fmt.Println(palabra, "no es un isograma.")
33+
}
34+
35+
fmt.Println("Introduce otra palabra para comparar si son anagramas (o escribe 'exit' para salir):")
36+
scanner.Scan()
37+
otraPalabra := strings.TrimSpace(scanner.Text())
38+
39+
if otraPalabra == "exit" {
40+
break
41+
}
42+
43+
if esAnagrama(palabra, otraPalabra) {
44+
fmt.Println(palabra, "y", otraPalabra, "son anagramas.")
45+
} else {
46+
fmt.Println(palabra, "y", otraPalabra, "no son anagramas.")
47+
}
48+
}
49+
operacioneStrings()
50+
TestStringIterationWithRange()
51+
TestStringEqualsCaseInsensitive()
52+
}
53+
54+
func operacioneStrings() {
55+
// Imprimir cadena
56+
fmt.Println("Let's print out this string.")
57+
// Concatenar
58+
fmt.Println("Sammy" + "Shark")
59+
// Aplicar mayúsculas y minúsculas
60+
ss := "Sammy Shark"
61+
fmt.Println(strings.ToUpper(ss))
62+
fmt.Println(strings.ToLower(ss))
63+
// Funciones de busqueda de cadena
64+
/* strings.HasPrefix Realiza búsquedas en la cadena desde el principio.
65+
strings.HasSuffix Realiza búsquedas en la cadena desde el final.
66+
strings.Contains Realiza búsquedas en cualquier parte de la cadena.
67+
strings.Count Cuenta la cantidad de veces que aparece la cadena.*/
68+
fmt.Println(strings.HasPrefix(ss, "Sammy"))
69+
fmt.Println(strings.HasSuffix(ss, "Shark"))
70+
fmt.Println(strings.Contains(ss, "Sh"))
71+
fmt.Println(strings.Count(ss, "S"))
72+
// Determina la longuitud de la cadena
73+
openSource := "Jhon contributes to open source."
74+
fmt.Println(len(openSource))
75+
// manipulación de Cadenas, strings.Join, strings.Split, strings.ReplaceAll
76+
fmt.Println(strings.Join([]string{"sharks", "crustaceans", "plankton"}, ","))
77+
balloon := "Sammy has a balloon."
78+
s := strings.Split(balloon, " ")
79+
fmt.Printf("%q", s)
80+
fmt.Println()
81+
// strings Filed ignora espacios en blanco
82+
data := " username password email date"
83+
fields := strings.Fields(data)
84+
fmt.Printf("%q", fields)
85+
// ReplaceAll toma uan cadena original y realiza una sustitución
86+
fmt.Println(strings.ReplaceAll(balloon, "has", "had"))
87+
// Eliminar espacios en blanco
88+
fmt.Println(strings.TrimSpace(data)) // que pasa aqui ?
89+
fmt.Println(strings.TrimSpace(" \t\n Hello, Gophers \n\t\r\n"))
90+
// Trim retorna un slice del string quitando
91+
fmt.Println(strings.Trim("¡¡¡Hello, Gophers!!!", "!¡"))
92+
// Builder para construir un string
93+
words := []string{"Hola", " ", "Mundo"}
94+
95+
var builder strings.Builder
96+
97+
for _, w := range words {
98+
builder.WriteString(w)
99+
}
100+
101+
result := builder.String()
102+
fmt.Println(result)
103+
// Comparar tamaño
104+
105+
// create three strings
106+
string1 := "Programiz"
107+
string2 := "Programiz Pro"
108+
string3 := "Programiz"
109+
110+
// compare strings
111+
fmt.Println(string1+" vs "+string2+":", strings.Compare(string1, string2)) // -1
112+
fmt.Println(string2+" vs "+string3+":", strings.Compare(string2, string3)) // 1
113+
fmt.Println(string1+" vs "+string3+":", strings.Compare(string1, string3)) // 0
114+
}
115+
116+
// Iterar sobre un String
117+
func TestStringIterationWithRange() {
118+
fmt.Println()
119+
namestring := "omar barra"
120+
for _, v := range namestring {
121+
fmt.Printf("%q\n", v)
122+
}
123+
}
124+
125+
// Compara igualdad sin importar case
126+
func TestStringEqualsCaseInsensitive() {
127+
got := "Go is Awesome!"
128+
expect := "go is awesome!"
129+
130+
if !strings.EqualFold(got, expect) {
131+
fmt.Printf("expected %s got %s", expect, got)
132+
}
133+
}
134+
135+
func esPalindromo(s string) bool {
136+
s = strings.ToLower(s)
137+
izquierda := 0
138+
derecha := len(s) - 1
139+
140+
for izquierda < derecha {
141+
// Avanzar izquierda si no es letra o número
142+
for izquierda < derecha && !unicode.IsLetter(rune(s[izquierda])) && !unicode.IsNumber(rune(s[izquierda])) {
143+
izquierda++
144+
}
145+
// Retroceder derecha si no es letra o número
146+
for izquierda < derecha && !unicode.IsLetter(rune(s[derecha])) && !unicode.IsNumber(rune(s[derecha])) {
147+
derecha--
148+
}
149+
150+
if s[izquierda] != s[derecha] {
151+
return false
152+
}
153+
154+
izquierda++
155+
derecha--
156+
}
157+
158+
return true
159+
}
160+
161+
func esAnagrama(palabra1, palabra2 string) bool {
162+
// contienen el mismo número de ocurrencias de cada letra en orden diferente
163+
if len(palabra1) != len(palabra2) {
164+
return false
165+
}
166+
cuenta := make(map[rune]int)
167+
168+
for _, letra := range strings.ToLower(palabra1) {
169+
if unicode.IsLetter(letra) {
170+
cuenta[letra]++
171+
}
172+
}
173+
174+
for _, letra := range strings.ToLower(palabra2) {
175+
if unicode.IsLetter(letra) {
176+
cuenta[letra]--
177+
if cuenta[letra] < 0 {
178+
return false
179+
}
180+
}
181+
}
182+
183+
for _, valor := range cuenta {
184+
if valor != 0 {
185+
return false
186+
}
187+
}
188+
189+
return true
190+
}
191+
func esIsograma(palabra string) bool {
192+
// No tiene letras repetidas
193+
usado := make(map[rune]bool)
194+
for _, letra := range strings.ToLower(palabra) {
195+
if letra == '-' || letra == ' ' {
196+
continue
197+
}
198+
if _, ok := usado[letra]; ok {
199+
return false
200+
}
201+
usado[letra] = true
202+
}
203+
return true
204+
}
205+
func InvertirString(s string) string {
206+
// Convierte el string a un slice de runas para manejar adecuadamente caracteres Unicode.
207+
runas := []rune(s)
208+
for i, j := 0, len(runas)-1; i < j; i, j = i+1, j-1 {
209+
// Intercambia los elementos.
210+
runas[i], runas[j] = runas[j], runas[i]
211+
}
212+
// Convierte el slice de runas de vuelta a string.
213+
return string(runas)
214+
}

0 commit comments

Comments
 (0)