diff --git "a/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/python/ClarkCodes.py" "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/python/ClarkCodes.py" new file mode 100644 index 0000000000..1ee020fa7a --- /dev/null +++ "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/python/ClarkCodes.py" @@ -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 )