0votos

imprimir una piramide de @ que este rodeada de asteriscos en Haskell

por josejuan hace 3 años

Sigo sin entender lo de los ciclos. Aquí se resuelve exactamente y únicamente el desafío propuesto.

que un usuario ingrese un numero y el programa imprima una piramide: * *@* *@@@* *********

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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
import Data.List 
 
-- De forma similar al juego de la vida de Conway, podemos hacer "crecer" 
-- nuestro triángulo como si fuera una planta usando las siguientes reglas: 
rule "*@*" = '*' 
rule "*@@" = '*' 
rule "@@*" = '*' 
rule "@@@" = '@' 
rule     _ = ' ' 
 
-- Donde, dado un "suelo" (ej. " *@@@* ") crece el siguiente nivel (ej. "  *@*  ") 
grow = map (rule.take 3) . tails 
 
-- Acumular cada nivel para obtener una planta entera, es escanear sucesivamente: 
growAll n | n < 1     = [] 
          | n < 2     = [" *"] 
          | otherwise = scanr (\_ a -> ' ':grow a) (" *"++take (n-2) (repeat '@')++"*") [2..(n + 1) `div` 2] 
 
-- Y como se desea un "substrato" de asteriscos, sólo es ponerlo 
plantTree n = growAll (n - 2) ++ [['*'|_<-[1..n]]] 
 
 
 
 
 
 
 
{- Por ejemplo: 
 
*Main> let putTree = mapM_ putStrLn . plantTree 
*Main> mapM_ (\n -> putStr "\n" >> putTree n >> putStr "\n") [1..10] 
 
 
 
** 
 
 
*** 
 
 
 ** 
**** 
 
 
 *@* 
***** 
 
 
  ** 
 *@@* 
****** 
 
 
  *@* 
 *@@@* 
******* 
 
 
   ** 
  *@@* 
 *@@@@* 
******** 
 
 
   *@* 
  *@@@* 
 *@@@@@* 
********* 
 
 
    ** 
   *@@* 
  *@@@@* 
 *@@@@@@* 
********** 
 
*Main> 
 
-} 

Comenta la solución

Tienes que identificarte para poder publicar tu comentario.