Skip to content

Commit

Permalink
Reto mouredev#28 - EXPRESION MATEMÁTICA by ClarkCodes
Browse files Browse the repository at this point in the history
- Add a solution approach for this challenge, written in Python 

- Use the typer library for a nice look in terminal
  • Loading branch information
ClarkCodes authored Aug 10, 2023
1 parent d8fb1bd commit 692041c
Showing 1 changed file with 128 additions and 0 deletions.
128 changes: 128 additions & 0 deletions Retos/Reto #28 - EXPRESIÓN MATEMÁTICA [Media]/python/ClarkCodes.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
# Retos Semanales ‘23
# Reto #28: EXPRESIÓN MATEMÁTICA
# MEDIA | Publicación: 10/07/23 | Resolución: 17/07/23
#
# Crea una función que reciba una expresión matemática (String)
# y compruebe si es correcta. Retornará true o false.
# - Para que una expresión matemática sea correcta debe poseer
# un número, una operación y otro número separados por espacios.
# Tantos números y operaciones como queramos.
# - Números positivos, negativos, enteros o decimales.
# - Operaciones soportadas: + - * / %
#
# Ejemplos:
# "5 + 6 / 7 - 4" -> true
# "5 a 6" -> false

# Autor: Clark - @ClarkCodes
# Fecha de Resolución: 10/08/2023

# Imports
import typer
from rich import print

# Atributos Globales
welcome_pending = True

# Constantes
SUPPORTED_OPERATIONS = ( "+", "-", "*", "/", "%" )
VALID_MSJ = f"[green]✅ La expresión matemática es[yellow] VÁLIDA"
INVALID_MSJ = f"[red]❌ La expresión ingresada NO ES VÁLIDA"

# Funciones - Métodos
def main_menu():
global welcome_pending

if( welcome_pending ):
print( "\n[green]Bienvenido al Script de[/green] [yellow]Expresión Matemática[/yellow], [green]verifiquemos que las expresiones que indiques sean correctas.[/green] 😀\n" )
welcome_pending = False
else:
print( "\n[green]¿Verificamos en otro mes y año?\n" )

print( "[green]A continuación debes ingresar una expresión matemática para evaluarla, para que una expresión matemática sea correcta debe poseer un número, una operación y otro número separados por espacios, tantos números y operaciones como quieras." )
print( "Se puede ingresar números positivos, negativos, enteros o decimales, y las operaciones soportadas son la suma( + ), resta( - ), multiplicación( * ), división( / ), y módulo o residuo( % )." )
print( "Ingresa 'q' si deseas salir." )

def exit_verifier( user_answer : str ) -> bool: # Verificador de Salida y terminación del Programa
return user_answer.lower() == 'q' # Condición de Salida

def is_even( n : int ) -> bool:
return ( n % 2 ) == 0

def is_int( n : str ) -> bool:
try:
int( n )
return True
except ValueError:
return False

def is_float( n : str ) -> bool:
try:
float( n )
return True
except ValueError:
return False

def is_int_float( n : str ) -> bool:
return is_int( n ) or is_float( n )

def separate( expression : str ) -> list[str] :
exp_list = []
temp_substr = ""

for index, ch in enumerate( expression ):
if( ord( ch ) == 32 ):
exp_list.append( temp_substr )
temp_substr = ""
elif( ( index == len( expression ) - 1 ) ):
temp_substr += ch
exp_list.append( temp_substr )
temp_substr = ""
else:
temp_substr += ch

return exp_list

def is_expression_valid( exp : list[str] ): # Validador
print( "\nEstructura de la expresión:" )
for it in exp:
print( f"{it}|", end = "" )

for index, element in enumerate( exp ):
if( not element.isspace() and ( ( is_even( index ) and not is_int_float( element ) ) or ( not is_even( index ) and element not in SUPPORTED_OPERATIONS ) ) ):
print( f"item: {element} | ", end = "" )
print( f"Indice de Fallo: {index}" )
return False

return True

def main():
exit_msj = f"[green]\n✅ Esto ha sido todo por hoy.\n❤ Muchas gracias por ejecutar este Script, hasta la próxima...💻 Happy Coding!,👋🏼 bye :D\n😎 Clark."
user_answer = ""

print( "[bold green]\n*** Reto #28: EXPRESIÓN MATEMÁTICA - By @ClarkCodes ***" )

while True:
main_menu()

try: # Ingreso de Información
print( "\n[bold green]Expresión Matemática: [/bold green]", end = "" )
user_answer = input( "" )

if exit_verifier( user_answer ): # Condición de Salida
print( exit_msj )
break

# Validadción y Verificación de la expresión
result = VALID_MSJ if is_expression_valid( separate( user_answer ) ) else INVALID_MSJ
print( f"\n[green]Resultado: {result}" )

except ValueError as ve:
print( "\n❌ Valor ingresado no permitido, solo se admiten números enteros positivos, mayor o igual a 1 y menor o igual a 12 para el mes y mayor o igual a 1900 para el año, o la letra 'q' si deseas salir, verifique nuevamente." )

except Exception as ex:
print( "\n❌ Oops... algo no ha salido bien, revise nuevamente por favor." )

# Llamada a la Función Principal usando typer
if __name__ == "__main__":
typer.run( main )

0 comments on commit 692041c

Please sign in to comment.