Actualización de «Conjuntos de puntos enteros en regiones rectangulares»
He actualizado las soluciones del ejercicio «Conjuntos de puntos enteros en regiones rectangulares» cuyo enunciado es
Los puntos de una cuadrícula se puede representar mediante pares de números enteros
type Punto = (Int,Int)
y las regiones rectangulares mediante el siguiente tipo de dato
data Region = Rectangulo Punto Punto | Union Region Region | Diferencia Region Region deriving (Eq, Show)
donde
-
(Rectangulo p1 p2)es la región formada por un rectángulo cuyo vértice superior izquierdo esp1y su vértice inferior derecho esp2. -
(Union r1 r2)es la región cuyos puntos pertenecen a alguna de las regionesr1yr2. -
(Diferencia r1 r2)es la región cuyos puntos pertenecen a la regiónr1pero no pertenecen a lar2.
Definir la función
puntos :: Region -> [Punto]
tal que (puntos r) es la lista de puntos de la región r. Por ejemplo, usando las regiones definidas por
r0021, r3051, r4162 :: Region r0021 = Rectangulo (0,0) (2,1) r3051 = Rectangulo (3,0) (5,1) r4162 = Rectangulo (4,1) (6,2)
se tiene
λ> puntos r0021 [(0,0),(0,1),(1,0),(1,1),(2,0),(2,1)] λ> puntos r3051 [(3,0),(3,1),(4,0),(4,1),(5,0),(5,1)] λ> puntos r4162 [(4,1),(4,2),(5,1),(5,2),(6,1),(6,2)] λ> puntos (Union r0021 r3051) [(0,0),(0,1),(1,0),(1,1),(2,0),(2,1),(3,0),(3,1),(4,0),(4,1),(5,0),(5,1)] λ> puntos (Diferencia r3051 r4162) [(3,0),(3,1),(4,0),(5,0)] λ> puntos (Union (Diferencia r3051 r4162) r4162) [(3,0),(3,1),(4,0),(5,0),(4,1),(4,2),(5,1),(5,2),(6,1),(6,2)]
Usando la función enRegion, que verifica si un punto pertenece a una región, definida en un ejercicio anterior por
enRegion :: Punto -> Region -> Bool enRegion (x,y) (Rectangulo (x1,y1) (x2,y2)) = x1 <= x && x <= x2 && y1 <= y && y <= y2 enRegion p (Union r1 r2) = enRegion p r1 || enRegion p r2 enRegion p (Diferencia r1 r2) = enRegion p r1 && not (enRegion p r2)
comprobar con QuickCheck que (enRegion p r) es equivalente a (p elem puntos r).
Nota: Puedes consultar las soluciones aquí.