Resolución de Ejercicios Parcial 2 YT

                Never    
__author__ = "Cátedra de Algoritmos y Estructuras de Datos - UTN FRC - Junio de 2022"
"""
Ejercicio para el canal de la cátedra
Tema: Parcial 2 - Procesamiento de caracteres

Se pide desarrollar un programa en Python que permita cargar por teclado un texto completo en una variable de tipo cadena
 de caracteres. El texto finaliza con ‘.’ y se supone que el usuario cargará el punto para indicar el final del texto,
  y que cada palabra de ese texto está separada de las demás por un espacio en blanco. El programa debe:

    1) Determinar la cantidad de palabras que contienen la letra "m" o la letra "o" (minúscula o mayúscula) a partir
     de la segunda letra (inclusive) de la palabra. Por ejemplo, en el texto “El Villareal de España juega en un estadio
      llamado el Madrigal.” hay 2 palabras cumplen con la condición (“llamado”, “estadio”)

    2) Determinar la cantidad de palabras que contienen más de 1 dígito y además incluyen al menos una vez la letra "K",
     por ejemplo “Los cursos que se presentan son el 1K04 y el 1R11.” Resultado 1 palabra cumple la condición.

    3) Determinar el porcentaje de palabras sobre el total de palabras del texto que finalizan con la secuencia os.
     Por ejemplo, en el texto "Faltan menos de dos semanas para el parcial de AED." hay dos palabras ("dos" y "menos")
      que cumplen la condición por lo tanto el resultado es 20%.

    4) Determinar la posición de la palabra más corta entre las palabras que contuvieron al menos una vez la expresión
     "si" o "sí" (con ambas letras en minúscula o mayúscula. Por ejemplo, en el texto "Singulares problemas con sílabas
      siempre se asimilan así." las palabras "Singulares", "sílabas", "siempre", "asimilan" y "así" cumplen la
       condición, la que tiene menor cantidad de letras es "así" y está en la posición: 8.

     5) Determinar la cantidad de palabras con vocales y consonantes alternadas, empezando con vocal o consonante
      indistintamente. Por ejemplo, en el texto "Las vocales y las consonantes están alternadas." hay 4 palabras
       ("Las", "vocales", "y" y "las") que cumplen la condición.

    6) Determinar la cantidad de palabras que tuvieron al menos 3 vocales en la primera mitad de la palabra
     (en el caso de cantidad de letras impares la letra central cuenta para las dos mitades) y además no comenzaron con
      vocal. Por ejemplo, en el texto "Este es un texto que demuestra lo que estamos visualizando." hay 2 palabras
      ("demuestra" y "visualizando") que cumplen la condición.

"""


def es_vocal(car):
    return car in "aáeéiíoóuú"


def es_consonante(car):
    # car = car.lower()
    return car in "bcdfghjklmnpqrstvwxyz"


def calcular_porcentaje(contador_parcial, contador_total):
    porcentaje = 0
    if contador_total != 0:
        porcentaje = contador_parcial * 100 / contador_total
    return porcentaje


def es_digito(car):
    return car in "0123456789"


def principal():
    print("Analizador de textos.")
    texto = input("Ingrese el texto a procesar, finaliza con un punto: ")
    texto = texto.lower()

    # Sector de inicializacion de variables
    cont_letras = 0
    cont_palabras = 0
    cont_palabras_p1 = 0
    hubo_m_o = False
    cont_digitos = 0
    hubo_k = False
    cont_palabras_p2 = 0
    hubo_antes_o = False
    pos_fin_os = 0
    cont_palabras_p3 = 0
    hubo_antes_s = False
    hubo_si = False
    menor_pal_pto_4 = None
    pos_pal_punto_4 = 0
    cont_palabras_p5 = 0
    fue_vocal_anterior = None
    voc_con_alternadas = True
    primera_mitad = 0
    cont_vocales = 0
    posicion_tercera_vocal = 0
    cont_palabras_p6 = 0
    hubo_vocal_pos_1 = True

    for car in texto:
        if car != " " and car != ".":
            cont_letras += 1
            if car in "moó" and cont_letras > 1:
                hubo_m_o = True
            if es_digito(car):
                cont_digitos += 1
            else:
                if car == "k":
                    hubo_k = True
            if car in "oó":
                hubo_antes_o = True
            else:
                if hubo_antes_o and car == "s":
                    pos_fin_os = cont_letras
                hubo_antes_o = False
            if car == "s":
                hubo_antes_s = True
            else:
                if hubo_antes_s and car in "ií":
                    hubo_si = True
                hubo_antes_s = False
            if es_vocal(car):
                # Es vocal!
                cont_vocales += 1
                if cont_vocales == 3:
                    posicion_tercera_vocal = cont_letras
                if fue_vocal_anterior:
                    voc_con_alternadas = False
                fue_vocal_anterior = True
            else:
                if es_consonante(car):
                    # Es una consonante!
                    if fue_vocal_anterior == False:
                        voc_con_alternadas = False
                    fue_vocal_anterior = False
                else:
                    voc_con_alternadas = False

        else:
            if cont_letras == 0:
                continue
            cont_palabras += 1
            if hubo_m_o:  # (hubo_mm_o == True)
                cont_palabras_p1 += 1
            if cont_digitos > 1 and hubo_k:
                cont_palabras_p2 += 1
            if pos_fin_os == cont_letras:
                cont_palabras_p3 += 1
            if hubo_si and (menor_pal_pto_4 is None or cont_letras < menor_pal_pto_4):
                menor_pal_pto_4 = cont_letras
                pos_pal_punto_4 = cont_palabras
            if voc_con_alternadas:
                cont_palabras_p5 += 1
            if cont_letras % 2 == 0:
                primera_mitad = cont_letras // 2
            else:
                primera_mitad = cont_letras // 2 + 1
            if posicion_tercera_vocal > 0 and posicion_tercera_vocal <= primera_mitad:
                cont_palabras_p6 += 1

            # Sector de reinicializacion de variables
            cont_letras = cont_digitos = pos_fin_os = 0
            hubo_m_o = hubo_k = hubo_antes_o = hubo_antes_s = hubo_si = False
            voc_con_alternadas = True
            fue_vocal_anterior = None
            primera_mitad = 0
            posicion_tercera_vocal = 0
            cont_vocales = 0

    print("Resultados")
    if cont_palabras > 0:
        print("La cantidad de palabras que contienen una m o una o a partir de la segunda letra es: ", cont_palabras_p1)
        print("La cantidad de palabras que contienen mas de un digito y al menos una k son: ", cont_palabras_p2)
        porcentaje_p3 = calcular_porcentaje(cont_palabras_p3, cont_palabras)
        print("El porcentaje de palabras que terminan en os sobre el total de palabras del texto es de: ",
              porcentaje_p3, "%")
        print("La posicion de la palabra mas corta que contiene la secuencia si o sí es: ", pos_pal_punto_4)
        print("La cantidad de palabras que tienen vocales y consonantes alternadas es de: ", cont_palabras_p5)
        print("La cantidad de palabras que tienen más de 3 vocales y no comienzan con vocal es de: ", cont_palabras_p6)
    else:
        print("No se ha cargado un texto.")


if __name__ == "__main__":
    principal()

Raw Text