Docsity
Docsity

Prepara tus exámenes
Prepara tus exámenes

Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity


Consigue puntos base para descargar
Consigue puntos base para descargar

Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium


Orientación Universidad
Orientación Universidad


EJERCICIOS DE PROGRAMACION EN PYTHON - ESTRUCTURAS DE DATOS BASICA (PARTE 2), Exámenes de Programación Lineal

Este documento es una guía de ejercicios de programación en Python enfocada en estructuras de datos básicas. Contiene 60 problemas organizados en tres categorías: arreglos (matrices/vectores), cadenas de texto y estructuras avanzadas (grafos, árboles, tablas hash). Cada ejercicio presenta un enunciado claro seguido de su solución en Python, con explicaciones sobre la lógica implementada y análisis de complejidad algorítmica (O(n), O(n log n), etc.). Incluye problemas como búsqueda de patrones en matrices, ordenamiento de estructuras complejas, validación de expresiones, algoritmos de compresión (Huffman), recorridos en grafos (Dijkstra, Floyd-Warshall) y manipulación de estructuras avanzadas (árboles B, tries). Es ideal para estudiantes que buscan reforzar conceptos teóricos mediante ejercicios aplicados en Python. Su organización progresiva (de básico a avanzado) lo convierten en un recurso valioso para el aprendizaje práctico de programación.

Tipo: Exámenes

2024/2025

A la venta desde 16/05/2025

Apuntes-UDA
Apuntes-UDA 🇨🇱

5

(2)

392 documentos

1 / 45

Toggle sidebar

Esta página no es visible en la vista previa

¡No te pierdas las partes importantes!

bg1
EJERCICIOS DE PROGRAMACION EN PYTHON - ESTRUCTURAS
DE DATOS BASICA (PARTE 2)
Universidad de Atacama - Facultad de Ingenieria
12 de Mayo de 2025
Ejercicios de Arreglos, Cadenas y Estructuras
1. usqueda de Patrones en Matrices
Dada una matriz de caracteres de tama˜no N×My una cadena S, determina si la cadena aparece en
la matriz de forma horizontal, vertical o diagonal (en cualquier direcci´on). Devuelve las coordenadas de
inicio y fin de todas las ocurrencias.
2. Ordenamiento de Estructuras por ultiples Campos
Define una estructura Persona con los campos nombre,edad ysalario. Dada una lista de personas,
ord´enalas primero por edad ascendente y, en caso de empate, por salario descendente. Implementa el
algoritmo de ordenamiento manualmente.
3. Conteo de Subcadenas ´
Unicas
Dada una cadena S, encuentra todas las subcadenas ´unicas de longitud Kque contengan exactamente
Vvocales. Ignora may´usculas/min´usculas.
4. Matriz de Sumas Acumuladas
Dada una matriz N×N, crea una nueva matriz donde cada elemento (i, j) sea la suma acumulada de
todos los elementos desde (0,0) hasta (i, j) en la matriz original.
5. Fusi´on de Registros con Condiciones
Define una estructura Libro con ıtulo,autor ya~no. Dadas dos listas de libros, fusiona las listas
eliminando duplicados (mismo t´ıtulo y autor) y ordena el resultado por no descendente.
6. Rotaci´on de Cadenas con Validaci´on
Dada una cadena Sy un entero R, rota la cadena Rposiciones a la derecha si Res positivo, o a la
izquierda si Res negativo. Antes de rotar, valida que Rest´e dentro del rango [len(S),len(S)].
7. usqueda de Picos en Arreglos 2D
Dado un arreglo bidimensional de enteros, encuentra todos los ”picos”(elementos mayores que sus 4
vecinos adyacentes). Devuelve sus posiciones y valores.
8. Codificaci´on de Mensajes con Estructuras
Define una estructura Mensaje con emisor,receptor ytexto. Implementa una funci´on que codifique
el texto de cada mensaje invirtiendo las vocales y dejando el resto de caracteres igual. Devuelve la lista
de mensajes codificados.
9. Intersecci´on de ultiples Arreglos
Dados Karreglos ordenados, encuentra todos los elementos comunes a todos ellos. Optimiza para el peor
caso.
10. Validaci´on de Contrase˜nas con Estructuras
Define una estructura Usuario con nombre ycontrase~na. Dada una lista de usuarios, verifica que cada
contrase˜na tenga al menos 8 caracteres, una may´uscula, un umero y un car´acter especial. Filtra los
usuarios inv´alidos.
1
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19
pf1a
pf1b
pf1c
pf1d
pf1e
pf1f
pf20
pf21
pf22
pf23
pf24
pf25
pf26
pf27
pf28
pf29
pf2a
pf2b
pf2c
pf2d

Vista previa parcial del texto

¡Descarga EJERCICIOS DE PROGRAMACION EN PYTHON - ESTRUCTURAS DE DATOS BASICA (PARTE 2) y más Exámenes en PDF de Programación Lineal solo en Docsity!

EJERCICIOS DE PROGRAMACION EN PYTHON - ESTRUCTURAS

DE DATOS BASICA (PARTE 2)

Universidad de Atacama - Facultad de Ingenieria

12 de Mayo de 2025

Ejercicios de Arreglos, Cadenas y Estructuras

1. B´usqueda de Patrones en Matrices

