61 ejercicios de Python de los módulos de Lenguajes de Marcas, Bases de Datos, Sistemas Informáticos, Sistemas de Gestión Empresarial. Tratamiento de textos y ficheros CSV, XML y JSON, cálculos, simulaciones del sistema operativo y programas parecidos a los que se escriben para un ERP como Odoo.
Cada ejercicio trae enunciado, pistas y pruebas automáticas: escribes el código aquí mismo, lo ejecutas y ves al momento si es correcto. Tu progreso se guarda en el tema del que sale cada ejercicio.
Marcas · Fundamentos de Lenguajes de Marcas ver el tema
¿Están bien anidadas las etiquetas?
Medio
Un documento XML bien formado tiene un único elemento raíz y todas sus etiquetas cerradas en orden inverso al de apertura. Lee el documento completo y recorre sus etiquetas (ya están extraídas con una expresión regular; se ignoran <?…?>, comentarios y DOCTYPE)…
Atributos y referencias de entidad
Difícil
Además de anidar bien, un XML bien formado exige que los atributos tengan valor entre comillas (simples o dobles), sin repetirse en la misma etiqueta y sin «<» en el valor, y que cada «&» empiece una referencia válida: & < > " ', &#número; …
Resolver los espacios de nombres
Muy difícil
Un procesador XML no trabaja con prefijos sino con nombres expandidos {URI}local. Lee un documento bien formado y muestra el árbol con el nombre expandido de cada elemento, sangrado dos espacios por nivel; debajo, sangrados dos espacios más, sus atributos «@no…
Marcas · Sindicación de contenidos: RSS y Atom ver el tema
Genera un canal RSS 2.0 correcto
Difícil
Una panadería quiere publicar sus novedades como canal RSS. La primera línea tiene «título|enlace|descripción» del canal y cada una de las siguientes una noticia «fecha ISO 8601|título|enlace|descripción|categoría». Construye el documento con xml.etree.Element…
Un agregador que mezcla RSS y Atom
Muy difícil
Un agregador junta varios canales en una sola lista. La entrada empieza con «maximo N» y después vienen los documentos separados por líneas «=====»: unos son RSS 2.0 (raíz <rss>) y otros Atom 1.0 (raíz <feed> en el espacio de nombres http://www.w3.org/2005/Ato…
Marcas · Sistemas de Gestión de Información Empresarial ver el tema
Importación incremental con identificadores externos
Muy difícil
Los ERP como Odoo importan datos de forma incremental gracias a un identificador externo (external_id): si ya existe, el registro se actualiza; si no, se crea. La entrada tiene una sección [erp] con los clientes actuales «external_id;nif;nombre;email;activo(si…
¿Por qué una base de datos con índice encuentra un registro entre millones casi al instante? La entrada tiene registros «id nombre» en el orden en que están en el fichero (desordenados) y búsquedas «buscar id». El índice ya está construido: una lista ordenada …
Fragmentación de una base de datos distribuida
Difícil
En una base de datos distribuida, una tabla se reparte en fragmentos guardados en distintas sedes. La entrada define la tabla («tabla nombre col1,col2…»), sus filas («fila v1,v2,…»), fragmentos horizontales («fragmento F sede=S campo=v1,v2»: las filas cuyo cam…
Anonimizar datos personales: k-anonimato
Muy difícil
El RGPD permite publicar o compartir datos para estudios si están anonimizados, pero quitar el nombre no basta: la edad, el código postal y el sexo juntos identifican a mucha gente. La entrada empieza con «k K» y una tabla «nombre;dni;edad;cp;sexo;diagnostico»…
En el modelo E/R, la cardinalidad (mínimo, máximo) de una entidad en una relación dice en cuántas ocurrencias de la relación participa cada una de sus instancias. La entrada define las instancias de dos entidades («entidad Nombre i1 i2 …»), la relación («relac…
Del diagrama E/R a las tablas
Difícil
Aplica las reglas de transformación del modelo E/R al relacional. La entrada tiene entidades «entidad Nombre *clave atributo …» (los atributos con * forman la clave primaria) y relaciones binarias «relacion nombre Entidad1 c1 Entidad2 c2 [atributos]» con c1 y …
Claves candidatas y forma normal
Muy difícil
Normalizar empieza por saber qué claves tiene una relación y qué dependencias rompen cada forma normal. La primera línea es el esquema «R(A,B,C…)» y las siguientes, dependencias funcionales «X1,X2 -> Y1,Y2». Implementa cierre(x) (todos los atributos que se ded…
Antes de crear una tabla a partir de datos existentes (una hoja de cálculo, un CSV) hay que decidir la clave primaria. La entrada es un CSV sencillo: la cabecera y las filas, con los valores vacíos como nulos. Muestra para cada columna «col: k valores distinto…
Integridad referencial al borrar e insertar
Difícil
Una clave ajena impide que queden filas «huérfanas», y su regla ON DELETE decide qué pasa al borrar la fila referenciada: RESTRICT (se impide el borrado), CASCADE (se borran también las filas que la referencian) o SET NULL (su clave ajena pasa a NULL). La entr…
Un intérprete de álgebra relacional
Muy difícil
El álgebra relacional es la base teórica de SQL: cada consulta es una composición de operaciones sobre relaciones que devuelven relaciones. Programa un intérprete. La entrada define tablas («tabla nombre c1,c2,…», sus filas con valores separados por comas y «f…
Los fabricantes miden en unidades decimales (1 GB = 10⁹ bytes) y muchos sistemas operativos en binarias (1 GiB = 2³⁰ bytes, aunque Windows lo muestre como «GB»). Cada línea de la entrada es una cantidad y una unidad (B, KB, MB, GB, TB, KiB, MiB, GiB o TiB). Mu…
Dimensionar la fuente de alimentación
Difícil
Las primeras líneas son los componentes con su consumo máximo, «nombre vatios» (el nombre puede tener espacios). Después vienen cuatro líneas de configuración «clave=valor»: certificacion (bronze, gold o platinum, con eficiencias 0.85, 0.90 y 0.92), uso (porce…
Ancho de banda y cuellos de botella
Muy difícil
Cada línea describe un componente. «ram DDR5-6000 2» es memoria del tipo indicado (el número son millones de transferencias por segundo, MT/s) en 2 canales: cada canal transfiere 8 bytes, así que el ancho de banda en GB/s es MT/s × 8 × canales / 1000. «ssd 700…
La primera línea es el algoritmo: FCFS (el primero que llega, se ejecuta primero) o SJF (de los que ya han llegado, el de ráfaga más corta; a igualdad, el que llegó antes y después por nombre). Ambos son no expropiativos: un proceso se ejecuta hasta terminar. …
Round Robin con quantum
Difícil
La primera línea es «quantum Q»; cada línea siguiente, un proceso «nombre llegada ráfaga». Simula Round Robin: el proceso al frente de la cola se ejecuta como mucho Q unidades; si no termina, vuelve al final de la cola. Los procesos que llegan durante ese tram…
Reemplazo de páginas: FIFO, LRU y óptimo
Muy difícil
Cuando la memoria está llena y se necesita una página que no está cargada (fallo de página), el sistema operativo elige una víctima. La primera línea es «marcos N» (páginas que caben en memoria, inicialmente vacía) y la segunda, la cadena de referencias separa…
Sistemas · Instalación de Sistemas Operativos ver el tema
Un plan de particiones alineado
Medio
La primera línea es «disco N GiB» (N entero). Cada línea siguiente es una partición «nombre tamaño», con el tamaño en MiB («512MiB»), en GiB («50GiB», puede tener decimales) o «resto» (todo lo que quede). En un disco GPT, el primer MiB queda reservado (tabla y…
¿Arrancará este esquema de particiones?
Difícil
Las tres primeras líneas son «firmware uefi|bios», «tabla gpt|mbr» y «disco N» (GiB). Cada línea siguiente es una partición «nombre clase sistema tamaño punto» (clase: primaria, extendida o logica; sistema: fat32, ntfs, ext4, swap…; tamaño en GiB; punto de mon…
Leer la tabla de particiones de un MBR
Muy difícil
El sector 0 de un disco MBR termina con la tabla de particiones: 4 entradas de 16 bytes (desde el byte 446) y la firma 55 AA. La entrada recibe esos 66 bytes en hexadecimal. En cada entrada: el byte 0 es 0x80 si la partición es la activa (arrancable); el byte …
Sistemas · Sistemas de Ficheros y Copias de Seguridad ver el tema
Capacidad y tolerancia de un RAID
Medio
Cada línea es «nivel discos tamaño_GB», con el nivel RAID0, RAID1, RAID5, RAID6 o RAID10. Calcula la capacidad útil (RAID0: suma de todos; RAID1: un disco, porque todos son copias; RAID5: n − 1 discos; RAID6: n − 2; RAID10: la mitad), la eficiencia (útil / tot…
Simulador de estrategias de copia
Difícil
La primera línea es «datos N» (GB que se copian), la segunda «cambio P» (porcentaje de los datos que se modifica cada día, siempre ficheros distintos) y la tercera «plan …» con un tipo de copia por día: C (completa: copia todo), I (incremental: lo que ha cambi…
¿Es buena esta copia de seguridad?
Muy difícil
Para comprobar una copia se compara un manifiesto del original con otro de la copia: cada línea es «ruta tamaño hash» (como lo que genera sha256sum, abreviado). La entrada tiene los dos manifiestos separados por una línea «---». Informa, en este orden: los fic…
Cada línea describe un tramo de cable: «medio metros velocidad», con el medio cat5e, cat6, cat6a, cat8 (par trenzado), om3, om4 (fibra multimodo) u os2 (fibra monomodo) y la velocidad en Gbit/s con una G (1G, 10G…). El diccionario MAXIMO indica la distancia má…
La tabla MAC de un switch
Difícil
Un switch aprende en qué puerto está cada equipo mirando la MAC de origen de las tramas que recibe. La primera línea es «puertos N»; cada línea siguiente, una trama recibida: «puerto MAC_origen MAC_destino». Para cada trama: si la MAC de origen no estaba en la…
Puntos únicos de fallo de una red
Muy difícil
La primera línea es «raiz NOMBRE»: el equipo por el que se sale a Internet (normalmente el router). Cada línea siguiente es un enlace «enlace A B» entre dos equipos (los enlaces funcionan en los dos sentidos). Para cada equipo con dos o más enlaces que no sea …
Sistemas · Configuración de Redes TCP/IP ver el tema
¿Pueden hablar sin router?
Medio
Dos equipos solo se comunican directamente si están en la misma red, es decir, si su IP AND la máscara da el mismo resultado. Cada línea tiene «IP/prefijo IP2»: el primer equipo con su prefijo y la IP del segundo (que usa la misma máscara). Muestra «IP y IP2: …
Abreviar y expandir direcciones IPv6
Difícil
Cada línea es una dirección IPv6. Si está completa (8 grupos sin «::»), abréviala: quita los ceros a la izquierda de cada grupo (un grupo todo a ceros queda como 0) y sustituye por «::» la serie más larga de dos o más grupos seguidos a cero (si hay dos igual d…
Calculadora VLSM
Muy difícil
La primera línea es «red A.B.C.D/p», la red que hay que repartir. Cada línea siguiente es «nombre hosts»: un departamento y los equipos que necesita. Con VLSM, asigna las subredes de la que más hosts necesita a la que menos (a igualdad, por nombre), cada una d…
Sistemas · Servicios de Red, Recursos Compartidos y Seguridad ver el tema
Permisos efectivos de una carpeta compartida
Medio
En Windows, a una carpeta compartida por la red se le aplican dos capas de permisos: los del recurso compartido y los NTFS. Dentro de cada capa, un usuario suma los permisos de todos sus grupos (se queda con el mayor), una denegación explícita gana a cualquier…
Un cortafuegos de primera coincidencia
Difícil
Un cortafuegos revisa sus reglas en orden y aplica la primera que coincide; si ninguna coincide, aplica la política por defecto. La entrada tiene dos partes separadas por «---». La primera empieza con «politica allow|deny» y sigue con reglas «allow|deny protoc…
¿Cuánto aguantaría esta contraseña?
Muy difícil
Cada línea es una contraseña. Si en minúsculas está en el DICCIONARIO, o lo está tras quitar los dígitos, puntos y signos de exclamación del final (Barcelona2024!), muestra «clave: muy débil (está en los diccionarios de contraseñas)». Si no, calcula su entropí…
Sistemas · Documentación y Aplicaciones Ofimáticas ver el tema
Informe del inventario
Medio
La primera línea es «hoy=AAAA-MM-DD» y el resto un CSV separado por punto y coma con cabecera «codigo;tipo;aula;precio;fin_garantia». Agrupa los equipos por aula (en orden alfabético) y muestra «AULA: N equipos, X €» (2 decimales; «1 equipo» en singular), añad…
Un índice automático para la documentación
Difícil
La entrada es un documento en Markdown. Genera su índice con los títulos de nivel 2 (##) y 3 (###), numerados (1., 1.1., 1.2., 2.…; la numeración de nivel 3 se reinicia en cada nivel 2) y con un enlace a su ancla: «1. [Requisitos previos](#requisitos-previos)»…
Un conversor de Markdown a HTML
Muy difícil
Convierte un documento Markdown a HTML con estas reglas. Bloques: los títulos (# a ######) pasan a <h1>…<h6>; las líneas que empiezan por «- » o «* » forman una lista <ul> y las que empiezan por «1. », «2. »… una <ol>, con cada elemento en un <li>; las líneas …
Cada línea de la entrada es una oportunidad del CRM con el formato «nombre;etapa;importe». Las etapas, en orden, y su probabilidad de cierre son: Nuevo 10 %, Calificado 30 %, Propuesta 50 %, Negociación 75 %, Ganado 100 % y Perdido 0 %. Muestra, para cada etap…
Coste total de propiedad a varios años
Difícil
La primera línea es «años N». Cada línea siguiente describe una opción de ERP: «nombre;licencia_usuario_mes;usuarios;implantación;formación;hardware;mantenimiento_anual». El coste total de propiedad (TCO) es: licencia × usuarios × 12 × años + implantación + fo…
Dimensionar servidores para Odoo
Muy difícil
Cada línea es un escenario: «nombre;usuarios_concurrentes;núcleos;ram_gb». Aplica estas reglas: workers = techo(concurrentes / 6), con un mínimo de 2; además hay 1 worker de cron. Núcleos necesarios = techo(workers / 2). Memoria necesaria (MB) = (workers + 1) …
En Odoo, los derechos de acceso (ir.model.access) dan a cada grupo permisos de lectura (r), escritura (w), creación (c) y borrado (d) sobre cada modelo, y un usuario tiene la suma de los permisos de todos sus grupos. La entrada tiene tres secciones. En [acceso…
Limpiar los clientes antes de migrarlos
Difícil
Antes de importar los clientes del sistema antiguo hay que limpiarlos. La entrada es un CSV con cabecera «nombre;nif;email;telefono» (la línea 1). Para cada fila, normaliza: nombre sin espacios sobrantes; NIF en mayúsculas y sin guiones ni espacios; correo en …
Rotación de copias abuelo-padre-hijo
Muy difícil
La estrategia de rotación abuelo-padre-hijo (GFS) conserva copias de seguridad a distintas escalas sin llenar el disco. La entrada son fechas de copias (AAAA-MM-DD), una por línea, desordenadas y quizá repetidas. Se conservan: las 7 copias más recientes (diari…
A partir de 10 unidades se aplica un descuento del 5 %. Con 12 unidades funciona, pero con 9 también da el descuento. Corrígelo.
Encuentra el fallo: el ranking que no existe
Fácil
El programa ordena los clientes por importe facturado, de mayor a menor, y muestra el ranking. En lugar del ranking da un error. Corrígelo.
Encuentra el fallo: el stock que aparece en todos los almacenes
Medio
Se crea una tabla de stock con 2 almacenes y 3 productos, todo a 0, y se anotan 5 unidades del producto 1 en el almacén 0. Al imprimirla, las 5 unidades aparecen en los dos almacenes. Corrígelo.
Un evaluador de dominios de Odoo
Muy difícil
Las reglas de automatización, las reglas de registro y los filtros de Odoo usan dominios: listas de condiciones (campo, operador, valor) en notación prefija (polaca), donde '&' (y) y '|' (o) se aplican a las dos expresiones que les siguen, '!' (no) a la siguie…
Encuentra el fallo: el recuento de ventas que se rompe
Fácil
El programa cuenta las unidades vendidas de cada producto a partir de las líneas de pedido y las muestra por orden alfabético. Se detiene con un error en la primera línea. Corrígelo.
Un campo calculado: la amortización
Medio
En el módulo de equipamiento, el campo calculado valor_actual depende de la fecha de compra, la vida útil y el precio (@api.depends). La primera línea es la fecha de hoy (AAAA-MM-DD); cada línea siguiente, un equipo: «nombre;fecha_compra;vida_util_en_años;prec…
Encuentra el fallo: las líneas que se comparten
Medio
Cada pedido debería empezar sin líneas. Ana pide un portátil y Luis dos ratones, pero el programa dice que los dos pedidos tienen 2 líneas. Corrígelo.
Encuentra el fallo: los agotados que se escapan
Medio
El programa quita del inventario los productos sin stock. Deberían quedar el ratón y el teclado, pero también queda la webcam, que tiene 0 unidades. Corrígelo.
Encuentra el fallo: el pedido confirmado que no se factura
Medio
El programa lee el estado de un pedido y, si está confirmado, genera la factura. Al escribir «confirmado» dice que todavía no se factura. Corrígelo.
Restricciones de un modelo
Difícil
En Odoo, los métodos decorados con @api.constrains lanzan un ValidationError y el registro no se guarda. Simula el modelo de mantenimientos: la primera línea es la fecha de hoy y cada línea siguiente un mantenimiento «equipo;fecha;coste;tipo». Comprueba, en es…
Secuencias de referencias
Muy difícil
Los módulos de Odoo numeran sus registros con secuencias (ir.sequence): un prefijo que puede incluir la fecha, un número con ceros a la izquierda y un reinicio del contador. La entrada tiene tres líneas de configuración —«prefijo=…», «relleno=N» y «reinicio=an…
Encuentra el fallo: los céntimos que se pierden
Muy difícil
Las facturas se redondean al céntimo y los medios céntimos van hacia arriba (1,525 € pasa a 1,53 €), como en un tique. El programa redondea 1,525 a 1,52 y 2,675 a 2,67. Corrígelo con el módulo decimal, que ya está importado.
SGE · Ejercicios de Sistemas de Gestión Empresarial ver el tema
Totales de una factura
Fácil
Cada línea de la entrada es una línea de factura con el formato «producto;cantidad;precio;iva» (iva en %: 21, 10 o 4). Muestra la base imponible, la cuota de IVA y el total con 2 decimales, con el formato «Base: 100.00», «IVA: 21.00» y «Total: 121.00».
Stock tras los movimientos
Medio
La entrada tiene dos partes separadas por una línea «---». Primero, el stock inicial: «producto cantidad». Después, los movimientos: «entrada producto cantidad» o «salida producto cantidad». Una salida mayor que el stock disponible no se hace y se muestra «ERR…
Validar NIF y NIE de clientes
Medio
Antes de dar de alta clientes en el ERP hay que validar su documento. Cada línea es un NIF (8 cifras y una letra) o un NIE (X, Y o Z, 7 cifras y una letra), en mayúsculas o minúsculas. Muestra «DOCUMENTO válido» o «DOCUMENTO no válido», con el documento en may…
Informe de antigüedad de deuda
Difícil
La primera línea es la fecha del informe (AAAA-MM-DD). Las siguientes son facturas pendientes: «factura;cliente;vencimiento;pendiente». Clasifica el importe pendiente por días de retraso (fecha del informe − vencimiento) en los tramos «No vencido» (0 días o me…