Mostrando entradas con la etiqueta programming. Mostrar todas las entradas
Mostrando entradas con la etiqueta programming. Mostrar todas las entradas

viernes, 12 de junio de 2026

MiMo Code IA de Xiaomi Revoluciona la Programacion

Xiaomi ha dado un paso audaz en el mundo de la inteligencia artificial para la codificación al lanzar MiMo Code V0.1.0, una herramienta de código abierto diseñada para funcionar directamente en la terminal. Lo más destacado es que, según pruebas internas y un estudio con desarrolladores, MiMo Code parece superar a Claude Code de Anthropic en tareas de codificación complejas y de largo alcance, especialmente aquellas que implican más de 200 pasos. Esto se atribuye a su innovadora arquitectura de memoria.

MiMo Code: IA de Xiaomi Revoluciona la Programación

La clave de MiMo Code reside en su sistema de memoria persistente que abarca múltiples capas: memoria del proyecto, puntos de control de sesión, notas temporales y registros de progreso por tarea. A diferencia de otros asistentes que pueden "olvidar" información importante a medida que el contexto se satura, MiMo Code utiliza un subagente dedicado a tomar notas y crear puntos de control. Esto permite al agente principal reconstruir el entorno de trabajo y recuperar el contexto perdido, asegurando la continuidad y la eficiencia en proyectos extensos. Además, el sistema incorpora mecanismos de auto-mejora, como un comando `/dream` para revisar y comprimir sesiones pasadas, y una función de "destilación" para automatizar flujos de trabajo recurrentes.

Xiaomi ha presentado pruebas de rendimiento que sugieren una ventaja significativa de MiMo Code sobre Claude Code en benchmarks como SWE-bench Verified, SWE-bench Pro y Terminal Bench 2. La empresa también destaca que las mejoras provienen tanto del modelo subyacente (MiMo-V2.5) como del propio sistema del "harness" (MiMo Code). La herramienta ofrece una integración sencilla, acceso gratuito limitado a MiMo-V 2.5 y características adicionales como un modo de composición para flujos de trabajo autónomos y control por voz, todo ello con una estrategia de precios agresiva que busca democratizar el acceso a modelos de IA avanzados. Si bien las comparaciones con otros modelos como los de OpenAI y Google también son relevantes, la apuesta de Xiaomi por una memoria persistente y un ecosistema abierto posiciona a MiMo Code como un competidor a tener en cuenta en el panorama de la IA para desarrolladores.

Fuente Original: https://venturebeat.com/technology/xiaomis-new-open-source-agentic-ai-coding-harness-mimo-code-beats-claude-code-at-ultra-long-200-step-tasks

Artículos relacionados de LaRebelión:

Artículo generado mediante LaRebelionBOT

lunes, 13 de abril de 2026

Desarrollo con Agentes Autonomos Escala tu Codigo Empresarial

La forma en que desarrollamos software está experimentando una revolución, y ya no se trata solo de si la IA puede escribir código, sino de si podemos confiar en él. La clave para desbloquear el verdadero potencial de los agentes de codificación autónomos a escala empresarial reside en el desarrollo impulsado por especificaciones (spec-driven development).

Desarrollo con Agentes Autónomos: ¡Escala tu Código Empresarial!

Este enfoque innovador eleva el listón de la calidad del código, emulando la forma de trabajar de los desarrolladores más experimentados. En lugar de depender de la documentación posterior a la generación de código, el desarrollo impulsado por especificaciones comienza con una definición clara y estructurada de lo que el sistema debe hacer, sus propiedades y qué significa el éxito. Esta especificación se convierte en la base sobre la cual el agente autónomo razona durante todo el proceso de desarrollo, actuando como un modelo de confianza fundamental.

Las empresas ya están cosechando los beneficios de este método, reduciendo drásticamente los tiempos de entrega de funciones. Desde acelerar la construcción de entornos de codificación hasta completar proyectos de rearquitectura masivos con equipos reducidos y adelantar lanzamientos de productos, el desarrollo impulsado por especificaciones está demostrando ser un catalizador para la eficiencia y la innovación.

La seguridad de estos agentes autónomos se garantiza a través de pruebas verificables. Cuando la generación de código se mide en miles de envíos semanales, la revisión manual es inviable. Aquí es donde el desarrollo impulsado por especificaciones brilla, permitiendo pruebas automatizadas basadas en propiedades y técnicas de IA neurosimbólica que generan cientos de casos de prueba derivados directamente de la especificación. Esto va más allá de las suites de pruebas tradicionales, asegurando un comportamiento comprobado y correcto.

Este cambio permite pasar de la programación de "un solo intento" a un desarrollo autónomo continuo. Los agentes modernos se autocorrigen, retroalimentando fallos de construcción y prueba para iterar y mejorar, siempre anclados por la especificación. En el futuro, los agentes incluso escribirán sus propias especificaciones, utilizando la verificación y la autocorrección como mecanismos intrínsecos para asegurar la alineación con el comportamiento deseado del sistema.

