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 sys


def palindromo(texto: str):
    """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
    """
    if len(texto) <= 1:
        return True

    if texto[0] == texto[-1]:
        return palindromo(texto[1:-1])

    return False


def limpiar_texto(texto: str) -> str:
    """Convierte a minúsculas y elimina caracteres no alfabéticos."""
    texto = texto.lower()
    limpio = "".join(ch for ch in texto if 'a' <= ch <= 'z')
    return limpio


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

    texto_original = sys.argv[1]
    texto_limpio = limpiar_texto(texto_original)

    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 no cumple completamente con el enunciado. Aunque la función recursiva palindromo está bien implementada (maneja casos base, reduce el problema y no usa bucles), la función limpiar_texto tiene un error crítico: solo conserva caracteres entre 'a' y 'z' (ASCII), ignorando letras alfabéticas propias del español como ñ, á, é, etc. Por ejemplo, la cadena "año" se limpiaría como "ao", cuando debería mantener la ñ (considerada alfabética en español). El enunciado exige ignorar caracteres no alfabéticos, pero la implementación actual es demasiado restrictiva. Los ejemplos proporcionados en el enunciado no incluyen estos casos, pero el requisito es general.

Es fácil de leer y entender

El código es moderadamente legible para principiantes. La estructura de la función recursiva es clara y los nombres de variables son descriptivos. Sin embargo, la línea limpio = "".join(ch for ch in texto if 'a' <= ch <= 'z') usa una expresión generadora, un concepto que no se ha visto en clase (solo bucles for/while básicos). Esto podría confundir a estudiantes que aún no manejan construcciones avanzadas. Reemplazar esta línea con un bucle for explícito mejoraría la comprensión.

Sigue buenas prácticas de programación

Hay mejoras necesarias en buenas prácticas:

  • La función limpiar_texto debería usar ch.isalpha() para identificar caracteres alfabéticos (incluye letras internacionales), en lugar de comparar rangos ASCII.
  • Falta validación explícita para cadenas vacías en la documentación de limpiar_texto.
  • Aunque los docstrings son adecuados, no se menciona el manejo de Unicode, clave para el contexto del problema (español).

Recomendaciones de mejora

  1. Corregir la limpieza de texto: Reemplazar 'a' <= ch <= 'z' por ch.isalpha() en limpiar_texto para incluir todas las letras alfabéticas (ej.: ñ, á).
    Ejemplo:

    limpio = ""
    for ch in texto:
        if ch.isalpha():
            limpio += ch
  2. Simplificar para principiantes: Usar un bucle for tradicional en lugar de expresiones compactas (como join con generadores), ya que el curso solo ha cubierto bucles básicos.

  3. Refinar documentación: Añadir en el docstring de limpiar_texto que se conservan todos los caracteres alfabéticos (no solo ASCII), alineándose con el requisito del enunciado.