Dada una matriz de caracteres de tama˜no N × M y una cadena S, determina si la cadena aparece en

la matriz de forma horizontal, vertical o diagonal (en cualquier direcci´on). Devuelve las coordenadas de

inicio y fin de todas las ocurrencias.

2. Ordenamiento de Estructuras por M´ultiples Campos

Define una estructura Persona con los campos nombre, edad y salario. Dada una lista de personas,

ord´enalas primero por edad ascendente y, en caso de empate, por salario descendente. Implementa el

algoritmo de ordenamiento manualmente.

3. Conteo de Subcadenas ´Unicas

Dada una cadena S, encuentra todas las subcadenas ´unicas de longitud K que contengan exactamente

V vocales. Ignora may´usculas/min´usculas.

4. Matriz de Sumas Acumuladas

Dada una matriz N × N , crea una nueva matriz donde cada elemento (i, j) sea la suma acumulada de

todos los elementos desde (0, 0) hasta (i, j) en la matriz original.

5. Fusi´on de Registros con Condiciones

Define una estructura Libro con t´ıtulo, autor y a~no. Dadas dos listas de libros, fusiona las listas

eliminando duplicados (mismo t´ıtulo y autor) y ordena el resultado por a˜no descendente.

6. Rotaci´on de Cadenas con Validaci´on

Dada una cadena S y un entero R, rota la cadena R posiciones a la derecha si R es positivo, o a la

izquierda si R es negativo. Antes de rotar, valida que R est´e dentro del rango [−len(S), len(S)].

7. B´usqueda de Picos en Arreglos 2D

Dado un arreglo bidimensional de enteros, encuentra todos los ”picos”(elementos mayores que sus 4

vecinos adyacentes). Devuelve sus posiciones y valores.

8. Codificaci´on de Mensajes con Estructuras

Define una estructura Mensaje con emisor, receptor y texto. Implementa una funci´on que codifique

el texto de cada mensaje invirtiendo las vocales y dejando el resto de caracteres igual. Devuelve la lista

de mensajes codificados.

9. Intersecci´on de M´ultiples Arreglos

Dados K arreglos ordenados, encuentra todos los elementos comunes a todos ellos. Optimiza para el peor

caso.

10. Validaci´on de Contrase˜nas con Estructuras

Define una estructura Usuario con nombre y contrase~na. Dada una lista de usuarios, verifica que cada

contrase˜na tenga al menos 8 caracteres, una may´uscula, un n´umero y un car´acter especial. Filtra los

usuarios inv´alidos.

11. C´alculo de Distancias entre Puntos

Define una estructura Punto con x e y. Dada una lista de puntos, calcula la distancia euclidiana entre

todos los pares y devuelve el par m´as cercano.

12. Compresi´on de Cadenas con Conteo

Dada una cadena S, compr´ımela reemplazando secuencias de caracteres repetidos por el car´acter seguido

del n´umero de repeticiones. Si la cadena comprimida no es m´as corta, devuelve la original.

13. Suma de Submatrices

Dada una matriz N ×M y una lista de submatrices definidas por sus esquinas superior izquierda e inferior

derecha, calcula la suma de los elementos de cada submatriz.

14. Filtrado y Transformaci´on de Registros

Define una estructura Producto con id, nombre, precio y stock. Dada una lista de productos, filtra

aquellos con stock < 10, aumenta su precio en un 5 % y ord´enalos por id.

15. B´usqueda de Anagramas en Arreglos

Dado un arreglo de cadenas, agrupa todas las cadenas que sean anagramas entre s´ı. Devuelve un arreglo

de arreglos con los grupos.

16. Matriz Espiral

Dada una matriz N × M , devuelve los elementos en orden espiral (desde la esquina superior izquierda

hacia el centro).

17. Validaci´on de Expresiones Matem´aticas

Dada una cadena S que representa una expresi´on matem´atica (con par´entesis, corchetes y llaves), verifica

si los delimitadores est´an balanceados.

18. Combinaci´on de Diccionarios con Estructuras

Define una estructura Config con clave y valor. Dadas dos listas de configuraciones, comb´ınalas elimi-

nando duplicados (misma clave) y priorizando las de la segunda lista.

19. M´aximo Rect´angulo de unos

Dada una matriz binaria N × M , encuentra el ´area del rect´angulo m´as grande que contenga solo 1s.

20. Codificaci´on Run-Length para Matrices

Implementa la codificaci´on Run-Length para una matriz de caracteres, comprimiendo secuencias hori-

zontales de caracteres repetidos.

Ejercicios de Arreglos, Cadenas y Estructuras (continuaci´on)

21. B´usqueda de Pal´ındromos en Estructuras

Define una estructura Frase con id y texto. Dada una lista de frases, encuentra todas las palabras

pal´ındromas en cada texto y devuelve un informe con los ids y las palabras encontradas.

22. Suma de Diagonales en Matrices Irregulares

Dada una matriz irregular (donde cada fila puede tener diferente longitud), calcula la suma de sus

diagonales principal y secundaria (si existen).

23. Reorganizaci´on de Cadenas con Frecuencia

Dada una cadena S, reorganiza sus caracteres de modo que no haya dos caracteres adyacentes iguales.

Si no es posible, devuelve una cadena vac´ıa.

24. Merge de Intervalos con Estructuras