Los equipos pioneros están invirtiendo tiempo en construir especificaciones robustas y archivos de dirección para guiar a sus agentes. Ejecutan múltiples agentes en paralelo para obtener diversas perspectivas y utilizan varias especificaciones para componentes del sistema. Aunque la orquestación de estas capacidades requiere experiencia, herramientas como Kiro buscan democratizar estas avanzadas metodologías para todos los desarrolladores. La infraestructura está evolucionando para soportar estas cargas de trabajo a escala empresarial, con comunicación segura, controles de costos y garantías de fiabilidad.

Los desarrolladores que prosperarán en esta nueva era priorizan el desarrollo impulsado por especificaciones, la testeabilidad y la verificación desde el principio, y colaboran con agentes como compañeros, pensando en sistemas en lugar de en sintaxis.

Fuente Original: https://venturebeat.com/orchestration/agentic-coding-at-enterprise-scale-demands-spec-driven-development

Artículos relacionados de LaRebelión:

Artículo generado mediante LaRebelionBOT

lunes, 30 de marzo de 2026

Critical Python Library Flaw Threatens AI Systems

A critical vulnerability has recently been disclosed in NLTK, one of Python's most widely used libraries for natural language processing. Identified as CVE-2026-0848, this security flaw poses a serious threat to environments utilising text analysis tools or artificial intelligence-based systems. The vulnerability enables remote code execution (RCE), meaning attackers could execute arbitrary commands on vulnerable systems—one of the most critical security scenarios possible.

Critical Python Library Flaw Threatens AI Systems

The root of the problem lies in how NLTK manages certain external resources. Under specific conditions, the library can load files without properly validating their origin or content. This creates an opportunity for manipulated resources to be processed as legitimate. In practical terms, if an attacker manages to introduce a malicious file into an application's data stream, that code could execute directly on the system. Complex scenarios aren't necessary for exploitation—in many current environments such as APIs, notebooks, and machine learning pipelines, data is consumed automatically. If any of these entry points is compromised, exploitation can occur without direct user interaction.

This vulnerability is particularly significant due to its context. The use of natural language processing libraries has grown enormously with the rise of AI, and NLTK remains a common dependency in numerous projects. This introduces an interesting security risk: the possibility that a widely trusted library could become a vector in broader attacks, such as supply chain compromises. This wouldn't be the first time such an incident has occurred. Furthermore, the fact that this involves RCE considerably elevates its severity—we're not merely discussing information access, but potential control over affected systems.

The first mitigation measure is straightforward: update the library to a version that addresses the issue. However, beyond applying patches, this type of vulnerability highlights practices often overlooked. Validating external resources, limiting data sources, and executing processes in isolated environments such as containers are measures that significantly reduce potential impact. This incident serves as a reminder of the importance of robust security practices in AI development workflows.

Fuente Original: https://unaaldia.hispasec.com/2026/03/como-un-fallo-en-una-libreria-de-python-puede-comprometer-sistemas-de-ia-cve-2026-0848.html?utm_source=rss&utm_medium=rss&utm_campaign=como-un-fallo-en-una-libreria-de-python-puede-comprometer-sistemas-de-ia-cve-2026-0848

Artículos relacionados de LaRebelión:

Artículo generado mediante LaRebelionBOT

domingo, 29 de marzo de 2026

IA Revoluciona Desarrollo 170 Productividad Menos Personal

La inteligencia artificial está transformando radicalmente el desarrollo de software, y los resultados son asombrosos. Andrew Filev, fundador y CEO de Zencoder, comparte su experiencia de seis meses implementando un enfoque AI-first en su organización de ingeniería, logrando resultados que parecían imposibles: un aumento del 170% en productividad con solo el 80% del personal original. Su equipo pasó de 36 ingenieros a 30, mientras duplicaban subjetivamente su velocidad de desarrollo.

IA Revoluciona Desarrollo: 170% Productividad, Menos Personal

El cambio más significativo ocurrió en la forma de trabajar. Antes de la IA, los equipos invertían semanas perfeccionando flujos de usuario antes de escribir código. Ahora, el costo de la experimentación se ha desplomado. Una idea puede pasar del concepto al prototipo funcional en un solo día, atravesando todo el ciclo desde la generación de requisitos hasta la implementación asistida por IA. Su sitio web, crucial para la adquisición de clientes, se convirtió en un sistema con cientos de componentes personalizados, diseñados y mantenidos directamente por su director creativo en código.

La validación se ha convertido en el nuevo punto de apalancamiento. Cuando la IA genera la mayor parte de la implementación, el verdadero valor reside en definir qué significa "bueno". Los ingenieros de control de calidad han evolucionado hacia arquitectos de sistemas, construyendo agentes de IA que generan y mantienen pruebas de aceptación directamente desde los requisitos. Este enfoque de "shift left" integra la validación como parte fundamental del proceso de producción, no como una función aislada.

La geometría misma del desarrollo de software está cambiando. Durante décadas, seguía una forma de "diamante": un pequeño equipo de producto entregaba a un gran equipo de ingeniería, que luego se reducía en QA. Hoy, esa estructura se está invirtiendo hacia un "doble embudo". Los humanos participan más profundamente al principio, definiendo la intención y explorando opciones, y al final, validando resultados. El medio, donde la IA ejecuta, es más rápido y estrecho. El modelo se parece menos a una línea de ensamblaje y más a una torre de control.

