Lógica de programación
Introducción a la lógica de programación, con explicaciones claras y ejemplos prácticos para desarrollar el pensamiento computacional desde cero.
Introducción
La lógica de programación es la base sobre la que se construyen todos los programas informáticos. Antes de aprender a programar directamente en un lenguaje de programación concreto, es fundamental comprender cómo se estructuran y resuelven los problemas de manera lógica y secuencial. Este proceso mental se llama pensamiento computacional, y aprender a desarrollarlo es el primer paso para convertir ideas en soluciones digitales.
Conocimiento previo
Referencias
- Gómez Jiménez, E. & Aguilera Jinesta, R. (2023). Metodología de la programación: conceptos, lógica e implementación. Marcombo. ISBN: 978‑8426735935.
- Knuth, D. E. (2022–2025). The Art of Computer Programming, Volúmenes 4A/B y fascículos recientes. Addison-Wesley.
Índice
- Pensamiento computacional: una habilidad clave
- Cómo se resuelven problemas con lógica
2.1. Análisis del problema
2.2. Descomposición y pasos secuenciales
2.3. Reconocimiento de patrones y generalización
2.4. Diseño de soluciones paso a paso - Recomendaciones para resolver ejercicios de lógica
- Ejercicios
1. Pensamiento computacional: una habilidad clave
Antes de aprender a programar, a resolver ejercicios o a escribir instrucciones paso a paso, es importante comprender una capacidad fundamental: el pensamiento computacional. No se trata solo de saber usar ordenadores o escribir código, sino de desarrollar una forma de pensar para resolver problemas de forma lógica, estructurada y eficiente.
El pensamiento computacional es una habilidad que nos permite entender problemas complejos y encontrar soluciones que puedan ser aplicadas por una persona, una máquina o ambos. Se basa en la lógica, el análisis y la creatividad, y es una forma de pensar que no depende de un lenguaje de programación concreto, sino de cómo organizamos nuestras ideas para resolver tareas paso a paso.
- Descomposición: dividir un problema grande en partes más pequeñas y manejables.
- Reconocimiento de patrones: identificar similitudes y estructuras comunes entre problemas.
- Abstracción: centrarse en los elementos esenciales y descartar los detalles que no son relevantes.
- Algoritmos: diseñar pasos claros y ordenados que permiten resolver el problema de forma precisa.
Estas habilidades no solo sirven para programar. También se aplican en áreas como matemáticas, ciencias, tecnología, diseño, ingeniería o incluso en la vida diaria (por ejemplo, al planificar una receta de cocina o al organizar una ruta de viaje).
El pensamiento computacional es una competencia muy necesaria en el siglo XXI porque:
- Fomenta el razonamiento lógico y la resolución de problemas.
- Desarrolla la autonomía y la capacidad de tomar decisiones estructuradas.
- Prepara a los estudiantes para trabajar en equipo, comunicar soluciones y enfrentarse a desafíos técnicos.
- No se limita a la informática: es útil en cualquier contexto que requiera organizar información, encontrar soluciones o tomar decisiones.
2. Cómo se resuelven problemas con lógica
Resolver problemas con lógica no significa memorizar fórmulas o aplicar recetas mecánicas, sino aprender a observar, pensar y actuar con un plan. La lógica nos ayuda a tomar decisiones razonadas, encontrar patrones y diseñar soluciones paso a paso, sin dejarnos llevar por la intuición o la improvisación.
Cuando nos enfrentamos a un problema —ya sea en clase, en casa o en el trabajo— solemos pasar por una serie de fases. Aprender a identificar estas etapas y aplicarlas con orden es clave para desarrollar nuestra capacidad de razonamiento.
2.1. Análisis del problema
Antes de intentar resolver cualquier problema, es fundamental entender qué se nos está pidiendo exactamente. Este primer paso puede parecer evidente, pero muchas veces fallamos al no detenernos lo suficiente a pensar y leer con atención.
El análisis del problema consiste en:
- 🔍 Comprender el enunciado
Leer detenidamente el problema y asegurarnos de que entendemos toda la información relevante. Preguntarnos:
- ¿Qué datos nos da el problema?
- ¿Qué debemos obtener como resultado?
- ¿Qué condiciones o limitaciones se nos imponen?
A veces, el problema es extenso, está redactado con palabras ambiguas, generales o información que no es importante. En ese caso, es útil reformularlo con nuestras propias palabras, hacer preguntas, o incluso subrayar la información más importante.
- 📌 Identificar lo relevante
No todos los datos que aparecen en un problema son necesarios. Aprender a distinguir entre lo esencial y lo accesorio es parte del pensamiento lógico. Si no filtramos bien la información, podemos distraernos o diseñar soluciones erróneas.
- 🧩 Dividir el problema
Cuando un problema parece muy complejo, lo mejor es dividirlo en partes más pequeñas. Resolver paso a paso cada fragmento suele ser más fácil y, al final, podemos conectar las soluciones parciales para resolver el todo.
- 💡 Pensar en posibles caminos
En esta etapa aún no escribimos soluciones definitivas. Es el momento de explorar ideas, plantear hipótesis, imaginar qué pasaría “si…” y visualizar el camino que puede llevarnos del punto de partida al resultado final.
🧠 Ejemplo sencillo:
Supón que tienes que organizar el horario de estudio de una semana.
El problema parece simple, pero requiere pensar:
- ¿Cuántas horas libres tengo?
- ¿Qué asignaturas debo priorizar?
- ¿Hay días en los que no puedo estudiar?
- ¿Cómo divido el tiempo sin saturarme?
Analizarlo te permite tomar decisiones lógicas en lugar de improvisar o copiar el horario de otra persona.
2.2. Descomposición y pasos secuenciales
Uno de los principios clave para resolver cualquier problema con lógica es la descomposición. Esta consiste en dividir un problema grande en partes más pequeñas, más fáciles de entender y resolver.
Cuando intentamos abordar un problema complejo de golpe, podemos bloquearnos o cometer errores. En cambio, si lo fragmentamos en pasos, se vuelve más manejable.
- 🔹 ¿Qué implica descomponer un problema?
De un problema general o grande, tendremos que:
- Separar cada tarea o acción necesaria.
- Identificar un orden lógico para ejecutar cada paso.
- Trabajar con partes independientes, pero conectadas entre sí.
🧠 Ejemplo:
Problema: Preparar un bocadillo.
Aunque suene trivial, requiere una serie de pasos ordenados:
- Ir a la cocina.
- Coger dos rebanadas de pan.
- Añadir los ingredientes deseados (jamón, queso, etc.).
- Juntar las rebanadas.
- Servir el bocadillo en un plato.
Cada una de esas acciones puede tratarse como una unidad independiente. Y si el objetivo cambia (hacer un sándwich caliente o uno vegetal), solo algunos pasos se modificarán. Eso es lo útil de la descomposición.
- 🔄 Secuencialidad
Una vez descompuesto, el orden importa. No puedes servir el bocadillo si aún no lo has montado. Este principio, llamado flujo secuencial, es la base de muchos algoritmos y tareas cotidianas.
2.3. Reconocimiento de patrones y generalización
Otro aspecto esencial del pensamiento lógico es la capacidad de observar similitudes entre problemas y extraer reglas generales que se puedan reutilizar.
Esto se conoce como:
- Reconocimiento de patrones: detectar estructuras, secuencias o comportamientos que se repiten.
- Generalización: extraer principios o reglas a partir de casos concretos.
🧠 Ejemplo:
Imagina estos tres problemas:
- Contar de 1 a 10.
- Contar de 5 a 15.
- Contar de 20 a 30.
Aunque los números cambian, el patrón es el mismo: “sumar 1 en cada paso hasta alcanzar un número final”. Reconocer este patrón permite generalizar una solución que sirva para cualquier rango.
🎯 ¿Por qué es útil?
- Evita resolver desde cero problemas similares.
- Permite crear soluciones adaptables y reutilizables.
- Fortalece el pensamiento abstracto, clave en matemáticas y programación.
2.4 Diseño de soluciones paso a paso
Una vez que hemos analizado el problema, lo hemos descompuesto en partes y hemos detectado patrones, llega el momento de diseñar una solución lógica paso a paso.
Este proceso se llama diseño algorítmico. Aunque aún no estemos escribiendo código, ya estamos creando una secuencia de acciones que resuelven el problema. Es como escribir una receta: cada paso debe tener sentido, estar bien ordenado y ser comprensible.
🔸 Características de una buena solución paso a paso:
- Claridad: cada paso es concreto, sin ambigüedades.
- Orden: los pasos siguen una lógica que conduce al resultado.
- Eficiencia: se evita repetir tareas innecesarias.
- Adaptabilidad: si el problema cambia, se puede modificar la solución sin rehacerla completamente.
🧠 Ejemplo: Problema: Calcular el promedio de tres notas.
Diseño de solución:
- Pedir al usuario que introduzca las tres notas.
- Sumar las tres notas.
- Dividir el total entre 3.
- Mostrar el resultado.
Este diseño puede representarse más adelante con un lenguaje de programación, pseudocódigo o diagrama. Pero su estructura lógica es válida desde ya.
Resolver ejercicios de lógica no se trata solo de dar con una respuesta correcta, sino de aprender a pensar de forma estructurada y ordenada. A continuación te dejamos una serie de recomendaciones que te ayudarán a trabajar los ejercicios de forma más eficaz, evitando bloqueos y desarrollando tu razonamiento paso a paso.
3. Recomendaciones para resolver ejercicios de lógica
Parece obvio, pero muchas veces los errores surgen por no leer bien lo que se pide. Antes de hacer nada, asegúrate de entender el problema:
- ¿Qué información se da?
- ¿Qué se está pidiendo?
- ¿Hay condiciones, restricciones o pasos ocultos?
Si hace falta, lee más de una vez o subraya lo importante.
A veces, explicar el problema “a tu manera” te ayuda a comprenderlo mejor. Intenta expresarlo como si se lo contaras a alguien que no lo conoce. Eso te obliga a identificar lo esencial.
También puedes hacer un esquema, lista o dibujo si el problema es visual o numérico.
No intentes resolverlo todo de golpe. Piensa:
- ¿Puedo resolver una parte antes que otra?
- ¿Qué pasos intermedios necesito?
Resolver pequeñas partes te dará confianza y claridad para abordar el resto del ejercicio.
En los ejercicios de lógica (y en la programación), el orden importa. Cada paso debe basarse en lo anterior y preparar el siguiente.
Intenta pensar como si estuvieras escribiendo una receta: ¿Qué debe pasar primero? ¿Qué viene después?
Es normal quedarse bloqueado. Cuando ocurra:
- Vuelve a leer el enunciado.
- Revisa lo que ya has hecho.
- Prueba con un ejemplo más simple.
- Pide ayuda, pero explica tu razonamiento primero.
Muchas veces el simple hecho de repasar lo que hiciste te permite ver el error.
Una buena forma de saber si tu razonamiento es correcto es probarlo con casos reales o inventados. Si funciona en varios casos, probablemente es una buena solución.
También puedes preguntar:
“¿Este paso funcionaría si el número fuera negativo? ¿O si fuera cero?”
No basta con llegar al resultado: hay que expresar el proceso de forma comprensible. Si alguien más lee tu solución, debería poder seguirla sin dificultades.
- Usa frases breves.
- Numera los pasos si es necesario.
- Evita saltos de lógica o suposiciones no explicadas.
Cada error es una oportunidad para mejorar tu razonamiento. Al revisar una solución incorrecta:
- Analiza qué parte falló.
- Intenta entender por qué cometiste ese error.
- Vuelve a intentarlo, sin copiar directamente la respuesta.
4. Ejercicios
A continuación se plantean diferentes ejercicios para practicar la lógica de programación clasificados por el nivel de dificultad. Se pueden resolver estos ejercicios mediante cualquier lenguaje de programación, pseudocódigo o diagramas de flujo. La idea es que cada ejercicio ayude a desarrollar la capacidad de razonamiento lógico y a aplicar los conceptos aprendidos.
4.1. Dificultad básica ✅
Los ejercicios propuestos en este nivel son ideales para quienes están estudiando programación por primera vez y no tienen nociones previas. Cada ejercicio está diseñado para desarrollar habilidades básicas en la resolución de problemas, por lo que será necesario aplicar pensamiento lógico y utilizar estructuras elementales de programación.
Ejercicio 1: Mi primer programa v.1
✨ Escribe un programa que muestre el siguiente mensaje en pantalla:
¡Hola Mundo!
Ejercicio 2: Saludo personalizado
Realiza un programa que muestre un saludo personalizado al usuario.
- 👤 Declara una variable para almacenar el nombre de una persona.
- 🧑💻 Solicita al usuario que introduzca su nombre.
- 💬 Muestra un mensaje de saludo personalizado en pantalla, por ejemplo:
¡Hola, José!
Ejercicio 3: Calculadora
🧮 Solicita dos números decimales al usuario y muestra el resultado de las siguientes operaciones:
- ➕ Suma
- ➖ Resta
- ✖️ Multiplicación
- ➗ División
⚠️ ¡Importante! No es posible realizar una división por cero. Si esto ocurre, el programa debe mostrar un mensaje de advertencia y evitar el cálculo.
Ejercicio 4: Calculadora avanzada
🧮 Solicita un número decimal al usuario y muestra el resultado de las siguientes operaciones matemáticas:
- Valor absoluto
- Raíz cuadrada
- Potencia (elevado al cuadrado)
- Módulo
- Coseno
- Seno
- Tangente
Ejercicio 5: Área de un rectángulo
Realiza un programa que calcule el área de un rectángulo.
- 📐 Pide al usuario la base y la altura de un rectángulo.
- 🧠 Calcula su área utilizando la fórmula:
Área = base × altura
- 📊 Muestra el resultado por pantalla.
Ejercicio 6: Mi primer programa v.2
Mejora el ejercicio 1, para ▶️ solicitar al usuario la palabra Iniciar
- 🔹 Si se introduce correctamente, mostrará:
¡Hola Mundo!
- 🔸 Si se introduce cualquier otro valor, mostrará:
Fin de programa
Ejercicio 7: Semáforo
🚦 Solicita al usuario que introduzca una de las siguientes palabras: "Verde"
, "Ámbar"
o "Rojo"
.
Dependiendo del valor introducido, el programa debe mostrar:
- 🟢 Verde →
Puedes pasar
- 🟡 Ámbar →
Pasa si no hay peligro
- 🔴 Rojo →
Detente
Ejercicio 8: Número par o impar
Realiza un programa que realice lo siguiente:
- 🔢 Solicita un número entero al usuario.
- 📋 Muestra un mensaje que indique si el número introducido es par o impar.
Ejercicio 9: Mi primer programa v.3
Mejora el ejercicio 6, para ▶️ solicitar al usuario la palabra clave: Iniciar
y según la entrada del usuario:
- ✅ Si se introduce la palabra correcta, se pedirá al usuario un número entero positivo.
- 🔁 El mensaje
¡Hola Mundo!
se mostrará tantas veces como el número introducido. - ❌ Si la palabra inicial no es válida o el número no es positivo, se mostrará el mensaje:
Fin de programa
.
Ejercicio 10: Contador y Cuenta atrás
Realiza un programa que realice lo siguiente:
- 🔢 Solicita un número entero al usuario.
- 🔁 Utiliza un bucle para mostrar por pantalla los números del 1 al número introducido de forma secuencial.
- ⏳ Utiliza otro bucle para mostrar por pantalla los números del número introducido al 1 de forma decreciente.
- ❌Si el número introducido es menor que 1, muestra un mensaje de error:
El número debe ser mayor o igual a 1
.
Ejercicio 11: Suma acumulada
Realiza un programa que realice lo siguiente:
- 🧑💻 Solicita al usuario que introduzca cinco números enteros.
- ➕ Calcula la suma total de todos ellos.
- 📊 Muestra el resultado final por pantalla.
Ejercicio 12: Mayor de tres números
Realiza un programa que realice lo siguiente:
- 🔢 Solicita tres números al usuario.
- 🔍 Compara los valores introducidos y muestra cuál es el mayor de los tres.
Ejercicio 13: Tabla de multiplicar
Crea un programa que realice lo siguiente:
- ✖️ Solicita un número al usuario.
- 🔁 Muestra su tabla de multiplicar del 1 al 10.
- 📋 El formato a mostrar debe ser como:
1 x 1 = 1
- ❌ Si el número introducido no es válido, muestra un mensaje de error:
El número debe ser mayor o igual a 1
.
Ejercicio 14: Mi primer programa v.4
Mejora el ejercicio 9, para incluir la funcionalidad básica en un procedimiento, tal y como se indica a continuación:
- 🧩 Escribe un procedimiento que reciba como parámetro un número entero positivo.
- 💬 Este procedimiento debe imprimir
¡Hola Mundo!
tantas veces como indique el número recibido. - 🔁 El procedimiento no debe devolver ningún valor, solo mostrar el mensaje por pantalla.
El programa principal deberá:
- ▶️ Solicitar al usuario la palabra
Iniciar
. - ✅ Si la palabra es correcta, solicitará un número entero positivo y llamará al procedimiento.
- ❌ Si se introduce cualquier otro valor o el número no es válido, mostrará:
Fin de programa
.
Ejercicio 15: Procedimiento para mostrar mensaje
📝 Define un procedimiento llamado MostrarMensaje
que imprima un mensaje motivador por pantalla.
▶️ Llama a este procedimiento desde el algoritmo principal para mostrarlo.
Ejercicio 16: Redondeo de un número decimal
Realiza un programa que cumpla lo siguiente:
- 🔢 Solicita un número decimal al usuario.
- 🔄 Utiliza una función de redondeo para convertirlo a un número entero.
- 📊 Muestra el resultado por pantalla.
Ejercicio 17: Lista de la compra
Realiza un programa que realice lo siguiente:
- 🛒 Crea un array de 5 elementos.
- ✍️ Solicita al usuario que introduzca una fecha y los productos que necesita comprar.
- 📋 Al finalizar, muestra la fecha indicada y el listado completo en pantalla.
Ejercicio 18: Promedio de elementos en un array
Realiza un programa que realice lo siguiente:
- 🔢 Crea un vector (array) de 10 números.
- ✍️ Solicita al usuario que introduzca los valores uno a uno.
- 📊 Calcula y muestra el promedio de los elementos almacenados en el array.
Ejercicio 19: Matriz aleatoria
Desarrolla un programa que realice lo siguiente:
- 🔢 Crea una matriz 5x5 de tipo numérico.
- 🎲 Inicializa toda la matriz con números aleatorios comprendidos entre 1 y 10.
- ➕ Recorre toda la matriz y calcula la suma total de todos sus elementos.
- 🖥️ Muestra el resultado de la suma en pantalla.
Ejercicio 20: Tablero de ajedrez
Crea un programa que permita representar un tablero de ajedrez.
- ♟️ Crea una matriz que represente el tablero de ajedrez (8x8).
- 🏰 Coloca todas las piezas en sus posiciones iniciales para cada jugador. Cada jugador dispone de:
- ♚ Un rey (R)
- ♛ Una dama (D)
- ♜ Dos torres (T)
- ♞ Dos caballos (C)
- ♝ Dos alfiles (A)
- ♙ Ocho peones (P)
🎨 Para distinguir a cada jugador, se añadirá una letra:
- ⬜ B para el jugador Blanco.
- ⬛ N para el jugador Negro.
📌 Por ejemplo, el rey del jugador blanco se representará como B-R
, y el del negro como N-R
4.2. Dificultad fácil ⚠️
En este nivel, los enunciados no especifican de forma explícita qué estructuras básicas se deben utilizar. Se comienza a potenciar el pensamiento lógico, explorando distintas soluciones posibles y determinando cómo llegar a la resolución del problema de manera eficiente.
Ejercicio 21: Juego Fizz Buzz
🎮 Escribe un programa que imprima 🖥️ los números del 1 al 100, uno por línea.
🚨 Sin embargo, deberás sustituir ciertos números según estas reglas:
- 🔺 Múltiplos de 3 → mostrar
"fizz"
- 🔹 Múltiplos de 5 → mostrar
"buzz"
- 🧨 Múltiplos de 3 y 5 → mostrar
"fizzbuzz"
📌 Ejemplo de como comienza la secuencia: 1, 2, Fizz, 4
Ejercicio 22: Área de un polígono
📐 Crea una única función que reciba como parámetro un tipo de polígono y calcule su área según sus componentes.
✅ Solo se procesará un polígono por llamada.
Los polígonos permitidos son:
- 🔺 Triángulo
- ◼️ Cuadrado
- 🟥 Rectángulo
🖥️ Muestra por pantalla el área calculada.
Ejercicio 23: Invertir cadena
🔄 Crea un programa que invierta el orden de los caracteres de una cadena de texto.
🚫 No puedes utilizar funciones propias del lenguaje que ya lo hagan automáticamente.
📌 Por ejemplo: "Hola mundo"
→ "odnum aloH"
Ejercicio 24: Conversor de decimal a binario
💡 Crea un programa que transforme un número decimal a su equivalente en binario.
🚫 No uses funciones incorporadas del lenguaje que hagan esta conversión automáticamente.
🧮 El resultado deberá calcularse mediante lógica de programación.
Ejercicio 25: Caracteres exclusivos de cada cadena
✍️ Crea una función que reciba dos cadenas como parámetros: str1
y str2
.
🧵 La función debe generar dos nuevas cadenas:
- 🔹
out1
: caracteres que están enstr1
pero no enstr2
- 🔸
out2
: caracteres que están enstr2
pero no enstr1
📋 Muestra ambos resultados por pantalla.
Ejercicio 26: Factorial (n!)
🔢 Escribe una función que calcule y retorne el factorial de un número entero dado.
🧠 El factorial de un número n (n!) se define como el producto de todos los enteros positivos desde 1 hasta n.
📌 Por ejemplo: 3!
→ 1 * 2 * 3 = 6
Ejercicio 27: Validar número narcisista
🔍 Escribe una función que determine si un número es un número narcisista o Armstrong.
🧮 Un número narcisista es aquel que es igual a la suma de sus dígitos elevados a la potencia del número de dígitos.
📌 Por ejemplo: 371
→ 3^3 + 7^3 + 1^3 = 371
👉 Más información: números narcisistas
Ejercicio 28: Palabras con la primera letra en mayúsculas
✍️ Crea una función que reciba una cadena de texto y convierta la primera letra de cada palabra en mayúscula.
🚫 No puedes usar funciones propias del lenguaje que lo hagan directamente.
Ejercicio 29: Calculadora de milisegundos
⏱️ Crea una función que reciba cuatro valores enteros:
- Días
- Horas
- Minutos
- Segundos
🧮 La función debe calcular y retornar el total equivalente en milisegundos.
Ejercicio 30: Validar conjuntos disjuntos
🧩 Crea una función que reciba dos arrays (conjuntos) y determine si son conjuntos disjuntos, es decir, si no comparten ningún elemento en común. ✅ Retorna true
si son disjuntos, o false
en caso contrario.
📌 Por ejemplo:
- 👌
A [1,2,3] B [4,5,6]
→true
- ❌
A [1,2,3] B [3,4,5]
→false
Ejercicio 31: Elementos comunes o no comunes de dos conjuntos
🔁 Crea una función que reciba dos arrays y un valor booleano como parámetros.
📌 La función debe retornar un nuevo array según la condición:
- ✅ Si el booleano es
true
, devolverá los elementos comunes entre ambos arrays. - ❌ Si es
false
, devolverá los elementos que no se repiten en ambos arrays.
🚫 No se pueden utilizar funciones propias del lenguaje que lo hagan directamente.
Ejercicio 32: Dibujar cuadrado o triángulo
✏️ Crea un programa que dibuje en pantalla un cuadrado o un triángulo utilizando asteriscos (*
).
🔢 El usuario deberá:
- Indicar el tamaño del lado (entero positivo).
- Elegir si quiere dibujar un cuadrado o un triángulo.
Ejercicio 33: Validar vectores ortogonales
📐 Crea un programa que determine si dos vectores son ortogonales (es decir, su producto escalar es igual a 0).
➕ Ambos vectores deben tener la misma longitud y representarse como arrays.
📌 Ejemplo: [1, -2]
y [2, 1]
Ejercicio 34: Ordenar listas númericas
📊 Crea una función que ordene una lista de números según el criterio indicado.
La función debe recibir:
- Una lista de números.
- Un parámetro de tipo texto:
"Asc"
para orden ascendente o"Desc"
para descendente.
🚫 No se permite utilizar funciones propias del lenguaje que realicen el ordenamiento automáticamente.
Ejercicio 35: Contador de vocales
🔤 Crea una función que reciba un texto y cuente el número de vocales (tanto mayúsculas como minúsculas).
📊 Muestra el resultado por pantalla.
Ejercicio 36: Marco cuadro de palabras
🖼️ Crea una función que reciba un texto y muestre cada palabra en una línea, encerrada en un marco de asteriscos.
📌 Ejemplo:
Entrada: "Hola, Mundo !"
Salida:
*********** Hola, ** Mundo ** ! ***********
Ejercicio 37: Conversor de números romanos a enteros
🏛️ Crea un programa que convierta números romanos a enteros.
- 📜 El usuario debe introducir un número romano válido (por ejemplo,
XII
,IV
,XXI
). - 🔢 El programa debe retornar el valor entero correspondiente. 🚫 No se pueden usar funciones del lenguaje que realicen la conversión automáticamente.
Ejercicio 38: Conversor de números enteros a romanos
🏛️ Crea un programa que convierta números enteros a números romanos.
- 🔢 El usuario debe introducir un número entero positivo (por ejemplo,
1
,4
,10
). - 📜 El programa debe retornar el número romano correspondiente. 🚫 No se pueden usar funciones del lenguaje que realicen la conversión automáticamente.
Ejercicio 39: Validar año bisiesto
📅 Crea una función que reciba un año (número entero) y determine si es bisiesto o no.
ℹ️ Recuerda que un año es bisiesto si es divisible entre 4, pero no entre 100, excepto si también es divisible entre 400.
Ejercicio 40: El segundo número más grande
🔢 Dado un array de números, encuentra el segundo número más grande del listado.
⚠️ Asegúrate de contemplar que no todos los números sean iguales y que el array tenga al menos dos valores distintos.
Ejercicio 41: Conversor de binario a decimal
💻 Crea un programa que convierta un número binario a su equivalente en decimal.
🚫 No se pueden utilizar funciones propias del lenguaje que lo hagan automáticamente.
Ejercicio 42: Cálculo del voltaje en un circuito eléctrico
⚡ Crea una función que calcule el voltaje según la Ley de Ohm.
La función debe:
- Recibir la intensidad (I) y la resistencia (R)
- Calcular y retornar el voltaje (V = I × R)
- Retornar un mensaje de error si los valores son inválidos o insuficientes
Ejercicio 43: Conversor de temperatura
🌡️ Crea una función que convierta grados Celsius a Fahrenheit, y viceversa.
La función debe:
- Recibir el valor de la temperatura y su unidad de origen
- Retornar el valor convertido a la unidad de destino
- Mostrar un mensaje de error si los datos son incorrectos o faltan
Ejercicio 44: La vocal más común
🔤 Crea una función que reciba un texto y retorne la vocal más repetida.
⚠️ Ten en cuenta:
- Mayúsculas y minúsculas (no deben distinguirse)
- Vocales con tilde deben tratarse como equivalentes (por ejemplo: á → a)
- En caso de empate, puedes devolver cualquiera de las vocales empatadas
- Si no hay vocales, retorna vacío
Ejercicio 45: Calendario de adviento
🎄 Crea una función que reciba una fecha y analice su relación con el calendario de adviento (del 1 al 24 de diciembre).
La función debe contemplar los siguientes casos:
- 📦 Si la fecha está dentro del calendario: retornar el regalo del día y cuántos días quedan para finalizarlo.
- ⏳ Si la fecha es anterior al 1 de diciembre: indicar cuántos días faltan para comenzar.
- 📅 Si la fecha es posterior al 24 de diciembre: indicar cuántos días han pasado desde su fin.
Ejercicio 46: La encriptación Karaca
🔐 Crea una función que permita encriptar y desencriptar texto utilizando el algoritmo de la encriptación Karaca.
El proceso consiste en:
- 🔄 Reemplazar cada vocal por un número:
a → 0
,e → 1
,i → 2
,o → 3
,u → 4
- ✅ Las consonantes permanecen sin cambios
- ➕ Añadir una secuencia extra al final (por ejemplo,
aca
) - 🔁 Invertir la cadena resultante
📌 Ejemplo:
Entrada: "Hola Mundo"
Resultado: "odnuM 3l0Haca"
Ejercicio 47: Multi conversor de unidades de medida
📏 Crea un programa que permita convertir entre diferentes unidades de medida.
- 🧮 El usuario debe poder elegir entre:
- Longitud (metros, kilómetros, millas)
- Peso (gramos, kilogramos, libras)
- Temperatura (Celsius, Fahrenheit)
- 🔄 El programa debe solicitar el valor a convertir y la unidad de origen y destino.
- 📊 Muestra el resultado de la conversión por pantalla
Ejercicio 48: Sudoku simplificado 3x3
🎮 Crea un programa que permita jugar una versión simplificada del Sudoku, utilizando una matriz de 3x3.
- 📐 El tablero se representa como una matriz bidimensional de enteros.
- Cada celda puede contener un número del 1 al 3 o estar vacía (representada por
0
o un espacio). - 🔢 El programa debe colocar un único número en una celda aleatoria como pista inicial.
- 👤 Luego, el usuario introducirá los valores uno por uno, indicando la fila, la columna y el número a colocar.
- ✅ Se debe verificar que no haya números repetidos en la misma fila ni en la misma columna.
- 🔁 Tras cada intento, el tablero se mostrará actualizado con los números introducidos.
- 🏁 El programa finalizará cuando el tablero esté completo correctamente y mostrará el tablero final y el número total de intentos.
Ejercicio 49: Adivina el número secreto
🔐 Crea un programa que permita jugar a adivinar un número secreto generado aleatoriamente por la máquina.
- 🎲 Al comenzar, se generará un número aleatorio entre 1 y 100.
- 🎯 El usuario intentará adivinarlo introduciendo números por teclado.
- 📈 Después de cada intento, el programa debe indicar si el número introducido es mayor o menor que el número secreto.
- 🔁 El juego continúa hasta que el usuario acierta el número.
- 📊 Al final, se muestra el número total de intentos necesarios.
Ejercicio 50: Juego del ahorcado
🧩 Crea un programa que permita jugar a adivinar una palabra secreta.
- 📜 El programa seleccionará una palabra aleatoria de una lista predefinida.
- 🔤 El usuario deberá adivinar la palabra introduciendo letras una por una.
- ❌ Si la letra no está en la palabra, se mostrará un mensaje de error.
- ✅ Si la letra está, se mostrará su posición en la palabra.
- 🏁 El juego finaliza cuando el usuario adivina todas las letras de la palabra.
4.3. Dificultad media 🛠️
Los ejercicios de dificultad media requieren combinar varias estructuras básicas y hacer un uso más avanzado del pensamiento lógico. Es necesario analizar el problema en profundidad, identificar casos especiales y optimizar el proceso para encontrar soluciones efectivas. Aquí se fomenta la capacidad de planificación y la toma de decisiones en la implementación. Es posible que pueda existir más de una solución válida para cada ejercicio, por lo que se anima a explorar diferentes enfoques, priorizando aquellos que sean más óptimos, claros y eficientes.
Ejercicio 51: Juego del ahorcado con niveles de dificultad
🧩 Crea un programa que permita jugar a adivinar una palabra secreta.
- 📜 El programa solicitará el nivel de dificultad (fácil, medio o díficil)
- 🎚️ Según el nivel:
- Fácil: seleccionará una palabra aleatoria de como máximo 5 letras de una lista definida. El número de intentos será 10.
- Medio: seleccionará una palabra aleatoria comprendida entre 6 y 10 letras de una lista definida. El número de intentos será 7.
- Difícil: seleccionará una palabra aleatoria de más de 10 letras de una lista definida. El número de intentos será 5.
- 🔤 El usuario deberá adivinar la palabra introduciendo letras una por una.
- ❌ Si la letra no está en la palabra, se mostrará un mensaje de error y restará un intento.
- ✅ Si la letra está, se mostrará su posición en la palabra.
- 🏁 El juego finaliza cuando el usuario adivina todas las letras de la palabra o se queda sin intentos.
Ejercicio 52: Validar palabras Anagramas
🔄 Escribe una función que reciba dos palabras y retorne true
o false
según sean o no anagramas.
- ✍️ Un anagrama consiste en formar una palabra reordenando todas las letras de otra palabra inicial.
- 🧠 No hace falta comprobar si las palabras existen en un diccionario.
- 🚫 Dos palabras idénticas no se consideran anagramas.
Ejercicio 53: Validador de números primo
🔍 Crea una función que determine si un número entero positivo es primo.
- 📌 Un número primo es aquel que solo es divisible por 1 y por sí mismo.
- 🚫 No puedes usar funciones del lenguaje que realicen la validación automáticamente.
Ejercicio 54: Listado de los 100 números primos
🧮 Escribe un programa que imprima todos los números primos comprendidos entre 1 y 100.
Ejercicio 55: Contador de palabras
📝 Crea un programa que cuente cuántas veces se repite cada palabra y muestre el recuento final.
- ❌ Los signos de puntuación no forman parte de la palabra.
- 🔠 Una palabra es la misma aunque esté en mayúsculas o minúsculas.
- 🚫 No se pueden utilizar funciones del lenguaje que resuelvan el problema automáticamente.
Ejercicio 56: Generador de código morse
🔤 Crea un programa que transforme texto natural a código Morse y viceversa.
- 🔍 El programa debe detectar automáticamente el tipo de entrada y realizar la conversión.
- 📡 En Morse se usa: raya
—
, punto.
, un espacio" "
entre letras y dos espacios" "
entre palabras. - 🌐 Se puede usar el alfabeto morse descrito en Wikipedia – Código Morse.
Ejercicio 57: Expresiones equilibradas
🧩 Crea un programa que verifique si los paréntesis, llaves y corchetes de una expresión están equilibrados.
- ⚖️ Equilibrado significa que se abren y cierran en el orden correcto.
- ➖ Todos los delimitadores tienen la misma prioridad.
✅ Ejemplo equilibrado: { [ a * ( c + d ) ] - 5 }
❌ Ejemplo no equilibrado: { a * ( c + d ) ] - 5 }
Ejercicio 58: Validador texto palindromo
🔁 Escribe una función que reciba un texto y retorne true
o false
según sea o no un palíndromo.
- 📖 Un palíndromo es una palabra o frase que se lee igual de izquierda a derecha que de derecha a izquierda.
- 🚫 No se deben tener en cuenta los espacios, signos de puntuación ni tildes.
- ✅ Ejemplo válido: La ruta natural
Ejercicio 59: Carrera de obstáculos
🏃♂️ Crea una función que evalúe si un/a atleta ha superado correctamente una carrera de obstáculos.
Recibe dos parámetros:
- 📚 Un array de palabras:
"corre"
o"salta"
. - 🛤️ Un string que representa la pista:
"_"
para suelo y"|"
para valla.
✅ Si hace run
en "_"
o jump
en "|"
, está correcto y avanza.
❌ Si es distinto, falla. Se considerará carrera fallida, si ocurren tres fallos consecutivos.
❌ Si la pista es más larga que las acciones del corredor, se supondrá como carrera fallida.
⚠️ Si las acciones del corredor son mayores que la pista, se ignorarán las acciones sobrantes.
🔄 La función devuelve un booleano indicando si completó correctamente la carrera.
Ejercicio 60: Calculadora del Máximo Común Dividir (MCD) y el Mínimo Común Múltiplo (MCM)
🔢 Crea dos funciones:
- 📏 Una para calcular el máximo común divisor (MCD).
- 📐 Otra para calcular el mínimo común múltiplo (MCM).
🖥️ Desde el programa principal llamada a las dos funciones para mostrar su funcionamiento.
Ejercicio 61: Contador ganador juego Piedra, Papel y Tijera
📝Crea un programa que determine quién gana más partidas al juego de Piedra, Papel o Tijera.
- 📚 El programa obtiene dos lista representando cada jugada.
- Usa los caracteres: ✊
"R"
(piedra), ✋"P"
(papel), ✌️"S"
(tijera). - 🏆 El resultado puede ser: “Jugador 1”, “Jugador 2” o “Empate”. Además, se mostrará 🖥️ el número de partidas ganadas.
Ejercicio 62: Simulador máquina expendedora
🥤 Simula una máquina expendedora. El programa debe gestionar el proceso de compra de productos de una máquina expendedora, teniendo en cuenta el inventario, el pago y el cambio.
- 🏧 La máquina expendedora dispone de:
- Una matriz que representa las posiciones del producto. Cada celda contiene un array con tres elementos:
- El nombre del producto (string).
- El precio (número).
- La cantidad disponible.
- Un listado de monedas que contiene la máquina expendedora para dar el cambio.
- Una matriz que representa las posiciones del producto. Cada celda contiene un array con tres elementos:
- 🛒 El usuario selecciona un producto indicando las coordenadas donde se ubica el producto, por ejemplo, A1 que representa (0,0) y el importe a pagar.
- 💰 Si el producto existe y se puede hacer efectivo la operación, la máquina devuelve el nombre del producto y un array con el cambio (usando el menor número de monedas posible).
- ❌ Si ocurre un error (producto no válido, sin stock, importe insuficiente o sin cambio), se muestra un mensaje y devuelve todo el dinero pagado.
💶 La máquina solo acepta y entrega cambio en monedas de: 0.01€
, 0.05€
, 0.10€
, 0.20€
, 0.50€
, 1€
y 2€
.
Ejercicio 63: Calendario chino
📅 Crea una función que, dado un año, indique el elemento y el animal correspondientes del ciclo sexagenario del zodíaco chino.
- 🔁 El ciclo combina 5 elementos: madera 🌳, fuego 🔥, tierra ⛰️, metal ⚙️ y agua 💧.
- Y 12 animales: rata 🐀, buey 🐂, tigre 🐅, conejo 🐇, dragón 🐉, serpiente 🐍, caballo 🐎, oveja 🐑, mono 🐒, gallo 🐓, perro 🐕 y cerdo 🐖.
- Cada elemento se repite durante dos años consecutivos.
- El último ciclo comenzó en 1984 con Madera 🌳 Rata 🐀.
Ejercicio 64: Los números faltantes
🔍 Dado un array de enteros ordenado y sin repetidos, crea una función que retorne los números faltantes entre el menor y el mayor del array.
Ejercicio 65: Bubble Sort
📝 Crea un programa que ordene una lista de números enteros utilizando el algoritmo de Bubble Sort.
- 🧮 El programa debe permitir introducir una lista de números desordenados.
- 🔄 Implementa el algoritmo paso a paso para ordenar la lista de menor a mayor.
- 🖥️ Muestra la lista ordenada al finalizar.
Ejercicio 66: Insertion Sort
📝 Crea un programa que ordene una lista de números enteros utilizando el algoritmo de Insertion Sort.
- 🧮 El programa debe permitir introducir una lista de números desordenados.
- 🔄 Implementa el algoritmo paso a paso para ordenar la lista de menor a mayor.
- 🖥️ Muestra la lista ordenada al finalizar.
Ejercicio 67: Quick Sort
📝 Crea un programa que ordene una lista de números enteros utilizando el algoritmo de Quick Sort.
- 🧮 El programa debe permitir introducir una lista de números desordenados.
- 🔄 Implementa el algoritmo Quick sort para ordenar la lista de menor a mayor.
- 🖥️ Muestra la lista ordenada al finalizar.
Ejercicio 68: Cola de supermercado
🛒 Crea un programa que simule la cola de clientes esperando en un supermercado.
- 👥 Los clientes llegan y se añaden al final de la cola (encolar o enqueue).
- 🏪 El cajero atiende a los clientes en orden, sacándolos del frente de la cola (desencolar o dequeue).
- 📊 El programa debe permitir añadir nuevos clientes y atender a los clientes en el orden correcto.
- 🔢 Después de cada operación, muestra el número de clientes que quedan en la cola.
- ❗ Controla los casos en los que se intente atender a un cliente cuando la cola está vacía.
- 🔁 La simulación continúa hasta que el usuario decida finalizarla.
Ejercicio 69: Pila de platos
📝 Crea un programa que simule la gestión de una pila de platos en un restaurante.
- 🍽️ Los platos se apilan uno encima de otro, por lo que solo se puede sacar el último plato que se colocó (desapilar o pop).
- 🥄 El programa debe permitir al usuario añadir un plato nuevo a la pila (apilar o push) o sacar el plato superior (desapilar).
- 📊 Después de cada acción, muestra cuántos platos quedan en la pila y su orden.
- ❗ Controla los casos en que se intente sacar un plato cuando la pila está vacía.
- 🔁 El programa debe continuar hasta que el usuario decida terminar la simulación.
Ejercicio 70: Triángulo de Pascal
🔺 Crea una función que dibuje el Triángulo de Pascal indicando el tamaño del lado.
- 🧮 Cada número se calcula como la suma de los dos números superiores.
- 📊 Muestra el triángulo en formato texto, alineando los números correctamente.