Define una estructura Intervalo con inicio y fin. Dada una lista de intervalos, fusiona los que se

solapan y devuelve la lista resultante ordenada.

25. B´usqueda Binaria en Matrices Ordenadas

Dada una matriz N × M donde cada fila y columna est´a ordenada ascendentemente, implementa una

b´usqueda binaria eficiente para encontrar un valor X.

Ejercicios de Arreglos, Cadenas y Estructuras (continuaci´on)

41. Conteo de Palabras ´Unicas en Estructuras

Define una estructura Documento con id y texto. Dada una lista de documentos, cuenta cu´antas palabras

´unicas aparecen en al menos M documentos.

42. Reconstrucci´on de Cadenas desde Patrones

Dado un arreglo de patrones (ej: .AAB", "BCC"), reconstruye la cadena original si es posible (ej: .AABCC").

Si hay m´ultiples soluciones, devu´elvelas todas.

43. Suma de Matrices Dispersas

Implementa la suma de dos matrices dispersas representadas como listas de estructuras Elemento con

fila, columna y valor.

44. B´usqueda de Ciclos en Grafos con Estructuras

Define una estructura Nodo con id y vecinos. Dada una lista de nodos que representa un grafo, detecta

si hay ciclos.

45. Transformaci´on de Cadenas a Pig Latin

Implementa la transformaci´on a Pig Latin: mover la primera consonante de cada palabra al final y agregar

.ay" (ej: "hello" → .ellohay").

46. C´alculo de la Mediana en Flujo de Datos

Dada una secuencia de n´umeros en tiempo real (simulada con un arreglo), calcula la mediana despu´es

de cada inserci´on.

47. B´usqueda de Submatrices Comunes

Dadas dos matrices, encuentra todas las submatrices K × K que sean iguales en ambas.

48. Validaci´on de Correos Electr´onicos con Estructuras

Define una estructura Contacto con nombre y email. Dada una lista de contactos, filtra los emails

inv´alidos (usando expresiones regulares).

49. Generaci´on de Permutaciones con Restricciones

Dada una cadena S, genera todas las permutaciones donde ninguna vocal (a, e, i, o, u) sea adyacente

a otra vocal.

50. B´usqueda de Caminos en Matrices

Dada una matriz N × M con obst´aculos ( 1 ) y espacios libres ( 0 ), encuentra el camino m´as corto desde

(0, 0) hasta (N − 1 , M − 1) movi´endose en las 4 direcciones.

51. Conteo de Tri´angulos en Grafos con Estructuras

Define una estructura Arista con nodo1 y nodo2. Dada una lista de aristas, cuenta el n´umero de tri´angu-

los en el grafo.

52. Codificaci´on Base64 para Cadenas

Implementa la codificaci´on Base64 para una cadena S sin usar librer´ıas externas.

53. B´usqueda de Elementos Ausentes en Arreglos

Dado un arreglo de enteros donde algunos elementos est´an duplicados y otros ausentes, encuentra todos

los ausentes en el rango [1, N ].

54. Validaci´on de Fechas con Estructuras

Define una estructura Fecha con d´ıa, mes y a~no. Dada una lista de fechas, verifica si cada una es v´alida

(considerando a˜nos bisiestos).

55. Multiplicaci´on de Matrices con Bloques

Implementa la multiplicaci´on de matrices N ×N dividiendo las matrices en bloques B ×B para optimizar

la cach´e.

56. B´usqueda de Subsecuencias Comunes

Dadas dos cadenas A y B, encuentra la subsecuencia com´un m´as larga que sea tambi´en un pal´ındromo.

57. Ordenamiento de Arreglos con Restricciones

Dado un arreglo de enteros, ord´enalo de modo que los n´umeros pares aparezcan primero y los impares

despu´es, manteniendo el orden relativo original.

58. C´alculo de Prefijos y Sufijos Comunes

Dada una lista de cadenas, para cada cadena encuentra el prefijo com´un m´as largo con cualquier otra

cadena en la lista.

59. B´usqueda de Componentes Conectados en Matrices

Dada una matriz binaria, encuentra el n´umero de componentes conectados de 1 s (considerando 8 vecinos).

60. Generaci´on de N´umeros Primos con Criba

Implementa la Criba de Erat´ostenes para generar todos los primos hasta N y almac´enalos en una estruc-

tura Primos con m´etodos para consultar si un n´umero es primo.

