Skip to content

Commit b4ebf88

Browse files
authored
Merge pull request #6818 from Maanghel/main
Reto #28-#29-#30 - Python
2 parents ffd6c79 + b1cf9b3 commit b4ebf88

File tree

4 files changed

+295
-0
lines changed
  • Retos

4 files changed

+295
-0
lines changed
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
"""
2+
Crea una función que reciba una expresión matemática (String)
3+
y compruebe si es correcta. Retornará true o false.
4+
- Para que una expresión matemática sea correcta debe poseer
5+
un número, una operación y otro número separados por espacios.
6+
Tantos números y operaciones como queramos.
7+
- Números positivos, negativos, enteros o decimales.
8+
- Operaciones soportadas: + - * / %
9+
10+
Ejemplos:
11+
"5 + 6 / 7 - 4" -> true
12+
"5 a 6" -> false
13+
"""
14+
15+
def is_number(number: str) -> bool:
16+
"""
17+
Verifica si la cadena es un numero.
18+
19+
Args:
20+
number (str): Cadena que se validara como numero.
21+
22+
Returns:
23+
bool: True si es un numero, False en caso contrario.
24+
"""
25+
if number.count("+") + number.count("-") > 1:
26+
return False
27+
if number.startswith(("+", "-")):
28+
number = number[1:]
29+
if number.count(".") > 1:
30+
return False
31+
return number.replace(".", "").isdigit()
32+
33+
def is_mathematical_expression(expression: str) -> bool:
34+
"""
35+
Verifica si una cadena representa una expresión matemática válida.
36+
37+
Para que la expresión se considere correcta debe cumplir:
38+
- Estar compuesta por números y operadores separados por espacios.
39+
- Alternar correctamente entre número y operador.
40+
- Permitir números enteros, decimales, positivos y negativos.
41+
- Permitir los operadores: +, -, *, /, %
42+
- Tener al menos un patrón número-operador-número.
43+
- No terminar con un operador.
44+
45+
Args:
46+
expression (str): Cadena que representa la expresión matemática a validar.
47+
48+
Returns:
49+
bool: True si la expresión es válida, False en caso contrario.
50+
51+
Raises:
52+
TypeError: Si el argumento proporcionado no es una cadena.
53+
ValueError: Si la cadena proporcionada está vacía o solo contiene espacios.
54+
"""
55+
if not isinstance(expression, str):
56+
raise TypeError("Error. Solo se aceptan cadenas de texto como valor.")
57+
if not expression:
58+
raise ValueError("Error. La expresion no puede estar vacia")
59+
60+
data = expression.strip().split()
61+
62+
if len(data) < 3 or len(data) % 2 == 0:
63+
return False
64+
65+
expecting_number = True
66+
for value in data:
67+
if expecting_number:
68+
if not is_number(value):
69+
return False
70+
else:
71+
if value not in ["+", "-", "*", "/", "%"]:
72+
return False
73+
expecting_number = not expecting_number
74+
75+
return not expecting_number
76+
77+
78+
if __name__ == "__main__":
79+
print(is_mathematical_expression("5 + 6 / 7 - 4"))
80+
print(is_mathematical_expression("5 a 6"))
81+
print(is_mathematical_expression("3 + 5"))
82+
print(is_mathematical_expression("3 a 5"))
83+
print(is_mathematical_expression("-3 + 5"))
84+
print(is_mathematical_expression("- 3 + 5"))
85+
print(is_mathematical_expression("-3 a 5"))
86+
print(is_mathematical_expression("-3+5"))
87+
print(is_mathematical_expression("3 + 5 - 1 / 4 % 8"))
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
"""
2+
Crea una función que reciba dos cadenas de texto casi iguales,
3+
a excepción de uno o varios caracteres.
4+
La función debe encontrarlos y retornarlos en formato lista/array.
5+
- Ambas cadenas de texto deben ser iguales en longitud.
6+
- Las cadenas de texto son iguales elemento a elemento.
7+
- No se pueden utilizar operaciones propias del lenguaje
8+
que lo resuelvan directamente.
9+
10+
Ejemplos:
11+
- Me llamo mouredev / Me llemo mouredov -> ["e", "o"]
12+
- Me llamo.Brais Moure / Me llamo brais moure -> [" ", "b", "m"]
13+
"""
14+
15+
def different_characters(text1: str, text2: str) -> list[str]:
16+
"""
17+
Compara dos cadenas de texto con la misma longitud y retorna
18+
una lista con los caracteres que son distintos entre ambas.
19+
20+
La comparación se realiza carácter a carácter y solo se guardan
21+
los caracteres diferentes que aparecen en la segunda cadena.
22+
23+
Args:
24+
text1 (str): Primera cadena de texto a comparar.
25+
text2 (str): Segunda cadena de texto a comparar.
26+
27+
Returns:
28+
list[str]: Lista con los caracteres distintos encontrados.
29+
30+
Raises:
31+
TypeError: Si alguno de los argumentos no es una cadena.
32+
ValueError: Si las cadenas tienen longitudes diferentes o están vacías.
33+
"""
34+
if not isinstance(text1, str) or not isinstance(text2, str):
35+
raise TypeError("Error. Se aceptan solo cadenas de texto como valores.")
36+
if len(text1) != len(text2):
37+
raise ValueError("Error. Las cadenas deben tener la misma cantidad de elementos.")
38+
if not text1 or not text2:
39+
raise ValueError("Error. Los textos no pueden estar vacios.")
40+
41+
differences = []
42+
for char1, char2 in zip(text1, text2):
43+
if char1 != char2:
44+
differences.append(char2)
45+
46+
return differences
47+
48+
49+
if __name__ == "__main__":
50+
print(different_characters("Me llamo mouredev", "Me llemo mouredov"))
51+
print(different_characters("Me llamo.Brais Moure", "Me llamo brais moure"))
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
"""
2+
Los primeros dispositivos móviles tenían un teclado llamado T9
3+
con el que se podía escribir texto utilizando únicamente su
4+
teclado numérico (del 0 al 9).
5+
6+
Crea una función que transforme las pulsaciones del T9 a su
7+
representación con letras.
8+
- Debes buscar cuál era su correspondencia original
9+
- Cada bloque de pulsaciones va separado por un guión.
10+
- Si un bloque tiene más de un número, debe ser siempre el mismo.
11+
- Ejemplo:
12+
Entrada: 6-666-88-777-33-3-33-888
13+
Salida: MOUREDEV
14+
"""
15+
16+
def keyboard_t9(code: str) -> str:
17+
"""
18+
Decodifica una secuencia de pulsaciones del teclado T9 y devuelve
19+
su representación en texto.
20+
21+
22+
Reglas:
23+
* Cada bloque representa una letra.
24+
* Si un bloque tiene más de un dígito, todos deben ser iguales.
25+
* El dígito "0" representa un espacio.
26+
* La cantidad de repeticiones determina la letra seleccionada.
27+
28+
Ejemplo:
29+
>>> keyboard_t9("6-666-88-777-33-3-33-888")
30+
'MOUREDEV'
31+
32+
Args:
33+
code (str): Cadena con las pulsaciones separadas por guiones.
34+
35+
Returns:
36+
str: Texto decodificado utilizando la correspondencia T9.
37+
38+
Raises:
39+
TypeError: Si `code` no es una cadena de texto.
40+
ValueError: Si la cadena está vacía o algún bloque contiene
41+
más de un número diferente.
42+
"""
43+
44+
alphabet = {
45+
"2": ["A", "B", "C"],
46+
"3": ["D", "E", "F"],
47+
"4": ["G", "H", "I"],
48+
"5": ["J", "K", "L"],
49+
"6": ["M", "N", "O"],
50+
"7": ["P", "Q", "R", "S"],
51+
"8": ["T", "U", "V"],
52+
"9": ["W", "X", "Y", "Z"],
53+
"0": " "
54+
}
55+
56+
if not isinstance(code, str):
57+
raise TypeError("Error. Ingrese los digitos separados por guiones.")
58+
if not code:
59+
raise ValueError("Error. Intentelo nuevamente.")
60+
61+
pulsations = code.strip().split("-")
62+
if any( len(set(element)) > 1 for element in pulsations):
63+
raise ValueError("Error. Si son varias pulsaciones, solo pueden ser del mismo numero.")
64+
65+
sentence = ""
66+
for element in pulsations:
67+
sentence += alphabet[element[0]][len(element) - 1]
68+
69+
return sentence
70+
71+
if __name__ == "__main__":
72+
print(keyboard_t9("6-666-88-777-33-3-33-888"))
73+
print(keyboard_t9("44-666-555-2"))
74+
print(keyboard_t9("6-88-66-3-666"))
75+
print(keyboard_t9("44-666-555-2-0-6-88-66-3-666"))
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
"""
2+
Crea una función que sea capaz de leer el número representado por el ábaco.
3+
- El ábaco se representa por un array con 7 elementos.
4+
- Cada elemento tendrá 9 "O" (aunque habitualmente tiene 10 para realizar
5+
operaciones) para las cuentas y una secuencia de "---" para el alambre.
6+
- El primer elemento del array representa los millones, y el último las unidades.
7+
- El número en cada elemento se representa por las cuentas que están a
8+
la izquierda del alambre.
9+
10+
Ejemplo de array y resultado:
11+
["O---OOOOOOOO",
12+
"OOO---OOOOOO",
13+
"---OOOOOOOOO",
14+
"OO---OOOOOOO",
15+
"OOOOOOO---OO",
16+
"OOOOOOOOO---",
17+
"---OOOOOOOOO"]
18+
19+
Resultado: 1.302.790
20+
"""
21+
22+
def abacus(sequence: list[str]) -> int:
23+
"""
24+
Interpreta el valor numérico representado por un ábaco japonés (soroban simplificado).
25+
26+
args:
27+
sequence : list[str]
28+
Lista de 7 cadenas, donde cada cadena representa una fila del ábaco.
29+
Cada fila contiene una secuencia de "O" (cuentas) y "---" (el alambre separador).
30+
Las cuentas situadas a la izquierda del alambre representan el valor de la posición.
31+
- La primera fila corresponde a los millones.
32+
- La última fila corresponde a las unidades.
33+
34+
Ejemplo
35+
-------
36+
>>> abacus([
37+
... "O---OOOOOOOO",
38+
... "OOO---OOOOOO",
39+
... "---OOOOOOOOO",
40+
... "OO---OOOOOOO",
41+
... "OOOOOOO---OO",
42+
... "OOOOOOOOO---",
43+
... "---OOOOOOOOO"])
44+
45+
returns:
46+
int: El número entero correspondiente al valor indicado por el ábaco.
47+
48+
Excepciones
49+
-----------
50+
TypeError
51+
Si el argumento no es una lista.
52+
ValueError
53+
Si la lista no contiene exactamente 7 elementos o si alguno no es una cadena.
54+
55+
Notas
56+
-----
57+
- Cada línea debe tener 9 cuentas "O" en total, divididas por el alambre "---".
58+
- Este tipo de representación se usa comúnmente en ejercicios de lógica y programación.
59+
"""
60+
if not isinstance(sequence, list):
61+
raise TypeError("Error. Solo se acepta una lista para representar el abaco.")
62+
if not sequence or len(sequence) < 7:
63+
raise ValueError("Error. La lista debe contener 7 elementos.")
64+
if not all(isinstance(value, str) for value in sequence):
65+
raise ValueError("Error. La lista solo puede contener cadenas de texto.")
66+
67+
result = 0
68+
for index, line in enumerate(sequence, 1):
69+
digit = line.split("---")[0].count("O")
70+
result += digit * (10 ** (7 - index))
71+
return int(result)
72+
73+
if __name__ == "__main__":
74+
value = ["O---OOOOOOOO",
75+
"OOO---OOOOOO",
76+
"---OOOOOOOOO",
77+
"OO---OOOOOOO",
78+
"OOOOOOO---OO",
79+
"OOOOOOOOO---",
80+
"---OOOOOOOOO"]
81+
82+
print(abacus(value))

0 commit comments

Comments
 (0)