1votos

Árbol de Navidad en F#

por josejuan hace 6 años

Igual que en C# se define un número decimal con algo como 123.45m o en C un entero largo sin signo con algo como 123UL, así en F# podemos hacer que 5N genere un árbol igual que si de un número se tratara.

Escribe una función que dado un entero N, devuelve un árbol de asteriscos de N líneas.

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
(* 
 
   Habitualmente los lenguajes definen formatos específicos 
   para formatear números, por ejemplo: 
 
 
        10.3m       C#          un decimal 
 
        123UL       C           un unsigned long 
 
 
    Aquí, escribimos algo similar que permite definir 
    árboles de Navidad, por ejemplo 
 
        2N          un árbol de 2 niveles 
 
               *** 
 
        5N          un árbol de 5 niveles 
 
               *** 
              ***** 
             ******* 
 
*) 
 
// ============================================== 
module ArbolNavidad 
 
let inline flip f a b = f b a 
 
// Ésta genera un árbol "normal y corrientemente" 
let rec ``Árbol de Navidad`` n = 
        if n = 1 
          then ["*"] 
          else ``Árbol de Navidad`` (n - 1) 
               |> List.map ((+)" ") 
               |> flip List.append [String.replicate (n + n - 1) "*"] 
 
// Ésta permite definir constantes en nuestro código que son árboles de navidad: 
module NumericLiteralN = 
  let FromZero() = "" 
  let FromOne() = "N" 
  let FromInt32 = ``Árbol de Navidad`` 
 
 
 
// ================================================ 
// Por ejemplo, haciendo e imprimiendo un árbol de árboles 
 
for i in ([2N; 4N; 6N] 
          |> List.zip [4; 2; 0] 
          |> List.map (fun (d, w) -> List.map ((+)(String.replicate d " ")) w) 
          |> List.concat) do 
  printfn "%s" i 
 
(* 
         
            *** 
            *** 
           ***** 
          ******* 
            *** 
           ***** 
          ******* 
         ********* 
        *********** 
 
*) 

Comenta la solución

Tienes que identificarte para poder publicar tu comentario.