Skip to content

Revisión automática de la práctica 06-palindromo

Este es el resultado de una revisión automática de la prácica 06-palindromo, tal y como la hemos recogido de este repositorio de entrega. Por favor, ten en cuenta que al ser una revisión automática, realizada en parte con la ayuda de un asistente de inteligencia artificial generativa, puede incluir errores, y ser incorrecta. Pero leela con atención, porque creemos que puede tener información útil. Si tienes cualquier duda, o crees que la revisión es errónea, por favor, consulta con los profesores de la asignatura.


Comprobación de archivos con extension '.py'

  • Archivos Python excluidos de la búsqueda:
  • Archivos Python encontrados (excluyendo esos): palindromo.py

Correcto, se elige palindromo.py como entrega.

Comprobación con ficheros de solución

Los archivos son diferentes de los de la solución.

Prueba automática del programa

Pruebas realizadas por 06-palindromo/tests/test_palindromo.py:

OK

Pruebas realizadas por 06-palindromo/tests/test_program.py:

OK

Revisión automática de programa

Programa revisado:

import re
import sys


def palindromo(texto: str) -> bool:
    """Determina si el texto es un palíndromo.

    :param texto: Cadena de caracteres a evaluar, en minúsculas y sin caracteres no alfabéticos
    :returns: True si es palíndromo, False en caso contrario"""

    # Caso base: Si la cadena tiene 0 o 1 carácter, es un palíndromo
    if len(texto) <= 1:
        return True

    # Comparamos el primer y el último carácter
    if texto[0] != texto[-1]:
        return False

    # Llamada recursiva eliminando el primer y último carácter
    return palindromo(texto[1:-1])


def main():
    if len(sys.argv) != 2:
        print("Uso: python3 palindromo.py <texto>")
        sys.exit(1)

    # Obtener el texto desde la línea de comandos
    texto_original = sys.argv[1]

    # Limpiar el texto: convertir a minúsculas y eliminar caracteres no alfabéticos
    texto_limpio = re.sub(r'[^a-zA-Z]', '', texto_original.lower())

    # Verificar si es palíndromo
    if palindromo(texto_limpio):
        print("Es palíndromo")
    else:
        print("No es palíndromo")


if __name__ == "__main__":
    main()

Análisis

Cumple con el enunciado

El programa cumple con todos los requisitos del enunciado. La función palindromo es puramente recursiva (sin bucles), maneja correctamente el caso base para cadenas vacías o de un carácter, y reduce el problema en cada llamada eliminando el primer y último carácter. El preprocesamiento en main() convierte el texto a minúsculas y elimina caracteres no alfabéticos usando re.sub, tal como exige el enunciado. Los ejemplos proporcionados en el enunciado ("Anita lava la tina.", "", etc.) funcionarían correctamente. La salida sigue el formato solicitado ("Es palíndromo"/"No es palíndromo").

Es fácil de leer y entender

El código es claro para un estudiante principiante. Los nombres de funciones y variables son descriptivos (texto_limpio, palindromo), y los comentarios explican los pasos clave (caso base, comparación de caracteres). La estructura separa lógicamente el preprocesamiento (main) de la lógica recursiva, lo que facilita la comprensión. La recursión se implementa de forma intuitiva, comparando extremos y reduciendo la cadena, un enfoque alineado con la pista dada en el enunciado.

Sigue buenas prácticas de programación

El programa incluye elementos importantes como docstrings explicativos, manejo adecuado de argumentos de línea de comandos, y validación de entrada (sys.argv). El uso de expresiones regulares para limpiar el texto es apropiado en este contexto. Sin embargo, hay un detalle menor: la expresión regular [^a-zA-Z] es redundante después de aplicar .lower(), ya que no quedan mayúsculas para eliminar. Esto no afecta el funcionamiento, pero refleja una oportunidad para mayor precisión.

Recomendaciones de mejora

  • Optimizar la expresión regular: Como el texto ya se convierte a minúsculas con .lower(), la expresión regular podría simplificarse a [^a-z] en lugar de [^a-zA-Z]. Esto evita verificar rangos innecesarios (mayúsculas) y refuerza la comprensión de que el preprocesamiento ya normalizó el texto.
  • Refuerzo en comentarios: Añadir un comentario breve en main() explicando por qué se usa .lower() antes de la expresión regular ayudaría a reforzar el flujo lógico para estudiantes principiantes (ej: "# Convertimos a minúsculas primero para simplificar la limpieza").
  • Manejo explícito de cadena vacía limpia: Aunque el código ya lo gestiona correctamente (la función recursiva acepta cadenas vacías), un comentario en main() como "# Incluso si el texto limpio está vacío, se considera palíndromo" reforzaría el cumplimiento del requisito específico del enunciado.