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 de manera recursiva.
:param texto: Cadena ya preprocesada (solo letras minúsculas)
:return: True si es palíndromo, False en caso contrario
"""
# Caso base: cadena vacía o de un solo carácter
if len(texto) <= 1:
return True
# Si primer y último carácter no coinciden -> no es palíndromo
if texto[0] != texto[-1]:
return False
return palindromo(texto[1:-1])
def limpiar_cadena(cadena: str) -> str:
"""Convierte la cadena a minúsculas y elimina caracteres no alfabéticos."""
resultado = ""
for c in cadena.lower():
if 'a' <= c <= 'z': # Solo letras minúsculas
resultado += c
return resultado
def main():
# Debe haber exactamente 2 argumentos: script + texto
if len(sys.argv) != 2:
return
texto_original = sys.argv[1]
texto_limpio = limpiar_cadena(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 implementa correctamente la recursión y el preprocesamiento básico (convertir a minúsculas), falla al manejar caracteres alfabéticos en español como tildes (á, é, í, ó, ú) o la ñ. La función limpiar_cadena solo conserva caracteres entre 'a' y 'z', excluyendo letras válidas en español. Por ejemplo, para la entrada "¡Se és o no se és!", el programa eliminaría las tildes, transformándolo en "sesosnoses", cuando debería conservarlas como parte del texto limpio ("sesesosnoseses"). El enunciado especifica ignorar caracteres no alfabéticos, y en español, las tildes y la ñ son alfabéticas.
Es fácil de leer y entender
El código es claro y accesible para principiantes. Usa nombres descriptivos (limpiar_cadena, texto_limpio), incluye comentarios breves y sigue una estructura lógica (preprocesamiento → verificación recursiva). La recursión es intuitiva al comparar extremos y reducir la cadena, lo que facilita su comprensión para estudiantes que recién aprenden el concepto.
Sigue buenas prácticas de programación
El programa aplica buenas prácticas básicas:
- Usa
if __name__ == "__main__"y funciónmain(). - Incluye docstrings y anotaciones de tipo.
- Separa el preprocesamiento de la lógica recursiva.
Sin embargo, no valida adecuadamente la entrada: si no se proporciona un argumento, el programa termina silenciosamente sin mensaje de error, lo que podría confundir al usuario.
Recomendaciones de mejora
-
Corregir el preprocesamiento de caracteres:
Reemplaza'a' <= c <= 'z'porc.isalpha()enlimpiar_cadena. Esto incluirá tildes y ñ como caracteres válidos, cumpliendo con el enunciado para el español.if c.isalpha(): # En lugar de 'a' <= c <= 'z' resultado += c -
Agregar manejo básico de errores:
Si no se recibe el argumento requerido, muestra un mensaje claro:if len(sys.argv) != 2: print("Error: Debe proporcionar un texto como argumento.") return -
Simplificar la lógica recursiva:
Aunque funcional, la recursión actual crea subcadenas innecesarias (texto[1:-1]). Para principiantes, está bien, pero podrías mencionar en comentarios que en problemas más grandes se preferirían índices en lugar de subcadenas (aunque no es necesario modificarlo para este ejercicio).