Ejercicio 71: Truco o trato
🎃 Crea un programa especial de Halloween que interactúe con los niños/as.
- 🕷 El usuario elige entre “Truco” o “Trato”.
- 👶 Se introduce una lista de nombres de niños/as.
- Si es “Truco” 🎭 🧛♂️ 😈:
- Genera sustos aleatorios 🎃 👻 💀 🕷 🕸 🦇.
- Un susto por cada 2 letras del nombre.
- Dos sustos si el nombre tiene dos o más “a” o “e”.
- Tres sustos si el nombre tiene más de 10 letras.
- Si es “Trato” 🧁 🧺 🎒:
- Genera dulces aleatorios 🍬 🍭 🍫 🍪.
- Un dulce por cada 3 letras del nombre.
- Dos dulces si el nombre tiene una o más “i” o “u”.
- Tres dulces si el nombre tiene más de 8 letras.
📊 Muestra los resultados finales con los nombres y sus respectivos sustos o dulces.
Ejercicio 72: Pozos de agua
⚙️ Desarrolla un programa que simule el estudio de pozos de agua y cuente cuantas unidades pueden tener. Dado un array de números enteros que representan la cantidad de bloques apilados, calcula cuántas unidades de agua quedan atrapadas entre ellos.
- 🧱 Cada número indica la altura de bloques.
- 💧 El agua queda atrapada entre bloques más altos.
- 📌 Por ejemplo, para el array
[2, 0, 3, 1, 6, 3, 6]
, el resultado es6
.
⏹ | 💧 | ⏹ | ||||
⏹ | 💧 | ⏹ | ||||
⏹ | 💧 | ⏹ | ||||
⏹ | 💧 | ⏹ | ⏹ | ⏹ | ||
⏹ | 💧 | ⏹ | 💧 | ⏹ | ⏹ | ⏹ |
⏹ | 💧 | ⏹ | ⏹ | ⏹ | ⏹ | ⏹ |
Ejercicio 73: Generador de contraseñas
🔐 Crea un generador de contraseñas configurables que cumpla los siguientes requisitos:
- 🛡️ Longitud entre 8 y 16 caracteres.
- 🔢🔡 Debe incluir letras, números y símbolos.
- 🔠 Contener al menos una letra mayúscula.
- 🔣 Contener al menos un símbolo (por ejemplo:
#
,_
,!
).
Ejercicio 74: Generador Pseudoaleatorio
🎲 Crea un generador de números pseudoaleatorios entre 0 y 100 sin usar funciones predeterminadas de random
.
🧠 Debes buscar e implementar una estrategia alternativa como el algoritmo de congruencia lineal o alguna fórmula matemática creativa.
Ejercicio 75: Ábaco
🧮 Crea un programa capaz de representar un número en ábaco.
- 📊 El número se representará en una matriz 10 x 10.
- 🔢 Cada fila, empezando desde arriba a abajo, representará las unidades, decenas, centenas, millares, etc.
- 🏛️ Cada columna representará un dígito del número.
- 📥 El número a representar debe estar entre
0
y9.999.999.999
. - ❗ Si el número es válido, se mostrará el ábaco correspondiente.
- ❌ Si el número es inválido, se mostrará un mensaje de error.
📌 Por ejemplo, el número 1234
se representaría así:
| ⬤ | ⬤ | ⬤ | ⬤ | ⬤ | ⬤ | ⬤ | ⬤ | ― | ⬤ || ⬤ | ⬤ | ⬤ | ⬤ | ⬤ | ⬤ | ⬤ | ― | ⬤ | ⬤ || ⬤ | ⬤ | ⬤ | ⬤ | ⬤ | ⬤ | ― | ⬤ | ⬤ | ⬤ || ⬤ | ⬤ | ⬤ | ⬤ | ⬤ | ― | ⬤ | ⬤ | ⬤ | ⬤ || ⬤ | ⬤ | ⬤ | ⬤ | ⬤ | ⬤ | ⬤ | ⬤ | ⬤ | ― || ⬤ | ⬤ | ⬤ | ⬤ | ⬤ | ⬤ | ⬤ | ⬤ | ⬤ | ― || ⬤ | ⬤ | ⬤ | ⬤ | ⬤ | ⬤ | ⬤ | ⬤ | ⬤ | ― || ⬤ | ⬤ | ⬤ | ⬤ | ⬤ | ⬤ | ⬤ | ⬤ | ⬤ | ― || ⬤ | ⬤ | ⬤ | ⬤ | ⬤ | ⬤ | ⬤ | ⬤ | ⬤ | ― || ⬤ | ⬤ | ⬤ | ⬤ | ⬤ | ⬤ | ⬤ | ⬤ | ⬤ | ― |
4.4. Dificultad alta 🚨
En este nivel, los ejercicios plantean problemas complejos que pueden involucrar estructuras anidadas, algoritmos más elaborados y manejo de casos límite. Se espera que el alumno sea capaz de diseñar soluciones integrales, aplicar técnicas avanzadas y reflexionar críticamente sobre la eficiencia y robustez del código.
Ejercicio 76: Evaluador de expresiones matemáticas
🧮 Crea un programa que reciba una expresión matemática escrita como cadena y calcule su resultado respetando el orden de operaciones.
- 🔢 La expresión puede incluir números enteros, paréntesis, y los operadores
+
,-
,*
y/
. - 💬 El programa debe analizar la cadena, validar su sintaxis y calcular el resultado correcto.
- 🧾 Se debe respetar la jerarquía de operadores (PEMDAS): primero paréntesis, luego multiplicaciones/divisiones, y por último sumas/restas.
- ❗ El programa debe evaluar correctamente expresiones anidadas como:
“(2 + 3) * (7 - 2) / (1 + 1)” → 12.5
- ❌ Si la expresión es inválida, se mostrará un mensaje de error adecuado.
Ejercicio 77: Fibonacci
🌀 Escribe un programa que imprima los 50 primeros números de la sucesión de Fibonacci empezando en 0.
- 📖 La serie Fibonacci es una sucesión en la que cada número es la suma de los dos anteriores:
0, 1, 1, 2, 3, 5, 8, 13...
Ejercicio 78: Factorial recursivo
📈 Crea un programa que calcule el factorial de un número entero no negativo utilizando una función recursiva.
- ✍️ El programa debe solicitar al usuario un número entero mayor o igual a 0.
- ↪️ La función se definirá como:
factorial(n) = n * factorial(n - 1)
con el caso base:factorial(0) = 1
- 🖥️ Muestra el resultado por pantalla.
- ⚠️ Si el número es negativo, muestra un mensaje de error.
Ejercicio 79: Calcular días entre fechas
📅 Crea una función que calcule y retorne cuántos días hay entre dos fechas, dadas en formato texto.
- 🗓️ El formato de entrada será
"dd/MM/yyyy"
. - 🔄 La diferencia se calculará de forma absoluta (sin importar el orden de las fechas).
- ❗ Si alguna cadena no representa una fecha válida, se debe mostrar un mensaje de advertencia.
Ejercicio 80: Juego tres en raya
🕹️ Crea una función que analice una matriz 3x3 compuesta por "X"
y "O"
, y devuelva:
"X"
si ganaron las ❌."O"
si ganaron las ⭕."Empate"
si nadie ganó ."Nulo"
si la matriz es inválida (proporción incorrecta o ganaron ambos).
⚠️ Nota: la matriz puede tener celdas vacías representadas por ""
.
Ejercicio 81: Juego Sudoku
🧩 Crea un programa que permita jugar al clásico juego de Sudoku sobre un tablero de 9x9.
- 📐 El tablero se representará como una matriz bidimensional de enteros.
- 🔲 Cada celda puede contener un número del 1 al 9 o estar vacía (representada por
0
o un espacio). - 🗂️ El tablero se divide en 9 subcuadrículas de 3x3.
- 🎲 Al iniciar el juego, el programa debe rellenar entre 25 y 30 números iniciales, distribuidos por todo el tablero.
- ❗ Como restricción, debe haber exactamente dos subcuadrículas con un solo número inicial. Las demás pueden contener entre 2 y 5 números, pero ninguna debe superar los 5.
- 👤 Una vez inicializado el tablero, el programa solicitará al usuario que introduzca los valores uno por uno, indicando la fila, la columna y el número deseado.
- ✅ Antes de colocar el número, se debe verificar que no esté repetido en la misma fila ni en la misma columna.
- 🔄 Después de cada intento, se mostrará el tablero actualizado con los números introducidos.
- ❌ Cualquier error en la introducción de datos (número fuera de rango, celda ocupada, etc.) debe ser notificado al usuario.
- 🏁 El programa finalizará cuando el usuario complete correctamente el tablero. Al final, deberá mostrar el tablero final y el número total de intentos realizados.
Ejercicio 82: Juego batalla naval (versión contra la máquina)
⚓ Crea un programa que permita jugar al clásico juego Hundir la Flota contra la máquina.
- 🗺️ El tablero será una matriz bidimensional de tamaño 10x10 (fila x columna).