Los ingenieros ahora trabajan en una capa meta: orquestando flujos de trabajo de IA, ajustando instrucciones y habilidades de agentes, y definiendo protecciones. Las máquinas construyen; los humanos deciden el qué y el por qué. Este es el nivel de abstracción más alto en la evolución del software, comparable al salto de las tarjetas perforadas a los lenguajes de alto nivel, o del hardware a la nube. La paradoja de la ingeniería AI-first es que se siente menos como programar y más como pensar estratégicamente.

Fuente Original: https://venturebeat.com/orchestration/when-ai-turns-software-development-inside-out-170-throughput-at-80-headcount

Artículos relacionados de LaRebelión:

Artículo generado mediante LaRebelionBOT

viernes, 20 de marzo de 2026

OpenAI Acquires Astrals Popular Python Development Tools

OpenAI has announced a significant acquisition that will reshape the landscape of AI-powered software development. The artificial intelligence giant has entered into an agreement to acquire Astral, the company behind some of the most widely-used open source Python development tools in the industry. This strategic move will see Astral integrated into OpenAI's Codex team, strengthening the company's position in the competitive AI coding assistant market.

OpenAI Acquires Astral's Popular Python Development Tools

Astral has become a household name amongst Python developers through its suite of powerful development tools. The company's flagship product, uv, is a Rust-based Python package manager that has attracted over 126 million monthly downloads by helping developers manage complex dependency networks. Their code formatter and linter, Ruff, has proven even more popular with 179 million monthly downloads, whilst their beta type-checker, Ty, has already garnered 19 million monthly downloads despite being in early development stages.

The acquisition's financial terms remain undisclosed, but OpenAI has made clear commitments about the future of Astral's products. Both companies have reassured the development community that these popular open source tools will continue to receive support and remain freely available. Charlie Marsh, who founded Astral three years ago with $4 million in seed funding, emphasised that the company will maintain its open source philosophy and continue building alongside the community for the broader Python ecosystem.

This acquisition is part of a broader strategy by OpenAI to enhance Codex's capabilities by enabling AI agents to work more directly with tools that developers rely on daily. The move comes during an intense rivalry with Anthropic's Claude Code for dominance in the AI-powered coding assistant market. Anthropic made a similar strategic acquisition in November when it purchased Bun, a JavaScript runtime with 7 million monthly downloads. OpenAI also recently acquired Promptfoo, makers of an open source security tool focused on large language models, demonstrating a pattern of strengthening its development tooling ecosystem through targeted acquisitions.

Fuente Original: https://arstechnica.com/ai/2026/03/openai-is-acquiring-open-source-python-tool-maker-astral/

Artículo generado mediante LaRebelionBOT

sábado, 7 de marzo de 2026

10 Ejercicios Resueltos de Redes: Sockets TCP y UDP en Python y C (Nivel Universidad)

Cualquier aplicación moderna necesita conectarse a Internet. En la asignatura de Redes de Computadores, la teoría del Modelo OSI está muy bien, pero donde de verdad se aprende es programando Sockets.

En larebelion.com hemos preparado 10 ejercicios de exámenes de universidades españolas. Nos centraremos principalmente en la API de Sockets de Python por su claridad, pero incluiremos la base en C para los más puristas. Prepara tus puertos locales, ¡que empezamos a escuchar conexiones!


1. Servidor TCP Básico (UPM)

Enunciado: Crea un servidor TCP en Python que escuche en el puerto 8080. Cuando un cliente se conecte, debe enviarle el mensaje "Bienvenido al servidor" y cerrar la conexión.

import socket

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('0.0.0.0', 8080))
server.listen(5)
print("Servidor TCP escuchando en puerto 8080...")

while True:
    client_socket, addr = server.accept()
    print(f"Conexión establecida desde {addr}")
    client_socket.send(b"Bienvenido al servidor\n")
    client_socket.close()

2. Cliente TCP Básico (UPC)

Enunciado: Escribe el código del cliente en Python que se conecte al servidor TCP del ejercicio anterior (en localhost), reciba el mensaje, lo imprima por pantalla y se desconecte.

import socket

cliente = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
cliente.connect(('127.0.0.1', 8080))

# Recibimos hasta 1024 bytes
respuesta = cliente.recv(1024)
print("Mensaje del servidor:", respuesta.decode('utf-8'))
cliente.close()

3. Servidor UDP de Eco (UV)

Enunciado: A diferencia de TCP, UDP no está orientado a conexión. Crea un servidor UDP en el puerto 9000 que reciba un mensaje y se lo devuelva al remitente exactamente igual (Echo Server).

import socket

# SOCK_DGRAM indica que usaremos UDP
server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server.bind(('0.0.0.0', 9000))
print("Servidor UDP Eco iniciado...")

while True:
    datos, direccion = server.recvfrom(1024)
    print(f"Recibido de {direccion}: {datos.decode()}")
    server.sendto(datos, direccion)

4. Cliente UDP interactivo (UGR)

Enunciado: Crea un cliente UDP que pida al usuario que escriba un texto por consola, lo envíe al servidor del ejercicio 3 y muestre la respuesta.

import socket

cliente = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
direccion_servidor = ('127.0.0.1', 9000)

mensaje = input("Escribe un mensaje para enviar: ")
cliente.sendto(mensaje.encode(), direccion_servidor)

respuesta, addr = cliente.recvfrom(1024)
print("Eco del servidor:", respuesta.decode())
cliente.close()

