Skip to content

Commit 666e025

Browse files
authored
Merge pull request #1106 from juandaherrera/develop
#4 - Python
2 parents 64c6539 + 013af03 commit 666e025

File tree

1 file changed

+140
-0
lines changed

1 file changed

+140
-0
lines changed
Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
1+
"""
2+
*
3+
* DIFICULTAD EXTRA (opcional):
4+
* Crea un programa que analice dos palabras diferentes y realice comprobaciones
5+
* para descubrir si son:
6+
* - Palíndromos
7+
* - Anagramas
8+
* - Isogramas
9+
*
10+
"""
11+
from collections import Counter
12+
from typing import Callable, Optional
13+
14+
REPLACEMENTS = (("á", "a"), ("é", "e"), ("í", "i"), ("ó", "o"), ("ú", "u"), (" ", ""))
15+
16+
17+
def replace_special_characters(input: str) -> str:
18+
"""Reemplaza caracteres especiales en una cadena con sus equivalentes sin tilde.
19+
20+
Args:
21+
input_str (str): La cadena de entrada que puede contener caracteres especiales.
22+
23+
Returns:
24+
str: La cadena resultante con los caracteres especiales reemplazados.
25+
"""
26+
for a, b in REPLACEMENTS:
27+
input = input.replace(a, b)
28+
return input
29+
30+
31+
def string_to_list(input: str) -> list:
32+
"""Convierte una cadena en una lista de caracteres.
33+
34+
Args:
35+
input_str (str): La cadena de entrada.
36+
37+
Returns:
38+
list: Lista de caracteres individuales de la cadena de entrada.
39+
"""
40+
return [letter for letter in input]
41+
42+
43+
def is_palindrome(input: str) -> bool:
44+
"""Verifica si una cadena es un palíndromo.
45+
46+
Args:
47+
input_str (str): La cadena de entrada.
48+
49+
Returns:
50+
bool: True si la cadena es un palíndromo, False en caso contrario.
51+
"""
52+
modified_input = replace_special_characters(input.lower())
53+
return modified_input == modified_input[::-1]
54+
55+
56+
def is_anagram(input_1: str, input_2: str) -> bool:
57+
"""Verifica si dos cadenas son anagramas entre sí.
58+
59+
Args:
60+
input_1 (str): La primera cadena.
61+
input_2 (str): La segunda cadena.
62+
63+
Returns:
64+
bool: True si las cadenas son anagramas, False en caso contrario.
65+
"""
66+
if len(input_1) != len(input_2):
67+
return False
68+
new_input_1, new_input_2 = replace_special_characters(input_1.lower()), replace_special_characters(input_2.lower())
69+
new_input_1, new_input_2 = sorted(string_to_list(new_input_1)), sorted(string_to_list(new_input_2))
70+
71+
return new_input_1 == new_input_2
72+
73+
74+
def is_isogram(input: str) -> bool:
75+
"""Verifica si una cadena es un isograma (no repite ninguna letra).
76+
77+
Args:
78+
input_str (str): La cadena de entrada.
79+
80+
Returns:
81+
bool: True si la cadena es un isograma, False en caso contrario.
82+
"""
83+
input = replace_special_characters(input)
84+
counter = Counter(sorted(string_to_list(input)))
85+
return max(counter.values()) == 1
86+
87+
88+
def request_input(prompt: str, validation: Optional[Callable[[str], bool]] = None) -> str:
89+
"""Solicita entrada al usuario hasta que cumpla con la validación.
90+
91+
Args:
92+
prompt (str): El mensaje a mostrar al usuario.
93+
validation (Optional[Callable[[str], bool]]): La función de validación que debe pasar la entrada.
94+
95+
Returns:
96+
str: La entrada del usuario que pasó la validación.
97+
"""
98+
while True:
99+
user_input = input(prompt)
100+
if not validation or validation(user_input):
101+
return user_input
102+
103+
104+
def main():
105+
while True:
106+
print("-------------------------------------------------")
107+
print("1. Validar si una palabra es palíndroma.")
108+
print("2. Validar dos palabras son anagramas.")
109+
print("3. Validar si una palabra es isograma.")
110+
print("4. Salir del programa.")
111+
option = input("Ingrese su opción: ")
112+
match option:
113+
case "1":
114+
word = request_input("Ingresa la palabra: ")
115+
response = (
116+
f"La palabra {word} es palíndroma" if is_palindrome(word) else f"La palabra {word} NO es palíndroma"
117+
)
118+
print(response)
119+
case "2":
120+
word_1 = request_input("Ingresa la primera palabra: ")
121+
word_2 = request_input("Ingresa la segunda palabra: ")
122+
response = (
123+
f"{word_1} y {word_2} son anagramas"
124+
if is_anagram(word_1, word_2)
125+
else f"{word_1} y {word_2} NO son anagramas"
126+
)
127+
print(response)
128+
case "3":
129+
word = request_input("Ingresa la palabra: ")
130+
response = f"La palabra {word} es isograma" if is_isogram(word) else f"La palabra {word} NO es isograma"
131+
print(response)
132+
case "4":
133+
print("Saliendo del programa...")
134+
break
135+
case _:
136+
print("Ingresa una opción válida.")
137+
138+
139+
if __name__ == "__main__":
140+
main()

0 commit comments

Comments
 (0)