48 if coincidencia : 49 resultados. append (( 50 i , j , # Inicio ( fila , columna ) 51 ki , kj # Fin ( fila , columna ) 52 ) ) 53 54 return resultados 55 56 # V e r s i n optimizada para b s q u e d a horizontal / vertical 57 def buscar_patron_optimizado ( matriz , patron ) : 58 from collections import defaultdict 59 60 if not matriz or not patron : 61 return [] 62 63 filas = len ( matriz ) 64 columnas = len ( matriz [0]) if filas > 0 else 0 65 len_patron = len ( patron ) 66 resultados = [] 67 68 # Preprocesamiento : Mapa de caracteres a posiciones 69 mapa_caracteres = defaultdict ( list ) 70 for i in range ( filas ) : 71 for j in range ( columnas ) : 72 mapa_caracteres [ matriz [ i ][ j ]]. append (( i , j ) ) 73 74 # Solo buscar en posiciones donde empieza el primer caracter 75 for i , j in mapa_caracteres. get ( patron [0] , []) : 76 # Horizontal derecha 77 if j + len_patron <= columnas : 78 if all ( matriz [ i ][ j + k ] == patron [ k ] for k in range ( len_patron ) ) : 79 resultados. append (( i , j , i , j + len_patron -1) ) 80 81 # Vertical abajo 82 if i + len_patron <= filas : 83 if all ( matriz [ i + k ][ j ] == patron [ k ] for k in range ( len_patron ) ) : 84 resultados. append (( i , j , i + len_patron -1 , j ) ) 85 86 # Diagonal derecha - abajo 87 if i + len_patron <= filas and j + len_patron <= columnas : 88 if all ( matriz [ i + k ][ j + k ] == patron [ k ] for k in range ( len_patron ) ) : 89 resultados. append (( i , j , i + len_patron -1 , j + len_patron -1) ) 90 91 return resultados 92 93 # Casos de prueba 94 matriz_ejemplo = [ 95 [ ’A ’ , ’B ’ , ’C ’ , ’D ’] , 96 [ ’E ’ , ’F ’ , ’G ’ , ’H ’] , 97 [ ’I ’ , ’J ’ , ’K ’ , ’L ’] , 98 [ ’M ’ , ’N ’ , ’O ’ , ’P ’] 99 ] 100 101 patrones = [ 102 " ABC " , # Horizontal 103 " EJQ " , # No existe 104 " AFKP " , # Diagonal 105 " HLP " , # No existe 106 " DHL " , # Diagonal inversa 107 " MNOP " , # Horizontal inferior 108 " ABCDHLP " # Demasiado largo 109 ] 110 111 # Probar todos los casos 112 for patron in patrones : 113 print ( f " Buscando ’{ patron } ’: " ) 114 print ( " V e r s i n completa : " , buscar_patron ( matriz_ejemplo , patron ) ) 115 print ( " V e r s i n optimizada : " , buscar_patron_optimizado ( matriz_ejemplo , patron ) ) 116 print ( " -" * 60)

Explicaci´on:

Implementaci´on Completa:

  • Busca en 8 direcciones posibles (horizontales, verticales y diagonales)
  • Retorna coordenadas de inicio y fin de todas las coincidencias
  • Complejidad: O(filas × columnas × len(patr´on) × 8 direcciones)

Versi´on Optimizada:

  • Usa preprocesamiento con diccionario para ubicaciones de caracteres
  • Solo busca en 3 direcciones principales (derecha, abajo, diagonal)
  • Complejidad promedio mejorada para patrones largos

Manejo de Casos Especiales:

  • Matriz vac´ıa o patr´on vac´ıo
  • Patrones m´as largos que la matriz
  • M´ultiples coincidencias

2. Soluci´on Ordenamiento de Estructuras

1 class Persona : 2 def init ( self , nombre , edad , salario ) : 3 self. nombre = nombre 4 self. edad = edad 5 self. salario = salario 6 7 def repr ( self ) : 8 return f " Persona ( nombre = ’{ self. nombre } ’ , edad ={ self. edad } , salario ={ self. salario }) " 9 10 def ordenar_personas ( personas ) : 11 """ 12 Ordena una lista de personas por edad ascendente y salario descendente. 13 14 P a r m e t r o s : 15 personas : Lista de objetos Persona 16 17 Retorna : 18 Lista ordenada s e g n los criterios especificados 19 """ 20 if not personas : 21 return [] 22 23 # I m p l e m e n t a c i n con sorted y key personalizada 24 return sorted ( personas , key = lambda p : ( p. edad , -p. salario ) ) 25 26 # V e r s i n con algoritmo de ordenamiento manual ( Merge Sort ) 27 def ordenar_personas_manual ( personas ) : 28 if len ( personas ) <= 1: 29 return personas. copy () 30 31 medio = len ( personas ) // 2 32 izquierda = ordenar_personas_manual ( personas [: medio ]) 33 derecha = ordenar_personas_manual ( personas [ medio :]) 34 35 resultado = [] 36 i = j = 0 37 38 while i < len ( izquierda ) and j < len ( derecha ) : 39 # Comparar por edad ascendente 40 if izquierda [ i ]. edad < derecha [ j ]. edad : 41 resultado. append ( izquierda [ i ]) 42 i += 1 43 elif izquierda [ i ]. edad > derecha [ j ]. edad : 44 resultado. append ( derecha [ j ]) 45 j += 1 46 else :

12 Conjunto de subcadenas que cumplen los criterios 13 """ 14 if not S or K <= 0 or V < 0 or K > len ( S ) : 15 return set () 16 17 vocales = { ’a ’ , ’e ’ , ’i ’ , ’o ’ , ’u ’} 18 resultado = set () 19 n = len ( S ) 20 21 # Precomputar conteo de vocales en ventana deslizante 22 conteo_vocales = 0 23 for i in range ( K ) : 24 if S [ i ]. lower () in vocales : 25 conteo_vocales += 1 26 27 if conteo_vocales == V : 28 resultado. add ( S [: K ]. lower () ) 29 30 # Ventana deslizante para eficiencia O ( n ) 31 for i in range (K , n ) : 32 # Eliminar el caracter que sale de la ventana 33 if S [i - K ]. lower () in vocales : 34 conteo_vocales -= 1 35 36 # Agregar el nuevo caracter 37 if S [ i ]. lower () in vocales : 38 conteo_vocales += 1 39 40 # Verificar c o n d i c i n 41 if conteo_vocales == V : 42 resultado. add ( S [i - K +1: i +1]. lower () ) 43 44 return resultado 45 46 # V e r s i n alternativa para c o m p a r a c i n ( menos eficiente ) 47 def subcadenas_naive (S , K , V ) : 48 vocales = { ’a ’ , ’e ’ , ’i ’ , ’o ’ , ’u ’} 49 return { S [ i : i + K ]. lower () for i in range ( len ( S ) -K +1) 50 if sum (1 for c in S [ i : i + K ] if c. lower () in vocales ) == V } 51 52 # Casos de prueba 53 test_cases = [ 54 ( " ProgramandoEnPython " , 5 , 2) , # Subcadenas con 2 vocales en 5 caracteres 55 ( " AEIOUaeiou " , 3 , 3) , # Todas vocales 56 ( " XYZxyz " , 2 , 0) , # Sin vocales 57 ( " a " , 1 , 1) , # Caso m n i m o 58 ( " PythonEsGenial " , 10 , 4) , # Caso realista 59 ( " " , 3 , 2) , # Cadena v a c a 60 ] 61 62 for S , K , V in test_cases : 63 print ( f " Cadena : ’{ S } ’ , K ={ K } , V ={ V } " ) 64 print ( f " Subcadenas ( ventana deslizante ) : { subcadenas_con_vocales (S , K , V ) } " ) 65 print ( f " Subcadenas ( naive ) : { subcadenas_naive (S , K , V ) } " ) 66 print ( " -" * 60)

Explicaci´on:

Implementaci´on ´Optima:

  • Usa ventana deslizante para eficiencia O(n)
  • Mantiene conteo actualizado de vocales en la ventana
  • Convierte todo a min´usculas para normalizaci´on
  • Retorna un conjunto para garantizar unicidad

Versi´on Naive:

  • Implementaci´on directa para verificaci´on
  • Util para comparar resultados con la versi´´ on optimizada

Manejo de Casos Especiales:

  • Cadena vac´ıa
  • K mayor que la longitud de S
  • V negativo
  • Distinci´on may´usculas/min´usculas

4. Soluci´on Matriz de Sumas Acumuladas

1 def matriz_sumas_acumuladas ( matriz ) : 2 """ 3 Calcula la matriz de sumas acumuladas donde cada elemento (i , j ) contiene 4 la suma de todos los elementos desde (0 ,0) hasta (i , j ) en la matriz original. 5 6 P a r m e t r o s : 7 matriz : Lista de listas de n m e r o s ( matriz cuadrada ) 8 9 Retorna : 10 Nueva matriz con las sumas acumuladas 11 """ 12 if not matriz : 13 return [] 14 15 n = len ( matriz ) 16 m = len ( matriz [0]) if n > 0 else 0 17 18 # Crear matriz de resultados inicializada en 0 19 dp = [[0] * m for _ in range ( n ) ] 20 dp [0][0] = matriz [0][0] 21 22 # Llenar primera fila 23 for j in range (1 , m ) : 24 dp [0][ j ] = dp [0][ j -1] + matriz [0][ j ] 25 26 # Llenar primera columna 27 for i in range (1 , n ) : 28 dp [ i ][0] = dp [i -1][0] + matriz [ i ][0] 29 30 # Llenar el resto de la matriz 31 for i in range (1 , n ) : 32 for j in range (1 , m ) : 33 dp [ i ][ j ] = matriz [ i ][ j ] + dp [i -1][ j ] + dp [ i ][ j -1] - dp [i -1][ j -1] 34 35 return dp 36 37 # V e r s i n alternativa usando numpy ( para matrices grandes ) 38 def ma tr iz _s um as a cu mu la da s nu mp y ( matriz ) : 39 import numpy as np 40 arr = np. array ( matriz ) 41 return np. cumsum ( np. cumsum ( arr , axis =0) , axis =1). tolist () 42 43 # Casos de prueba 44 matrices = [ 45 [[1 , 2] , [3 , 4]] , # Matriz 2 x 46 [[1 , 2 , 3] , [4 , 5 , 6] , [7 , 8 , 9]] , # Matriz 3 x 47 [[5]] , # Matriz 1 x 48 [] , # Matriz v a c a 49 [[1 , 0 , 0] , [0 , 1 , 0] , [0 , 0 , 1]] # Matriz identidad 50 ] 51 52 for mat in matrices : 53 print ( f " Matriz original : " ) 54 for fila in mat : 55 print ( fila ) 56 57 print ( " \ nSumas acumuladas : " ) 58 resultado = matriz_sumas_acumuladas ( mat )

43 44 # Casos de prueba 45 libros1 = [ 46 Libro ( " Cien a o s de soledad " , " Gabriel G a r c a M r q u e z " , 1967) , 47 Libro ( " El Principito " , " Antoine de Saint - E x u p r y " , 1943) , 48 Libro ( " 1984 " , " George Orwell " , 1949) 49 ] 50 51 libros2 = [ 52 Libro ( " Cien a o s de soledad " , " Gabriel G a r c a M r q u e z " , 2001) , # Mismo t t u l o / autor , a o diferente 53 Libro ( " Ficciones " , " Jorge Luis Borges " , 1944) , 54 Libro ( " 1984 " , " George Orwell " , 1984) # E d i c i n especial con a o actualizado 55 ] 56 57 print ( " === Lista 1 === " ) 58 for libro in libros1 : 59 print ( libro ) 60 61 print ( " \ n === Lista 2 === " ) 62 for libro in libros2 : 63 print ( libro ) 64 65 print ( " \ n === F u s i n ( diccionario ) === " ) 66 for libro in fusionar_libros ( libros1 , libros2 ) : 67 print ( libro ) 68 69 print ( " \ n === F u s i n ( conjuntos ) === " ) 70 for libro in fusionar_libros_con_sets ( libros1 , libros2 ) : 71 print ( libro )

Explicaci´on:

Clase Libro:

  • Implementa eq y hash para manejar duplicados
  • repr para representaci´on legible

Implementaci´on Principal:

  • Usa diccionario para eliminar duplicados (clave: tupla t´ıtulo-autor)
  • Los libros de lista2 tienen prioridad al actualizar
  • Ordena por a˜no descendente usando sorted con clave personalizada

Versi´on con Conjuntos:

  • Alternativa m´as concisa usando operaciones de conjuntos
  • Mismo resultado pero diferente implementaci´on

Manejo de Casos Especiales:

  • Libros con mismo t´ıtulo/autor pero diferente a˜no
  • Listas vac´ıas
  • Prioridad a la segunda lista en duplicados

6. Soluci´on Rotaci´on de Cadenas

1 def rotar_cadena_segura (S , R ) : 2 """ 3 Rota una cadena R posiciones a la derecha ( R positivo ) o izquierda ( R negativo ) 4 con v a l i d a c i n de rangos. 5 6 P a r m e t r o s : 7 S : Cadena de texto a rotar 8 R : N m e r o de posiciones a rotar ( positivo = derecha , negativo = izquierda ) 9 10 Retorna : 11 Cadena rotada o ValueError si R e s t fuera de rango

12 13 Excepciones : 14 ValueError : Si | R | > len ( S ) 15 """ 16 if not isinstance (S , str ) : 17 raise TypeError ( " La entrada debe ser una cadena de texto " ) 18 19 if not S : # Cadena v a c a 20 return S 21 22 n = len ( S ) 23 R = int ( R ) # Asegurar que es entero 24 25 # Validar rango permitido 26 if abs ( R ) > n : 27 raise ValueError ( f " R ({ R }) debe estar en el rango [ -{ n } , { n }] " ) 28 29 # Normalizar la r o t a c i n ( equivalente para rotaciones mayores ) 30 R = R % n # Esto maneja tanto R positivo como negativo 31 32 # Rotar la cadena 33 if R > 0: # R o t a c i n a la derecha 34 return S [ - R :] + S [: - R ] 35 else : # R o t a c i n a la izquierda ( R negativo ) 36 return S [ abs ( R ) :] + S [: abs ( R ) ] 37 38 # V e r s i n alternativa con desplazamiento circular 39 def rotar_cadena_circular (S , R ) : 40 n = len ( S ) 41 if n == 0: 42 return S 43 R = R % n 44 return S [n - R :] + S [: n - R ] 45 46 # Casos de prueba 47 test_cases = [ 48 ( " Python " , 2) , # R o t a c i n derecha 49 ( " Python " , -1) , # R o t a c i n izquierda 50 ( " Hello " , 5) , # R o t a c i n completa ( equivalente a 0) 51 ( " World " , 8) , # R o t a c i n mayor que longitud 52 ( " " , 3) , # Cadena v a c a 53 ( " OpenAI " , -3) , # R o t a c i n izquierda 54 ( " R o t a c i n " , 0) , # Sin r o t a c i n 55 ( " V a l i d a c i n " , 4) , # R o t a c i n derecha con acentos 56 ] 57 58 for S , R in test_cases : 59 print ( f " Cadena original : ’{ S } ’ " ) 60 try : 61 print ( f " R o t a c i n { R }: ’{ rotar_cadena_segura (S , R ) } ’ " ) 62 print ( f " Circular : ’{ rotar_cadena_circular (S , R ) } ’ " ) 63 except ValueError as e : 64 print ( f " Error : { e } " ) 65 except TypeError as e : 66 print ( f " Error : { e } " ) 67 print ( " -" * 50)

Explicaci´on:

Validaci´on Robustea:

  • Verifica tipo de entrada (debe ser string)
  • Maneja cadenas vac´ıas
  • Valida que R est´e en el rango [-len(S), len(S)]

Rotaci´on Eficiente:

  • Usa rebanado de cadenas (slicing) para rotaci´on O(1)

55 if j > 0: vecinos. append ( matriz [ i ][ j -1]) # Izquierda 56 if j < columnas -1: vecinos. append ( matriz [ i ][ j +1]) # Derecha 57 58 if all ( valor > vecino for vecino in vecinos ) : 59 picos. append ((( i , j ) , valor ) ) 60 61 return picos 62 63 # Casos de prueba 64 matrices = [ 65 # Matriz con pico central 66 [[1 , 2 , 3] , 67 [4 , 5 , 2] , 68 [3 , 2 , 1]] , 69 70 # M l t i p l e s picos 71 [[1 , 3 , 1] , 72 [2 , 5 , 2] , 73 [1 , 4 , 1]] , 74 75 # Matriz v a c a 76 [] , 77 78 # Todos elementos iguales ( sin picos ) 79 [[2 , 2 , 2] , 80 [2 , 2 , 2] , 81 [2 , 2 , 2]] , 82 83 # Picos en bordes 84 [[9 , 2 , 3] , 85 [1 , 2 , 4] , 86 [5 , 6 , 7]] , 87 88 # Matriz grande 89 [[ i * j for j in range (100) ] for i in range (100) ] 90 ] 91 92 for idx , mat in enumerate ( matrices [:5]) : # Probar solo las primeras 5 para no saturar 93 print ( f " \ nMatriz { idx + 1}: " ) 94 for fila in mat : 95 print ( fila ) 96 97 print ( " \ nPicos encontrados ( e s t n d a r ) : " ) 98 picos = encontrar_picos ( mat ) 99 for pos , val in picos : 100 print ( f " P o s i c i n { pos }: { val } " ) 101 102 print ( " \ nPicos encontrados ( optimizado ) : " ) 103 picos_opt = encontrar picos_opt imizado ( mat ) 104 for pos , val in picos_opt : 105 print ( f " P o s i c i n { pos }: { val } " ) 106 107 print ( " = " * 40) 108 109 # Probar matriz grande solo con v e r s i n optimizada 110 if len ( matrices ) > 5: 111 print ( " \ nProbando matriz grande (100 x100 ) ... " ) 112 picos_grandes = encontrar picos_optimizado ( matrices [5]) 113 print ( f " Se encontraron { len ( picos_grandes ) } picos en matriz grande " )

Explicaci´on:

Implementaci´on Est´andar:

  • Compara cada elemento con sus 4 vecinos adyacentes
  • Maneja correctamente los bordes de la matriz
  • Retorna posiciones (fila, columna) y valores de picos

Versi´on Optimizada:

  • Usa itertools.product para generaci´on eficiente de coordenadas
  • Evita comparaciones innecesarias con elementos fuera de los l´ımites
  • Ideal para matrices grandes

Manejo de Casos Especiales:

  • Matriz vac´ıa
  • Matrices con todos elementos iguales
  • Picos en bordes y esquinas
  • Matrices de gran tama˜no

8. Soluci´on Codificaci´on de Mensajes

1 class Mensaje : 2 def init ( self , emisor , receptor , texto ) : 3 self. emisor = emisor 4 self. receptor = receptor 5 self. texto = texto 6 7 def repr ( self ) : 8 return f " Mensaje ( emisor = ’{ self. emisor } ’ , receptor = ’{ self. receptor } ’ , texto = ’{ self. texto } ’) " 9 10 def codificar_mensajes ( mensajes ) : 11 """ 12 Codifica una lista de mensajes invirtiendo el orden de las vocales en el texto , 13 manteniendo el resto de caracteres igual. 14 15 P a r m e t r o s : 16 mensajes : Lista de objetos Mensaje 17 18 Retorna : 19 Lista de mensajes codificados 20 """ 21 def invertir_vocales ( texto ) : 22 vocales = { ’a ’ , ’e ’ , ’i ’ , ’o ’ , ’u ’ , ’A ’ , ’E ’ , ’I ’ , ’O ’ , ’U ’} 23 # Encontrar todas las vocales y sus posiciones 24 chars = list ( texto ) 25 indices_vocales = [ i for i , c in enumerate ( chars ) if c in vocales ] 26 vocales_encontradas = [ chars [ i ] for i in indices_vocales ] 27 28 # Invertir el orden de las vocales 29 for i , idx in enumerate ( indices_vocales ) : 30 chars [ idx ] = vocales_encontradas [ -( i +1) ] 31 32 return ’ ’. join ( chars ) 33 34 # Crear copia de los mensajes para no modificar los originales 35 mensajes_codificados = [] 36 for msg in mensajes : 37 texto_codificado = invertir_vocales ( msg. texto ) 38 mensaje_codificado = Mensaje ( msg. emisor , msg. receptor , texto_codificado ) 39 mensajes_codificados. append ( mensaje_codificado ) 40 41 return mensajes_codificados 42 43 # V e r s i n alternativa usando stack 44 def codificar_mensajes_stack ( mensajes ) : 45 vocales = { ’a ’ , ’e ’ , ’i ’ , ’o ’ , ’u ’ , ’A ’ , ’E ’ , ’I ’ , ’O ’ , ’U ’} 46 mensajes_cod = [] 47 48 for msg in mensajes : 49 # Extraer vocales en orden 50 vocales_texto = [ c for c in msg. texto if c in vocales ] 51 # Reemplazar en orden inverso 52 texto_cod = []

9 Retorna : 10 Lista ordenada de elementos comunes 11 """ 12 if not arreglos : 13 return [] 14 15 # Usar el arreglo m s p e q u e o como base para eficiencia 16 arreglo_base = min ( arreglos , key = len ) 17 comunes = set ( arreglo_base ) 18 19 for arr in arreglos : 20 if arr is not arreglo_base : 21 # Actualizar i n t e r s e c c i n con el arreglo actual 22 comunes. intersection_update ( arr ) 23 if not comunes : # O p t i m i z a c i n : salir si no hay comunes 24 break 25 26 return sorted ( comunes ) 27 28 # V e r s i n alternativa para arreglos muy grandes ( usando iteradores ) 29 def interseccion_grande ( arreglos ) : 30 from collections import defaultdict 31 32 if not arreglos : 33 return [] 34 35 contador = defaultdict ( int ) 36 for arr in arreglos : 37 for num in set ( arr ) : # Evitar contar duplicados en un mismo arreglo 38 contador [ num ] += 1 39 40 k = len ( arreglos ) 41 return sorted ( num for num , count in contador. items () if count == k ) 42 43 # Casos de prueba 44 test_cases = [ 45 [[1 , 2 , 3 , 4 , 5] , [2 , 4 , 6 , 8] , [0 , 2 , 4 , 10]] , # I n t e r s e c c i n [2 , 4] 46 [[1 , 2 , 3] , [4 , 5 , 6] , [7 , 8 , 9]] , # Sin i n t e r s e c c i n 47 [[1 , 1 , 2 , 2 , 3] , [1 , 2 , 2 , 3] , [1 , 2 , 3 , 3]] , # Con duplicados 48 [[] , [1 , 2 , 3]] , # Con arreglo v a c o 49 [[1 , 2 , 3]] , # Un solo arreglo 50 [] # Lista v a c a 51 ] 52 53 for i , caso in enumerate ( test_cases ) : 54 print ( f " \ nCaso { i +1}: " ) 55 for j , arr in enumerate ( caso ) : 56 print ( f " Arreglo { j +1}: { arr } " ) 57 58 print ( " \ n I n t e r s e c c i n e s t n d a r : " , interseccion_arreglos ( caso ) ) 59 print ( " I n t e r s e c c i n grande : " , interseccion_grande ( caso ) ) 60 print ( " = " * 60)

Explicaci´on:

Implementaci´on Principal:

  • Usa conjuntos para eficiencia en operaciones de intersecci´on
  • Selecciona el arreglo m´as peque˜no como base para optimizar
  • Cortocircuito cuando no hay elementos comunes

Versi´on para Grandes Datos:

  • Usa contador para evitar cargar todos los datos en memoria
  • Eficiente para arreglos con muchos duplicados internos

Manejo de Casos Especiales:

  • Lista vac´ıa de arreglos
  • Arreglos vac´ıos dentro de la lista
  • Un solo arreglo de entrada
  • Duplicados dentro de un mismo arreglo

10. Soluci´on Validaci´on de Contrase˜nas

1 import re 2 from typing import List 3 4 class Usuario : 5 def init ( self , nombre : str , c o n t r a s e a : str ) : 6 self. nombre = nombre 7 self. c o n t r a s e a = c o n t r a s e a 8 9 def repr ( self ) : 10 return f " Usuario ( nombre = ’{ self. nombre } ’ , c o n t r a s e a = ’{ ’* ’* len ( self. c o n t r a s e a ) } ’) " 11 12 def v a l i d a r _ c o n t r a s e a s ( usuarios : List [ Usuario ]) -> List [ Usuario ]: 13 """ 14 Filtra usuarios con c o n t r a s e a s que cumplen los requisitos de seguridad : 15 - Al menos 8 caracteres 16 - Al menos una m a y s c u l a 17 - Al menos un n m e r o 18 - Al menos un c a r c t e r especial ( @$! %?&) 19 20 P a r m e t r o s : 21 usuarios : Lista de objetos Usuario 22 23 Retorna : 24 Lista de usuarios con c o n t r a s e a s v l i d a s 25 """ 26 patron = r " ^(?=.[ A - Z ]) (?=.\ d ) (?=.[ @$! %?&]) [A - Za - z \ d@$! %?&]{8 ,} $ " 27 usuarios_validos = [] 28 29 for usuario in usuarios : 30 if re. fullmatch ( patron , usuario. c o n t r a s e a ) : 31 usuarios_validos. append ( usuario ) 32 33 return usuarios_validos 34 35 # V e r s i n alternativa con v a l i d a c i n manual ( sin regex ) 36 def validar_manual ( usuarios : List [ Usuario ]) -> List [ Usuario ]: 37 especiales = { ’@ ’ , ’$ ’ , ’! ’ , ’ %’ , ’* ’ , ’? ’ , ’& ’} 38 validos = [] 39 40 for usuario in usuarios : 41 c o n t r a s e a = usuario. c o n t r a s e a 42 if len ( c o n t r a s e a ) < 8: 43 continue 44 45 tiene_mayuscula = any ( c. isupper () for c in c o n t r a s e a ) 46 tiene_numero = any ( c. isdigit () for c in c o n t r a s e a ) 47 tiene_especial = any ( c in especiales for c in c o n t r a s e a ) 48 49 if tiene_mayuscula and tiene_numero and tiene_especial : 50 validos. append ( usuario ) 51 52 return validos 53 54 # Casos de prueba 55 usuarios = [ 56 Usuario ( " admin " , " Admin123! " ) , # V l i d a 57 Usuario ( " invitado " , " abc123 " ) , # I n v l i d a ( faltan m a y s c u l a y especial ) 58 Usuario ( " test " , " A@1bcdef " ) , # V l i d a 59 Usuario ( " user " , " password " ) , # I n v l i d a 60 Usuario ( " demo " , " Demo@2023 " ) , # V l i d a