- 🤖 La máquina colocará de forma aleatoria los barcos, pudiendo ser, vertical, horizontal o diagonal. No puede haber dos o más barcos utilizando una misma celda.
- 🚢 La cantidad de barcos será:
- 1 Acorazado de 4 celdas
- 2 Cruceros de 3 celdas cada uno.
- 3 Destructores de 2 celdas cada uno.
- 4 Submarinos de 1 celda cada uno.
- 🎯 El jugador intentará hundir los barcos introduciendo coordenadas (fila y columna).
- 💥 Después de cada intento, el programa debe indicar si ha sido un “impacto” o un “agua” (fallo).
- ⏳ Existirá un límite de intentos totales para hundir todos los barcos.
- 📊 Por cada iteración, el programa debe mostrar el tablero actualizado, indicando las posiciones ya atacadas y los aciertos. La cantidad máxima de intentos y los realizados.
- 🏁 El juego termina si:
- ✅ El jugador hunde todos los barcos (Gana)
- ❌ Se alcanza al número máximo de intentos (Pierde).
- 📈 Al finalizar, el programa mostrará el número total de intentos realizados en la partida.
❗ Importante: El jugador no tiene la funcionalidad de colocar barcos; solo debe intentar hundir los barcos colocados aleatoriamente por la máquina. La máquina no ataca al jugador. Puedes representar el tablero con caracteres o símbolos para mostrar agua, impactos y posiciones sin atacar.
Ejercicio 83: Torre de Hanoi (versión recursiva)
🏰 Crea un programa que resuelva el clásico problema de la Torre de Hanoi utilizando recursividad.
- 🗼 El juego consiste en tres torres (
A
,B
yC
) y un número variable de discos (entre 3 a 8) apilados en la torre A, ordenados de mayor a menor de abajo a arriba. - 🎯 El objetivo es trasladar todos los discos desde la torre A hasta la torre C, cumpliendo las siguientes reglas:
- 🔄 Solo se puede mover un disco a la vez.
- 📏 Solo se puede colocar un disco sobre otro si es más pequeño.
- 🗺️ Los discos solo se pueden mover de una torre a otra (A, B, C).
- 📥 El programa debe pedir al usuario el número de discos a resolver.
- 📜 Debe mostrar paso a paso cada movimiento necesario para completar la solución.
- ↪️ Utiliza una función recursiva para resolver el problema.
Por ejemplo, el programa debe indicar en pantalla instrucciones como:
Mover disco 1 (Pequeño) de A a CMover disco 2 (Mediano) de A a BMover disco 1 (Pequeño) de C a BMover disco 3 (Grande) de A a C...

