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'
- Comprobación con ficheros de solución
- Prueba automática del programa
- Revisión automática de programa
- Análisis
- Recomendaciones de mejora
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ónmain(). - 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 (usarisalnum()en lugar deisalpha()) viola el requisito específico del enunciado, lo que muestra una comprensión incompleta de los métodos de cadenas.
Recomendaciones de mejora
-
Corregir el filtrado de caracteres: Reemplazar
c.isalnum()porc.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() -
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. -
Probar casos con números: Verificar entradas como
"A1B2A"para asegurar que el programa los procesa como"aba"(palíndromo), no como"a1b2a". -
Simplificar el preprocesamiento: Combinar
lower()dentro del generador para mayor claridad:texto = ''.join(c.lower() for c in sys.argv[1] if c.isalpha())