Ir al contenido principal

Anagramas


Una palabra es una anagrama de otra si se puede obtener permutando sus letras. Por ejemplo, mora y roma son anagramas de amor.

Definir la función

anagramas :: String -> [String] -> [String]

tal que (anagramas x ys) es la lista de los elementos de ys que son anagramas de x. Por ejemplo,

λ> anagramas "amor" ["Roma","mola","loma","moRa", "rama"]
["Roma","moRa"]
λ> anagramas "rama" ["aMar","amaRa","roMa","marr","aRma"]
["aMar","aRma"]

Leer más…

Primos consecutivos con media capicúa


Definir la función

primosConsecutivosConMediaCapicua :: [(Int,Int,Int)]

formada por las ternas (x,y,z) tales que x e y son primos consecutivos cuya media, z, es capicúa. Por ejemplo,

λ> take 5 primosConsecutivosConMediaCapicua
[(3,5,4),(5,7,6),(7,11,9),(97,101,99),(109,113,111)]

Calcular cuántos hay anteriores a 2014.


Leer más…

Mastermind


El Mastermind es un juego que consiste en deducir un numérico formado por una lista de números distintos. Cada vez que se empieza una partida, el programa debe elegir un código, que será lo que el jugador debe adivinar en la menor cantidad de intentos posibles. Cada intento consiste en una propuesta de un código posible que propone el jugador, y una respuesta del programa. Las respuestas le darán pistas al jugador para que pueda deducir el código.

Estas pistas indican cuán cerca estuvo el número propuesto de solución a través de dos valores: la cantidad de aciertos es la cantidad de dígitos que propuso el jugador que también están en el código en la misma posición. La cantidad de coincidencias es la cantidad de digitos que propuso el jugador que también están en el código pero en una posición distinta.

Por ejemplo, si el código que eligió el programa es el [2,6,0,7], el jugador propone el [1,4,0,6], el programa le debe responder acierto (el 0, que está en el código original en el mismo lugar, tercero), y una coincidencia (el 6, que también está en el original, pero en la segunda posición, no en el cuarto como fue propuesto). Si el jugador hubiera propuesto el [3,5,9,1], habría obtenido como respuesta ningún acierto y ninguna coincidencia, ya que no hay números en común con el código original, y si se obtienen cuatro aciertos es porque el jugador adivinó el código y ganó el juego.

Definir la función

mastermind :: [Int] -> [Int] -> (Int,Int)

tal que (mastermind xs ys) es el par formado por los números de aciertos y de coincidencias entre xs e ys. Por ejemplo,

mastermind [2,6,0,7] [1,4,0,6]  ==  (1,1)
mastermind [2,6,0,7] [3,5,9,1]  ==  (0,0)
mastermind [2,6,0,7] [1,6,0,4]  ==  (2,0)
mastermind [2,6,0,7] [2,6,0,7]  ==  (4,0)

Leer más…

Determinación de los elementos minimales


Definir la función

minimales :: Eq a => [[a]] -> [[a]]

tal que (minimales xss) es la lista de los elementos de xss que no están contenidos en otros elementos de xss. Por ejemplo,

minimales [[1,3],[2,3,1],[3,2,5]]        ==  [[2,3,1],[3,2,5]]
minimales [[1,3],[2,3,1],[3,2,5],[3,1]]  ==  [[2,3,1],[3,2,5]]

Leer más…

La bandera tricolor


El problema de la bandera tricolor consiste en lo siguiente: Dada un lista de objetos xs que pueden ser rojos, amarillos o morados, se pide devolver una lista ys que contiene los elementos de xs, primero los rojos, luego los amarillos y por último los morados.

Definir el tipo de dato Color para representar los colores con los constructores R, A y M correspondientes al rojo, azul y morado y la función

banderaTricolor :: [Color] -> [Color]

tal que (banderaTricolor xs) es la bandera tricolor formada con los elementos de xs. Por ejemplo,

bandera [M,R,A,A,R,R,A,M,M]  ==  [R,R,R,A,A,A,M,M,M]
bandera [M,R,A,R,R,A]        ==  [R,R,R,A,A,M]

Leer más…

Ordenación por el máximo


Definir la función

