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) -> 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"""
    # Casos base
    if len(texto) <= 1:
        return True
    # Compara si los primeros y últimos caracteres son iguales
    if texto[0] == texto[-1]:
        return palindromo(texto[1:-1])
    return False


def main():
    if len(sys.argv) < 2:
        print("Debe ingresar un texto como parámetro")
        return
    texto = ''.join(c for c in sys.argv[1] if c.isalnum())  # Quita los caracteres que no son letras ni números.
    texto = texto.lower()  # Convierte a minúsculas
    if palindromo(texto):
        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 (caso base correcto, comparación de extremos y reducción del problema), el preprocesamiento de la cadena en main() es incorrecto. El enunciado especifica que deben eliminarse caracteres no alfabéticos (solo letras), pero el código usa c.isalnum(), que conserva números (ej: "A1B1A" se procesa como "a1b1a", cuando debería ser "aba"). Esto hace que entradas con números fallen en casos como "A1B2A" (debería ser palíndromo al eliminar números, pero el programa lo rechaza).

Es fácil de leer y entender

El código es claro y accesible para principiantes. Usa nombres descriptivos (texto, palindromo), comentarios breves y sigue una estructura lógica: preprocesamiento → llamada recursiva → salida. La recursión se entiende fácilmente al comparar extremos y reducir la cadena. Sin embargo, el uso de isalnum() sin explicar su diferencia con isalpha() podría generar confusión sobre qué caracteres se consideran válidos.

Sigue buenas prácticas de programación

El programa aplica buenas prácticas básicas:

  • Estructura con if __name__ == "__main__": y función main().
  • Docstrings explicativos en la función recursiva.
  • Manejo adecuado de casos base y reducción del problema en la recursión.
    No obstante, el error en el filtrado de caracteres (usar isalnum() en lugar de isalpha()) viola el requisito específico del enunciado, lo que muestra una comprensión incompleta de los métodos de cadenas.

Recomendaciones de mejora

  1. Corregir el filtrado de caracteres: Reemplazar c.isalnum() por c.isalpha() en el preprocesamiento para eliminar solo caracteres no alfabéticos (números como "1" deben descartarse, no conservarse).
    texto = ''.join(c for c in sys.argv[1] if c.isalpha()).lower()
  2. Aclarar el propósito del filtrado: Añadir un comentario breve en main() explicando que se eliminan números y símbolos, conservando solo letras.
  3. Probar casos con números: Verificar entradas como "A1B2A" para asegurar que el programa los procesa como "aba" (palíndromo), no como "a1b2a".
  4. Simplificar el preprocesamiento: Combinar lower() dentro del generador para mayor claridad:
    texto = ''.join(c.lower() for c in sys.argv[1] if c.isalpha())