5. Estructuras en C: Inicializar un Socket (UC3M)

Enunciado: En C, las cosas son más manuales. Escribe el fragmento de código necesario en C para crear un socket TCP y preparar la estructura sockaddr_in para el puerto 80.

#include <sys/socket.h>
#include <netinet/in.h>

int server_fd;
struct sockaddr_in address;

// 1. Crear file descriptor del socket
server_fd = socket(AF_INET, SOCK_STREAM, 0);

// 2. Configurar la estructura de red
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(80); // htons convierte al formato de red

6. Python: Servidor TCP Multihilo (US)

Enunciado: Un servidor básico se bloquea con cada cliente. Usa la librería threading para crear un servidor TCP que asigne un hilo nuevo a cada cliente que se conecte, permitiendo conexiones concurrentes.

import socket
import threading

def manejar_cliente(conn, addr):
    print(f"Nuevo hilo para {addr}")
    conn.send(b"Hola desde un hilo concurrente!\n")
    conn.close()

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('0.0.0.0', 8888))
server.listen(5)

while True:
    conn, addr = server.accept()
    hilo = threading.Thread(target=manejar_cliente, args=(conn, addr))
    hilo.start()

7. Resolución de DNS (UAM)

Enunciado: Usa los métodos de socket en Python para preguntar al usuario un nombre de dominio (ej: google.com) y devolver su dirección IP (resolución DNS directa).

import socket

def obtener_ip():
    dominio = input("Introduce un dominio (ej. larebelion.com): ")
    try:
        ip = socket.gethostbyname(dominio)
        print(f"La IP de {dominio} es {ip}")
    except socket.gaierror:
        print("No se pudo resolver el hostname.")

obtener_ip()

8. Concurrencia en C usando Fork (UNED)

Enunciado: En C de Linux, la concurrencia a menudo se logra creando procesos hijos. Escribe la lógica del bucle principal de un servidor concurrente usando fork().

// Asumimos que socket, bind y listen ya están hechos
while(1) {
    int client_socket = accept(server_fd, NULL, NULL);
    if (fork() == 0) {
        // --- ESTE ES EL PROCESO HIJO ---
        close(server_fd); // El hijo no necesita escuchar
        send(client_socket, "Hola\n", 5, 0);
        close(client_socket);
        exit(0); // Matamos al hijo tras atender
    } else {
        // --- ESTE ES EL PROCESO PADRE ---
        close(client_socket); // El padre delega en el hijo
    }
}

9. Escáner de Puertos Básico (UMA)

Enunciado: Crea un script en Python que intente conectarse (usando connect_ex) a los puertos del 20 al 25 de la IP 127.0.0.1 e imprima cuáles están abiertos.

import socket

ip = '127.0.0.1'
print(f"Escaneando puertos en {ip}...")

for puerto in range(20, 26):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.settimeout(0.5)
    # connect_ex devuelve 0 si la conexión es exitosa
    resultado = sock.connect_ex((ip, puerto))
    if resultado == 0:
        print(f"Puerto {puerto}: ABIERTO")
    sock.close()

10. Petición HTTP GET Manual (USAL)

Enunciado: HTTP no es magia, es solo texto enviado por un socket TCP. Escribe un cliente TCP que se conecte a un servidor web en el puerto 80, envíe la cabecera GET / HTTP/1.1 y reciba el HTML.

import socket

host = 'example.com'
cliente = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
cliente.connect((host, 80))

# Petición HTTP cruda (los saltos de línea \r\n son obligatorios)
peticion = f"GET / HTTP/1.1\r\nHost: {host}\r\nConnection: close\r\n\r\n"
cliente.send(peticion.encode())

respuesta = cliente.recv(4096)
print(respuesta.decode())
cliente.close()

10 Ejercicios de Python Resueltos: Ficheros, RegEx, Pandas y NumPy

¡Llegamos al final de nuestra megaguía en larebelion.com! Ya hemos superado las bases, las estructuras, la POO y la algoritmia. ¿Qué nos queda? Interactuar con el mundo real.

En este último bloque de 10 ejercicios (del 41 al 50) nos enfrentamos a problemas de exámenes de universidades españolas que exigen leer ficheros TXT, CSV y JSON, validar datos con Expresiones Regulares (RegEx) y utilizar las librerías estrella: Pandas y NumPy. ¡Vamos a por el 10!




41. Ficheros TXT: Contar Líneas y Palabras (UAH)

Enunciado: Escribe una función que abra un archivo de texto en modo lectura y devuelva una tupla con el número total de líneas y el número total de palabras.

def analizar_archivo(ruta):
    try:
        with open(ruta, 'r', encoding='utf-8') as f:
            lineas = f.readlines()
            num_lineas = len(lineas)
            num_palabras = sum(len(linea.split()) for linea in lineas)
            return (num_lineas, num_palabras)
    except FileNotFoundError:
        return "Archivo no encontrado"

42. Ficheros: Escribir sin Sobrescribir (UAL)

Enunciado: Crea una función que reciba una ruta y una cadena de texto, y añada ese texto al final del archivo existente sin borrar su contenido anterior.

def anadir_log(ruta, mensaje):
    # Usamos el modo 'a' (append) en lugar de 'w' (write)
    with open(ruta, 'a', encoding='utf-8') as f:
        f.write(mensaje + "\n")