ordenadosPorMaximo :: Ord a => [[a]] -> [[a]]

tal que

ghci> ordenadosPorMaximo [[3,2],[6,7,5],[1,4]]
[[3,2],[1,4],[6,7,5]]
ghci> ordenadosPorMaximo ["este","es","el","primero"]
["el","primero","es","este"]

Leer más…

Iguales al siguiente


Definir la función

   igualesAlSiguiente :: Eq a => [a] -> [a]

tal que (igualesAlSiguiente xs) es la lista de los elementos de xs que son iguales a su siguiente. Por ejemplo,

   igualesAlSiguiente [1,2,2,2,3,3,4]  ==  [2,2,3]
   igualesAlSiguiente [1..10]          ==  []

Leer más…

Ejercicios del curso 2013-14

Como se comenta en la presentación del blog, su objetivo es complementar el curso de Informática proponiendo un ejercicio diario teniendo en cuenta lo que se ha estudiado hasta ese momento.

Para situar los ejercicios en su contexto se debe de tener presente

  • la página del curso en la que se encuentra los temas, las relaciones de ejercicios y los exámenes;
  • el diario de clases en la que se resume el contenido de cada clase.

El cronograma de las clases es el siguiente, donde los temas se representan con T y las relaciones de problemas con R. Por ejemplo,

  • T2 representa que se ha estudiado el tema 2.
  • R1 representa que se ha estudiado la relación 1.
  • T4[1,14] representa que se ha estudiado el tema 4 desde la transparencia 1 a la 24.
  • R2[9,12] representa que se ha estudiado la relación 2 desde la el ejercicio 9 al 12.
Día Contenido
M-24-Sep-13 T2: Introducción a la programación con Haskell.
V-27-Sep-13 R1: Definiciones por composición con aritmética.
M-01-Oct-13 R2[1,8]: Definiciones por composición con listas.
  T4[1,14]: Definiciones de funciones.
V-04-Oct-13 R2[9,12]: Definiciones por composición con listas.
  R3[1,5]: Definiciones con condicionales.
M-08-Oct-13 T5[1,13]: Definiciones por comprensión.
  R3[6,19]: Definiciones con condicionales.
11-Oct-13 R4[1,7]: Definiciones por comprensión.
15-Oct-13 R4[8,14]: Definiciones por comprensión.
  Introducción a las gráficas con gnuplot.
18-Oct-13 R4[15,19]: Definiciones por comprensión.
22-Oct-13 T5[14,29]: Código César.
25-Oct-13 R4[20,21]: Definiciones por comprensión.
  R5[1,7]: Definiciones por comprensión.
29-Oct-13 T3: Tipos y clases.
05-Nov-13 Examen 1
08-Nov-13 R5[8,14.1]: Definiciones por comprensión.
12-Nov-13 T6[1,10]: Definiciones por recursión.
19-Nov-13 T6[11,24]: Definiciones por comprensión.
22-Nov-13 R7+R8[1,3]: Definiciones por recursión.
26-Nov-13 R9: Ordenación por mezclas y QuickCheck.
29-Nov-13 R8[4,8]: Definiciones por recursión.
  R10[1,5.3]: Definiciones por comprensión y recursión.
03-Dic-13 R10[6,17]: Definiciones por comprensión y recursión.
  R11[1,5]: Definiciones por comprensión y recursión.
10-Dic-13 T7[1,23]: Funciones de orden superior.
13-Dic-13 R12[1,5]: Funciones de orden superior.
17-Dic-13 Examen 2
20-Dic-13 R12[6,11]: Funciones de orden superior.
07-Ene-14 T10: Evaluación perezosa.
  T7[23,27]: Cambio de base.
10-Ene-14 R13: Funciones de orden superior (2).
  R14: Funciones sobre cadenas.
14-Ene-14 T7[28,36]: Codificación binaria y transmisión de cadenas.
  R15[1,3.2]: Evaluación perezosa y listas infinitas (1).
17-Ene-14 R15[4,7.5]: Evaluación perezosa y listas infinitas (2).
  R16[1,4.2]: Evaluación perezosa y listas infinitas (3).
