Celdas interiores de una retícula
Las celdas de una retícula cuadrada se numeran consecutivamente. Por ejemplo, la numeración de la retícula cuadrada de lado 4 es
1 2 3 4 |
1, 2, 3, 4 5, 6, 7, 8 9,10,11,12 13,14,15,16 |
Los números de sus celdas interiores son 6,7,10,11.
Definir la función
1 |
interiores :: Int -> [Int] |
tal que (interiores n) es la lista de los números de las celdas interiores de la retícula cuadrada de lado n. Por ejemplo,
1 2 3 4 5 |
interiores 4 == [6,7,10,11] interiores 5 == [7,8,9,12,13,14,17,18,19] interiores 6 == [8,9,10,11,14,15,16,17,20,21,22,23,26,27,28,29] interiores 2 == [] length (interiores 2018) == 4064256 |
Comprobar con QuickCheck que el número de celdas interiores de la retícula cuadrada de lado n, con n > 1, es (n-2)^2.
Soluciones
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
import Test.QuickCheck import Data.List.Split (divvy) -- 1ª solución interiores :: Int -> [Int] interiores n = [i | i <- [n..n*n-n], i `mod` n > 1] -- 2ª solución interiores2 :: Int -> [Int] interiores2 n = aux [n+1..n^2-n] where aux xss@(x:xs) = take (n-2) xs ++ aux (drop n xss) aux [] = [] -- 3ª solución interiores3 :: Int -> [Int] interiores3 n = concat (divvy (n-2) n [n+2..n*(n-1)-1]) -- 4ª solución interiores4 :: Int -> [Int] interiores4 n = concat [map (+(n*k)) [2..n-1] | k <- [1..n-2]] -- 5ª solución interiores5 :: Int -> [Int] interiores5 n = concat (take (n-2) (iterate (map (+n)) [n+2..2*n-1])) -- La propiedad es prop_interiores :: Int -> Property prop_interiores n = n > 1 ==> length (interiores n) == (n-2)^2 -- La comprobación es -- λ> quickCheck prop_interiores -- +++ OK, passed 100 tests. |