43. Manejo de JSON: Guardar Diccionarios (URV)

Enunciado: Dado un diccionario de Python con datos de estudiantes, expórtalo a un archivo con formato JSON, asegurando que la indentación sea de 4 espacios.

import json

def guardar_json(datos, ruta_salida):
    with open(ruta_salida, 'w', encoding='utf-8') as f:
        json.dump(datos, f, indent=4, ensure_ascii=False)

44. CSV Nativo: Leer Columnas (UJI)

Enunciado: Usando solo la librería estándar csv, lee un archivo y devuelve una lista con todos los valores de la segunda columna.

import csv

def extraer_columna(ruta_csv):
    columna = []
    with open(ruta_csv, 'r', encoding='utf-8') as f:
        lector = csv.reader(f)
        for fila in lector:
            if len(fila) > 1:
                columna.append(fila[1])
    return columna

45. RegEx: Validador de DNI Español (UCA)

Enunciado: Escribe una función que utilice expresiones regulares para comprobar si un string tiene el formato válido de un DNI español (8 números seguidos de una letra mayúscula).

import re

def es_dni_valido(dni):
    # Patrón: Exactamente 8 dígitos (\d{8}) y 1 letra mayúscula ([A-Z])
    patron = r"^\d{8}[A-Z]$"
    return bool(re.match(patron, dni))

46. RegEx: Extractor de Correos Electrónicos (UNIOVI)

Enunciado: Dado un texto largo, extrae todas las direcciones de correo electrónico que aparezcan en él usando re.findall.

import re

def extraer_emails(texto):
    patron = r"[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}"
    return re.findall(patron, texto)

47. NumPy: Arrays 1D a 2D (UPNA)

Enunciado: Utiliza NumPy para crear un array de 12 elementos (del 1 al 12) y luego cambia su forma (reshape) para convertirlo en una matriz de 3x4.

import numpy as np

def crear_matriz_numpy():
    # np.arange(1, 13) crea array del 1 al 12
    array_1d = np.arange(1, 13)
    matriz_2d = array_1d.reshape((3, 4))
    return matriz_2d

48. Pandas: Leer y Calcular Media (UPO)

Enunciado: Escribe un código usando Pandas que lea un archivo "alumnos.csv" y calcule la media aritmética de la columna llamada 'Nota_Final'.

import pandas as pd

def calcular_media_csv(ruta):
    df = pd.read_csv(ruta)
    if 'Nota_Final' in df.columns:
        return df['Nota_Final'].mean()
    return None

49. Pandas: Filtrado de DataFrames (UCLM)

Enunciado: Dado un DataFrame de Pandas con información de empleados, filtra y devuelve solo aquellos que pertenezcan al departamento de 'IT' y cobren más de 2000€.

import pandas as pd

def filtrar_empleados(df):
    # Uso de condiciones booleanas múltiples con &
    filtro = df[(df['Departamento'] == 'IT') & (df['Salario'] > 2000)]
    return filtro

50. El Ejercicio Final: Manejo de Excepciones Múltiples (UVA)

Enunciado: Crea una función que intente convertir un input de texto a número entero y luego dividir 100 entre ese número. Atrapa específicamente los errores ValueError y ZeroDivisionError.

def division_segura(entrada):
    try:
        numero = int(entrada)
        resultado = 100 / numero
        return resultado
    except ValueError:
        return "Error: Debes introducir un número válido."
    except ZeroDivisionError:
        return "Error: No se puede dividir entre cero."

10 Ejercicios de Algoritmia en Python: Pilas, Colas, Recursividad y Matrices

Bienvenidos a una nueva entrega en larebelion.com. Si ya dominas la sintaxis básica y la Orientación a Objetos, es hora de enfrentarse al verdadero reto de la Ingeniería Informática: la Algoritmia.

En este post hemos recopilado 10 ejercicios de exámenes enfocados en estructuras de datos lineales (Pilas y Colas), matrices y recursividad avanzada. Dominar esto es la clave para superar asignaturas como Estructuras de Datos y Algoritmos.




31. Pilas (Stacks): Paréntesis Balanceados (UPM)

Enunciado: Implementa una función que use una Pila (Stack) para verificar si una cadena de texto tiene los paréntesis (), corchetes [] y llaves {} correctamente balanceados.

def esta_balanceado(cadena):
    pila = []
    pares = {')': '(', ']': '[', '}': '{'}
    for char in cadena:
        if char in pares.values():
            pila.append(char)
        elif char in pares.keys():
            if not pila or pila.pop() != pares[char]:
                return False
    return len(pila) == 0

32. Colas (Queues): Simulación de Impresora (UPC)

Enunciado: Usando collections.deque, simula una cola de impresión donde se añaden documentos y se imprimen (procesan) en orden FIFO (First In, First Out).

from collections import deque

class ColaImpresion:
    def __init__(self): self.cola = deque()

    def agregar_trabajo(self, documento):
        self.cola.append(documento)

    def imprimir(self):
        if self.cola:
            return self.cola.popleft()
        return "Sin trabajos"

33. Matrices: Suma de la Diagonal Principal (UGR)

Enunciado: Dada una matriz cuadrada (lista de listas), calcula la suma de los elementos de su diagonal principal.