-Ene-14 Examen 3
11-Feb-14 T9[1,26]: Declaraciones de tipos y clases.
15-Feb-14 R17[1,2.5]: Evaluación perezosa y listas infinitas.
18-Feb-14 T11: Aplicaciones de la programación funcional.
22-Feb-14 R18+R19[1,6]: Tipos de datos algebraicos.
25-Feb-14 R20: Cálculo numérico.
  R19[7,10]: Árboles binarios.
  R17[3,3]: Triángulo de Pascal.
04-Mar-14 T21[1,41]: El TAD de los polinomios.
07-Mar-14 R22: Combinatoria.
11-Mar-14 T21[41,55]: Operaciones con polinomios.
  R17[6.1,6.13]: El triángulo de Floyd.
14-Mar-14 R22+R23: Operaciones con polinomios.
18-Mar-14 R17[4,5]: Codificación por longitud y autocontadora.
21-Mar-14 Examen 4
25-Mar-14 T18[1,18]: La librería de las tablas.
28-Mar-14 R26[1,10]: Vectores y matrices.
01-Abr-14 T18[19,19]: El TAD de las tablas.
04-Abr-14 R26[11,24]: Vectores y matrices (2).
08-Abr-14 T22[1,39]: Grafos.
11-Abr-14 R26: Implementación de grafos con listas.
22-Abr-14 T17[1,29]: El TAD de los conjuntos.
  R27[1,4]: Ejercicios sobre grafos.
25-Abr-14 R27[5,22]: Ejercicios sobre grafos.
29-Abr-14 Exercitium: Ejercicios del 21 al 25 de abril.
13-May-14 R28: Operaciones con conjuntos.
  R29: Relaciones binarias.
16-May-14 Examen 5
20-May-14 Programación de dibujos con Gloss
27-May-14 Programación de fractales.
03-Jun-14 Programación de fractales.
06-Jun-14 Relación con dibujos y fractales.

Exercitium (Un reto diario de programación)

La programación informática, como cualquier disciplina creativa, requiere estudio y práctica constantes. Este blog publica ejercicios de programación diariamente para que los programadores, independientemente de su nivel de experiencia, puedan mantener y perfeccionar sus habilidades, explorando soluciones más allá de sus zonas de confort habituales.

Objetivo y enfoque

Estos ejercicios no constituyen un concurso. Fueron originalmente diseñados para los estudiantes de la asignatura de Informática de 1º del Grado en Matemáticas. No se otorgan puntuaciones ni se mantiene un registro de quienes los completan. La verdadera recompensa es el conocimiento adquirido y la mejora de tus habilidades como programador.

Cada ejercicio está concebido para resolverse en aproximadamente quince minutos, aunque el tiempo real puede variar desde unos pocos minutos hasta varias horas, dependiendo de la experiencia individual, la creatividad y los recursos disponibles.

Antes de consultar las soluciones propuestas, te recomendamos intentar resolver el ejercicio por tu cuenta. Una vez completado, podrás comparar tu enfoque con las soluciones sugeridas.

Múltiples soluciones y enfoques

No existe una única solución "correcta" o perfecta para ejercicios. De hecho, te animamos a explorar diferentes enfoques una vez completado un ejercicio: puedes intentarlo con un algoritmo distinto o utilizando otro lenguaje de programación. También puedes compartir y discutir tus soluciones en Mastodon o en Bluesky.

La mayoría de las soluciones propuestas están implementadas en Haskell. Sin embargo, estos ejercicios son una excelente oportunidad para:

  • Perfeccionar tus habilidades en tu lenguaje de programación habitual
  • Aprender un nuevo lenguaje de programación
  • Comparar implementaciones en diferentes lenguajes

Recursos adicionales

Si eres estudiante principiante, especialmente si estás aprendiendo Haskell como primer lenguaje, te recomendamos consultar Programación funcional con Haskell. Este material ha sido la base del primer curso de informática en el Grado en Matemáticas de la Universidad de Sevilla durante muchos años.

Todas las soluciones están disponibles en GitHub como un proyecto con Stack, lo que evita problemas de compatibilidad entre diferentes versiones de las bibliotecas utilizadas.

Puedes suscribirte al canal RSS de este blog en https://jaalonso.github.io/exercitium/rss.xml.