0votos

Diamante de asteriscos en Haskell

por josejuan hace 4 años

Es posible definir un único predicado para determinar la pertenencia al diamante o no de una coordenada dada.

Escribir una función que permita dibujar un diamante de asteriscos con la opción de sólo el contorno o todo el 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
diamonds :: Int -> Bool -> [String] 
diamonds n f = [[ cell $ c <= 0 && (x+n) .&. 1 /= y .&. 1 && f || c == 0 
                    | x <- w, let c = abs x + abs y - n + 1] 
                    | let w = [-n+1 .. n-1], y <- w        ] 
 
-- Caracteres a usar 
cell False = ' ' 
cell True  = '*' 
 
 
 
-- Por ejemplo, para imprimir 2*n diamantes: 
main = forM_ [1..5]   $ 
       \n -> putStrLn $ 
             unlines  $ 
             zipWith (\a b -> a ++ "   " ++ b) 
                     (diamonds n True) 
                     (diamonds n False) 
{-- 
 
*   * 
 
 *     *  
* *   * * 
 *     *  
 
  *       *   
 * *     * *  
* * *   *   * 
 * *     * *  
  *       *   
 
   *         *    
  * *       * *   
 * * *     *   *  
* * * *   *     * 
 * * *     *   *  
  * *       * *   
   *         *    
 
    *           *     
   * *         * *    
  * * *       *   *   
 * * * *     *     *  
* * * * *   *       * 
 * * * *     *     *  
  * * *       *   *   
   * *         * *    
    *           *     
 
--} 

Comenta la solución

Tienes que identificarte para poder publicar tu comentario.