Ejercicio 84: El problema de las N reinas
👑 Crea un programa que resuelva el clásico problema de las N reinas utilizando el algoritmo de backtracking.
- 📏 El objetivo es colocar N reinas en un tablero de NxN sin que ninguna se ataque entre sí.
- 🚫 Las reinas no pueden compartir la misma fila, columna ni diagonal.
- 🖥️ El programa debe mostrar una solución válida (o todas si se desea) indicando las posiciones en el tablero.
- 🔄 Utiliza backtracking para explorar las posibles combinaciones y retroceder cuando una colocación no es válida.
- 📐 El usuario puede indicar el tamaño N del tablero (por ejemplo, 4 o 8).

👉 Más información: Backtracking - Wikipedia.
Ejercicio 85: Escapa del laberinto
🧭 Crea un programa que encuentre un camino desde la entrada hasta la salida en un laberinto representado como una matriz de 1s (paso) y 0s (pared).
- 🗺️ El laberinto se representa con una matriz NxM de enteros.
- 🚪 La entrada está en la esquina superior izquierda (0, 0) y la salida en la esquina inferior derecha (N-1, M-1).
- 📥 El laberinto se inicializa manualmente como una matriz fija, añadiendo 1s de forma contigua hasta la salida. Por ejemplo:
laberinto = [[1, 1, 1, 1],[1, 1, 0, 1],[0, 1, 1, 0],[1, 0, 1, 1]]
- 🎯 El programa debe encontrar una ruta posible desde la entrada hasta la salida, avanzando en las cuatro direcciones (arriba, abajo, izquierda, derecha), sin atravesar paredes.
- 🔄 Explora caminos posibles y retrocede si se llega a un callejón sin salida.
- 📊 Muestra el camino encontrado sobre el tablero (por ejemplo, con ”*” o con coordenadas).
- 🔚 Es posible que el laberinto tenga múltiples soluciones, por lo que se debe mostrar el camino más corto.
❗ Importante: Se contempla que el laberinto siempre debe tener un camino válido desde la entrada hasta la salida. No se deben considerar laberintos sin solución.
Ejercicio 86: Algoritmo genético para encontrar una palabra
🧬 Crea un programa que utilice un algoritmo genético para “evolucionar” una cadena de texto aleatoria hasta que coincida con una palabra objetivo.
¿Qué debe hacer el programa?
- 📝 El usuario introduce una palabra objetivo, por ejemplo:
"hola"
. - 🎲 El programa genera una población inicial de cadenas aleatorias del mismo tamaño que la palabra objetivo.
- 📊 En cada generación, se evalúa cada cadena con una función de fitness, que mide qué tan parecida es a la palabra objetivo (por ejemplo, cuántas letras coinciden en la posición correcta).
- 👪 Se seleccionan las cadenas más aptas para reproducirse (selección de padres).
- 🔄 Se realiza un cruce (crossover) entre padres para crear nuevos hijos.
- 🎯 A cada nuevo hijo se le puede aplicar una mutación aleatoria (cambiar una letra al azar).
- 🔁 Este proceso se repite generación tras generación hasta que:
- se encuentra la palabra exacta, o
- se alcanza un número máximo de generaciones.
Debes implementar:
- ✅ Una función de fitness que calcula un número que representa qué tan “buena” es una cadena. Por ejemplo:
Objetivo: HOLACadena: HAZAFitness: 3 letras coinciden (H, A, A)
- 🔍 Selección de padres. Puedes usar por ejemplo los 10 mejores individuos de la población.
- 🔗 Cruce (crossover). Combinar dos cadenas, usando por ejemplo mitad y mitad.
- 🎲 Mutación aleatoria: cambia una letra al azar en una cadena con cierta probabilidad.
📈 Muestra la evolución de las generaciones y el número de pasos necesarios para llegar al resultado.