Python - Saber si cadena es periódica

Python – Saber si cadena es periódica

Siguiendo con los ejercicios de Python vamos a ver si una cadena se puede rearmar tomando un subgrupo de caracteres de la propia cadena y replicándolos para formar la cadena.

Básicamente veremos si una cadena puede ser periódica para ver si un grupo de caracteres puede rearmar a la propia cadena.

Por ejemplo, la cadena EAEEAE es periódica porque con el subgrupo EAE se puede rearmar. Igualmente la cadena EEEE es periódica porque con el subgrupo E se puede rearmar.

Veamos cómo hacer esto con Python.

Explicación del algoritmo

Python - Saber si cadena es periódica
Python – Saber si cadena es periódica

Vamos a realizar todas las combinaciones de la cadena. Por ejemplo para la cadena EAEAEA sus posibles combinaciones son:

  • E
  • EA
  • EAE
  • EAEA
  • EAEAE
  • EAEAEA

En cada paso comprobamos si al multiplicar esa combinación nos da la cadena original y si la combinación no mide lo mismo que la cadena original.

Si ambas condiciones se cumplen entonces diremos que la cadena es periódica. Por otro lado, si acabamos de combinar y no se cumplió en ninguna combinación entonces la cadena no es periódica.

Cadena periódica con Python

Veamos el código de la función escrita en Python. El método te va a devolver un booleano indicando si la cadena es o no periódica, o sea, si se puede rearmar tomando un subgrupo de la misma:

def periodica(secuencia):
    longitud_secuencia = len(secuencia)
    for i in range(longitud_secuencia):
        combinacion = secuencia[:i+1]
        print(combinacion)
        longitud_combinacion = len(combinacion)
        cantidad_de_veces_que_cabe = longitud_secuencia // longitud_combinacion
        # Ver si esta subcadena, al multiplicarla por las veces que cabe, es igual a la cadena completa
        # Nota: también comprobamos si la subcadena no es exactamente igual a la cadena original
        multiplicada = combinacion*cantidad_de_veces_que_cabe
        if longitud_combinacion != longitud_secuencia and multiplicada == secuencia:
            return True
    return False

Comenzamos calculando la longitud de la secuencia, luego hacemos un ciclo for desde el 0 hasta la longitud de la cadena menos 1.

Calculamos la combinación en la línea 4 y la imprimimos para términos de depuración.

Luego obtenemos la longitud de la combinación y estimamos cuántas veces debemos multiplicarla para que sea de la misma longitud que la cadena original.

Multiplicamos la combinación en la línea 10 y comprobamos si la combinación multiplicada es igual a la cadena original pero además también revisamos si la longitud de la combinación no es igual a la de la cadena original.

Poniendo todo junto

A continuación dejo el ejemplo de código junto con unos ejemplos de su uso:



def periodica(secuencia):
    longitud_secuencia = len(secuencia)
    for i in range(longitud_secuencia):
        combinacion = secuencia[:i+1]
        print(combinacion)
        longitud_combinacion = len(combinacion)
        cantidad_de_veces_que_cabe = longitud_secuencia // longitud_combinacion
        # Ver si esta subcadena, al multiplicarla por las veces que cabe, es igual a la cadena completa
        # Nota: también comprobamos si la subcadena no es exactamente igual a la cadena original
        multiplicada = combinacion*cantidad_de_veces_que_cabe
        if longitud_combinacion != longitud_secuencia and multiplicada == secuencia:
            return True
    return False


print(periodica("EAEAEA"))
print(periodica("Parzibyte"))
print(periodica("HolaHola"))

La salida ya la dejé anteriormente en una imagen.

Por aquí te dejo otros ejercicios de Python si quieres seguir aprendiendo sobre este lenguaje.

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.

Dejar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *