Buscaminas

El buscaminas es un juego cuyo objetivo es despejar un campo de minas sin detonar ninguna.

El campo de minas se representa mediante un cuadrado con NxN casillas. Algunas casillas tienen un número, este número indica las minas que hay en todas las casillas vecinas. Cada casilla tiene como máximo 8 vecinas. Por ejemplo, el campo 4×4 de la izquierda contiene dos minas, cada una representada por el número 9, y a la derecha se muestra el campo obtenido anotando las minas vecinas de cada casilla

de la misma forma, la anotación del siguiente a la izquierda es el de la derecha

En el ejercicio se usará la librería Data.Matrix, cuyo manual se encuentra en aquí.

Los campos de minas se representan mediante matrices:

Por ejemplo, los anteriores campos de la izquierda se definen por

Definir la función

tal que (buscaminas c) es el campo obtenido anotando las minas vecinas de cada casilla. Por ejemplo,

Soluciones

[schedule expon=’2017-04-21′ expat=»06:00″]

  • Las soluciones se pueden escribir en los comentarios hasta el 21 de abril.
  • El código se debe escribir entre una línea con <pre lang=»haskell»> y otra con </pre>

[/schedule]

[schedule on=’2017-04-21′ at=»06:00″]

[/schedule]

Número de islas rectangulares de una matriz

En este problema se consideran matrices cuyos elementos son 0 y 1. Los valores 1 aparecen en forma de islas rectangulares separadas por 0 de forma que como máximo las islas son diagonalmente adyacentes. Por ejemplo,

Definir la función

tal que (numeroDeIslas p) es el número de islas de la matriz p. Por ejemplo,

Soluciones

[schedule expon=’2017-03-15′ expat=»06:00″]

  • Las soluciones se pueden escribir en los comentarios hasta el 15 de marzo.
  • El código se debe escribir entre una línea con <pre lang=»haskell»> y otra con </pre>

[/schedule]

[schedule on=’2017-03-15′ at=»06:00″]

[/schedule]

Elementos que respetan la ordenación

Se dice que un elemento x de una lista xs respeta la ordenación si x es mayor o igual que todos lo que tiene delante en xs y es menor o igual que todos lo que tiene detrás en xs. Por ejemplo, en la lista lista [3,2,1,4,6,5,7,9,8] el número 4 respeta la ordenación pero el número 5 no la respeta (porque es mayor que el 6 que está delante).

Definir la función

tal que (respetuosos xs) es la lista de los elementos de xs que respetan la ordenación. Por ejemplo,

Comprobar con QuickCheck que para cualquier lista de enteros xs se verifican las siguientes propiedades:

  • todos los elementos de (sort xs) respetan la ordenación y
  • en la lista (nub (reverse (sort xs))) hay como máximo un elemento que respeta la ordenación.

Soluciones

Sucesión de sumas de dígitos

Definir la lista

cuyos elementos son los términos de la sucesión a(n) definidos por a(0) = 1 y, para n ≥ 1, a(n) es la suma de los dígitos de todos los términos precedentes. Por ejemplo,

Soluciones

[schedule expon=’2016-06-09′ expat=»06:00″]

  • Las soluciones se pueden escribir en los comentarios hasta el 09 de junio.
  • El código se debe escribir entre una línea con <pre lang=»haskell»> y otra con </pre>

[/schedule]

[schedule on=’2016-06-09′ at=»06:00″]

[/schedule]

Números con un segmento divisible por su longitud

El número 5671 tiene la curiosa propiedad de tener un único segmento divisible por su longitud. En efecto, los segmentos de 5671 son 5, 6, 7, 1, 56, 67, 71, 567, 671 y 5671 y de ellos sólo el 56 es divisible por 4 (que es la longitud de 5671).

Un número de 3 dígitos con la misma propiedad es el 104, ya que su único segmento divisible por 3 es 0.

Un número de 7 dígitos con la misma propiedad es el 1132451, ya que su único segmento divisible por 7 es 245.

Definir las funciones

tales que

  • (conUnicoSegmentoDivisible x) se verifica si x tiene un único segmento divisible por la longitud de x. Por ejemplo,

  • sucUnicoSegmentoDivisible es la sucesión de los números x tales que x tiene un único segmento divisible por la longitud de x. Por ejemplo,