def suma_diagonal(matriz):
    # Usando comprensión de listas para mayor elegancia
    return sum(matriz[i][i] for i in range(len(matriz)))

34. Matrices: Multiplicación de Matrices (UC3M)

Enunciado: Escribe un algoritmo de complejidad $O(n^3)$ que multiplique dos matrices A y B, devolviendo la matriz resultante.

def multiplicar_matrices(A, B):
    filas_A, cols_A = len(A), len(A[0])
    cols_B = len(B[0])
    C = [[0 for _ in range(cols_B)] for _ in range(filas_A)]
    for i in range(filas_A):
        for j in range(cols_B):
            for k in range(cols_A):
                C[i][j] += A[i][k] * B[k][j]
    return C

35. Recursividad: Torres de Hanoi (UCM)

Enunciado: Implementa el clásico problema de las Torres de Hanoi recursivamente, imprimiendo los movimientos necesarios para trasladar n discos.

def hanoi(n, origen, destino, auxiliar):
    if n == 1:
        print(f"Mover disco 1 de {origen} a {destino}")
        return
    hanoi(n-1, origen, auxiliar, destino)
    print(f"Mover disco {n} de {origen} a {destino}")
    hanoi(n-1, auxiliar, destino, origen)

36. Recursividad: Algoritmo de Euclides (USAL)

Enunciado: Calcula el Máximo Común Divisor (MCD) de dos números enteros utilizando la versión recursiva del algoritmo de Euclides.

def mcd_euclides(a, b):
    # Caso base: si el resto es 0, el MCD es 'a'
    if b == 0:
        return a
    # Llamada recursiva con b y el resto de a/b
    return mcd_euclides(b, a % b)

37. Recursividad: Suma de Dígitos (UNED)

Enunciado: Escribe una función recursiva que reciba un número entero positivo y devuelva la suma de todos sus dígitos.

