0votos

Cuadrado de carácteres en Haskell

por josejuan hace 3 años

Por construcción y por definición. Después se valida (testea) automáticamente (y empíricamente) que son equivalentes.

Crear un programa que lea un número y a partir de él cree un cuadrado de carácteres con ese tamaño. Los carácteres del borde deben ser diferentes a los del interior.

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
-- Generando el cuadrado por construcción 
construcción _ x 1 = x ++ "\n" 
construcción i x n = let r   = concat . take (n - 2) . repeat 
                         w c = x ++ r c ++ construcción i x 1 
                     in  w x ++ r (w i) ++ w x 
 
-- Generando el cuadrado por definición de celda 
definición i e n = concat [c x y| y <- s, x <- s] 
                   where s = [1..n] 
                         c x y | x == n                  = e ++ "\n" 
                               | x > 1 && y > 1 && y < n = i 
                               | otherwise               = e 
 
{- 
 
    Verificando equivalencia de las funciones 
     
     
    > :m + Test.QuickCheck 
    > :{ 
       | let comparar i x n | n < 1     = comparar i x (1 + abs n) 
       |                    | otherwise = construcción i x n == definición i x n 
       | :} 
    > quickCheck (comparar ":" "*") 
    +++ OK, passed 100 tests. 
     
     
     
    Generando cuadrados 
    > mapM_ (putStrLn . definición ":" "*") [1..5] 
 
    ** 
    ** 
 
    *** 
    *:* 
    *** 
 
    **** 
    *::* 
    *::* 
    **** 
 
    ***** 
    *:::* 
    *:::* 
    *:::* 
    ***** 
     
    > _ 
     
-} 

Comenta la solución

Tienes que identificarte para poder publicar tu comentario.