def suma_digitos(n):
    if n == 0:
        return 0
    return (n % 10) + suma_digitos(n // 10)

38. Algoritmos de Ordenación: Bubble Sort (UV)

Enunciado: Implementa el algoritmo de Ordenación de Burbuja (Bubble Sort). Aunque es de complejidad $O(n^2)$, es un clásico que siempre cae en exámenes de primero.

def bubble_sort(lista):
    n = len(lista)
    for i in range(n):
        for j in range(0, n-i-1):
            if lista[j] > lista[j+1]:
                # Intercambio de variables
                lista[j], lista[j+1] = lista[j+1], lista[j]
    return lista

39. Algoritmos de Ordenación: Selection Sort (UAM)

Enunciado: Implementa la Ordenación por Selección (Selection Sort), buscando el elemento mínimo en cada iteración y colocándolo al principio.

def selection_sort(lista):
    for i in range(len(lista)):
        min_idx = i
        for j in range(i+1, len(lista)):
            if lista[j] < lista[min_idx]:
                min_idx = j
        lista[i], lista[min_idx] = lista[min_idx], lista[i]
    return lista

40. Algoritmos de Ordenación: Insertion Sort (US)

Enunciado: Implementa la Ordenación por Inserción (Insertion Sort), el algoritmo que simula cómo ordenaríamos una baraja de cartas en la mano.

def insertion_sort(lista):
    for i in range(1, len(lista)):
        clave = lista[i]
        j = i - 1
        while j >= 0 and clave < lista[j]:
            lista[j + 1] = lista[j]
            j -= 1
        lista[j + 1] = clave
    return lista

10 Ejercicios Resueltos de Python: Programación Orientada a Objetos (POO) en la Universidad

Llegamos al núcleo duro de la carrera en larebelion.com. Si quieres aprobar asignaturas como Programación II o Metodología de la Programación, tienes que dominar las clases, los objetos, la herencia y el polimorfismo en Python.

Te traemos 10 ejercicios clásicos de exámenes sobre POO extraídos de las mejores facultades de España. ¡Prepara tus métodos __init__ porque empezamos!




21. Clase Básica: Geometría (UPM)

Enunciado: Crea una clase Rectangulo que reciba la base y la altura en su constructor, y contenga métodos para calcular el área y el perímetro.

class Rectangulo:
    def __init__(self, base, altura):
        self.base = base
        self.altura = altura

    def area(self):
        return self.base * self.altura

    def perimetro(self):
        return 2 * (self.base + self.altura)

22. Encapsulamiento: Cuenta Bancaria (UPC)

Enunciado: Implementa una clase CuentaBancaria con un atributo privado para el saldo (__saldo) y métodos para depositar y retirar dinero, validando que no se pueda retirar más del saldo disponible.

class CuentaBancaria:
    def __init__(self, saldo_inicial=0):
        self.__saldo = saldo_inicial

    def depositar(self, cantidad):
        if cantidad > 0: self.__saldo += cantidad

    def retirar(self, cantidad):
        if 0 < cantidad <= self.__saldo:
            self.__saldo -= cantidad
            return True
        return False

    def get_saldo(self):
        return self.__saldo

23. Herencia: Vehículos (UGR)

Enunciado: Crea una clase base Vehiculo con atributos marca y ruedas. Luego, crea una subclase Coche que herede de ella y añada el atributo puertas.

class Vehiculo:
    def __init__(self, marca, ruedas):
        self.marca = marca
        self.ruedas = ruedas

class Coche(Vehiculo):
    def __init__(self, marca, puertas):
        # Llamamos al constructor padre con super()
        super().__init__(marca, ruedas=4)
        self.puertas = puertas

24. Polimorfismo: Empleados (UV)

Enunciado: Define una clase Empleado con un método calcular_salario(). Crea las clases Programador y Gerente que sobrescriban este método de forma diferente.

class Empleado:
    def __init__(self, base): self.base = base
    def calcular_salario(self): pass

class Programador(Empleado):
    def calcular_salario(self):
        return self.base + 500 # Bono de código

class Gerente(Empleado):
    def calcular_salario(self):
        return self.base + 2000 # Bono de dirección

25. Composición: Ordenador y CPU (UC3M)

Enunciado: Demuestra la composición creando una clase Procesador que se instancie dentro del constructor de una clase Ordenador.

class Procesador:
    def __init__(self, modelo):
        self.modelo = modelo

class Ordenador:
    def __init__(self, marca, cpu_modelo):
        self.marca = marca
        # Composición: El procesador pertenece al ordenador
        self.cpu = Procesador(cpu_modelo)

26. Métodos Mágicos (Dunder): __str__ (US)

Enunciado: Crea una clase Libro (título, autor) y sobrescribe el método __str__ para que al hacer print(libro) devuelva "Título por Autor".

class Libro:
    def __init__(self, titulo, autor):
        self.titulo = titulo
        self.autor = autor

    def __str__(self):
        return f"{self.titulo} por {self.autor}"

27. Sobrecarga de Operadores: __add__ (UMA)

Enunciado: Implementa una clase Punto2D (x, y) que permita sumar dos puntos usando el operador matemático +.

class Punto2D:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __add__(self, otro_punto):
        return Punto2D(self.x + otro_punto.x, self.y + otro_punto.y)

28. Atributos de Clase vs Instancia (UAM)

Enunciado: Crea una clase Usuario que lleve la cuenta total de cuántos usuarios han sido instanciados usando un atributo de clase.

class Usuario:
    # Atributo de clase
    total_usuarios = 0

    def __init__(self, nombre):
        self.nombre = nombre # Atributo de instancia
        Usuario.total_usuarios += 1

29. Excepciones Personalizadas (UNED)

Enunciado: Crea una excepción propia llamada SaldoInsuficienteError y lánzala (raise) en una clase Monedero si se intenta pagar más de lo que hay.

class SaldoInsuficienteError(Exception):
    pass

class Monedero:
    def __init__(self, saldo): self.saldo = saldo

    def pagar(self, importe):
        if importe > self.saldo:
            raise SaldoInsuficienteError("No hay dinero suficiente.")
        self.saldo -= importe

30. Relación entre Clases: Universidad (USAL)

Enunciado: Escribe una clase Curso que mantenga una lista de objetos Alumno. Implementa un método para matricular un alumno en el curso.

class Alumno:
    def __init__(self, nombre): self.nombre = nombre

class Curso:
    def __init__(self, nombre_asignatura):
        self.asignatura = nombre_asignatura
        self.alumnos = [] # Lista de objetos Alumno

    def matricular(self, alumno):
        self.alumnos.append(alumno)

    def listar_alumnos(self):
        return [a.nombre for a in self.alumnos]

10 Ejercicios de Python Resueltos: Diccionarios, Sets y Tuplas en la Universidad

Continuamos con nuestra megaguía de Python en larebelion.com. Una vez que dominas los bucles y las listas, los profesores de la universidad suben el nivel exigiendo eficiencia. Y ahí es donde entran los diccionarios (Tablas Hash) y los conjuntos (Sets).

Aquí tienes 10 ejercicios reales de universidades españolas (UCM, UAB, UNED...) centrados puramente en estructuras de datos complejas.




11. Frecuencia de Caracteres (UCM - Universidad Complutense)

Enunciado: Escribe una función que reciba una cadena de texto y devuelva un diccionario con la cantidad de veces que aparece cada carácter.

def contar_caracteres(cadena):
    frecuencias = {}
    for char in cadena:
        frecuencias[char] = frecuencias.get(char, 0) + 1
    return frecuencias

12. Elementos Comunes con Sets (UAB - Universitat Autònoma de Barcelona)

Enunciado: Dadas dos listas, devuelve una nueva lista con los elementos comunes sin usar bucles anidados (complejidad $O(n)$).

def elementos_comunes(lista1, lista2):
    # Convertimos a sets y usamos la intersección &
    return list(set(lista1) & set(lista2))

13. Agrupar Palabras por Longitud (UPNA - U. Pública de Navarra)

Enunciado: Dada una lista de palabras, devuelve un diccionario donde las claves sean las longitudes de las palabras y los valores listas de palabras con esa longitud.

def agrupar_longitud(palabras):
    grupos = {}
    for p in palabras:
        longitud = len(p)
        if longitud not in grupos:
            grupos[longitud] = []
        grupos[longitud].append(p)
    return grupos

14. Combinar y Sumar Diccionarios (UNED)

Enunciado: Dados dos diccionarios con claves de texto y valores numéricos, devuelve un diccionario combinado. Si una clave existe en ambos, sus valores deben sumarse.

def combinar_diccionarios(d1, d2):
    resultado = d1.copy()
    for k, v in d2.items():
        resultado[k] = resultado.get(k, 0) + v
    return resultado

15. Eliminar Duplicados Manteniendo Orden (USC - U. de Santiago)

Enunciado: Elimina los duplicados de una lista, pero a diferencia de usar set() directamente, mantén el orden original de los elementos.

def unicos_con_orden(lista):
    vistos = set()
    resultado = []
    for item in lista:
        if item not in vistos:
            vistos.add(item)
            resultado.append(item)
    return resultado

16. Diccionario de Diccionarios: Notas de Alumnos (UCA - U. de Cádiz)

Enunciado: Recibe un diccionario donde las claves son alumnos y los valores diccionarios con asignaturas y notas. Calcula la media de cada alumno.

def calcular_medias(registro):
    medias = {}
    for alumno, notas in registro.items():
        if notas:
            medias[alumno] = sum(notas.values()) / len(notas)
        else:
            medias[alumno] = 0.0
    return medias

17. Subconjuntos Estrictos (ULL - U. de La Laguna)

Enunciado: Escribe una función que verifique si la lista A es un subconjunto de la lista B, asumiendo que todos los elementos son únicos.

def es_subconjunto(lista_a, lista_b):
    return set(lista_a).issubset(set(lista_b))

18. Tuplas: Min y Max en una pasada (UNIZAR - U. de Zaragoza)

Enunciado: Encuentra el valor máximo y mínimo de una lista en un solo bucle y devuélvelos empaquetados en una tupla.

def min_max(numeros):
    if not numeros: return None
    minimo = maximo = numeros[0]
    for n in numeros[1:]:
        if n < minimo: minimo = n
        if n > maximo: maximo = n
    return (minimo, maximo)

19. Crear Diccionario desde Dos Listas usando Zip (UCLM)

Enunciado: Dadas dos listas, una de claves y otra de valores, conviértelas en un diccionario. Asegúrate de manejar el caso donde las listas tienen diferentes tamaños.

def fusionar_listas(claves, valores):
    # Zip trunca a la lista más corta automáticamente
    return dict(zip(claves, valores))

20. Invertir Diccionario (URV - Universitat Rovira i Virgili)

Enunciado: Dado un diccionario, devuelve uno nuevo donde las claves sean los valores antiguos, y los valores sean las claves antiguas. Supón que los valores originales son únicos.

def invertir_diccionario(dic):
    # Usamos dictionary comprehension
    return {v: k for k, v in dic.items()}

10 Ejercicios Resueltos de Python: Guía Definitiva para Ingeniería Informática

Si estás en primero de Grado en Ingeniería Informática, este post es tu salvavidas. Hemos recopilado 10 ejercicios clásicos de exámenes de la UPM, UPC, UGR y más, con soluciones optimizadas.




1. El Factorial Recursivo (UPM)

Enunciado: Calcula el factorial de un número $n!$ usando recursividad.

def factorial(n):
    if n == 0: return 1
    return n * factorial(n - 1)

2. Criba de Eratóstenes Simplificada (UPC)

Enunciado: Devuelve una lista de números primos hasta un límite $N$.

def primos(n):
    res = []
    for i in range(2, n + 1):
        if all(i % d != 0 for d in range(2, int(i**0.5) + 1)):
            res.append(i)
    return res

3. Verificador de Palíndromos (UGR)

Enunciado: Detecta si una frase es palíndroma ignorando espacios.

def es_palindromo(s):
    s = s.lower().replace(" ", "")
    return s == s[::-1]

4. Frecuencia de Palabras (UV)

Enunciado: Cuenta cuántas veces aparece cada palabra en un texto.

def frecuencia(texto):
    palabras = texto.split()
    dic = {}
    for p in palabras:
        dic[p] = dic.get(p, 0) + 1
    return dic

5. Búsqueda Binaria (UC3M)

Enunciado: Implementa la búsqueda eficiente en listas ordenadas.

def busqueda_binaria(lista, x):
    izq, der = 0, len(lista) - 1
    while izq <= der:
        m = (izq + der) // 2
        if lista[m] == x: return m
        if lista[m] < x: izq = m + 1
        else: der = m - 1
    return -1

6. Transposición de Matrices (UMA)

Enunciado: Dada una matriz, devuelve su transpuesta.

def transponer(m):
    return [[m[j][i] for j in range(len(m))] for i in range(len(m[0]))]

7. Sucesión de Fibonacci (US)

Enunciado: Genera los primeros $n$ números de la serie.

def fibonacci(n):
    a, b = 0, 1
    for _ in range(n):
        print(a)
        a, b = b, a + b

8. Filtro de Mayores de Edad (UAM)

Enunciado: Filtra un diccionario de personas por edad > 18.

def filtrar_adultos(personas):
    return {k: v for k, v in personas.items() if v >= 18}

9. Validador de Anagramas (UA)

Enunciado: Determina si dos palabras contienen las mismas letras.

def es_anagrama(p1, p2):
    return sorted(p1) == sorted(p2)

10. Inversión de Cadenas (URJC)

Enunciado: Invierte una cadena sin usar [::-1].

def invertir(s):
    res = ""
    for char in s: res = char + res
    return res