0votos

Árbol de Navidad en Scala

por josejuan hace 6 años

Seguro que puede poner más bonito usando operadores.

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

1
def arbol(n: Int):String = 1.until(n + 1).map(q => 1.until(n + q).foldLeft("")((s, c) => s + (if(c <= n - q) ' ' else '*'))).foldLeft("")(_ + _ + '\n') 
6 comentarios
0votos

Escrito por ebrasca hace 6 años

¿Me lo podrías explicar?
0votos

Escrito por josejuan hace 6 años

// devolverá un árbol de N filas
def arbol(n: Int): String =

   // desde 1 hasta N
   1.until(n + 1).

      map(q =>

         // desde 1 hasta N + Q - 1
         1.until(n + q).

            // acumular espacios y asteriscos
            foldLeft("")( (s, c) => s + (if(c <= n - q) ' ' else '*'))

      ).

      // acumular las líneas
      foldLeft("")(_ + _ + '\n') 
0votos

Escrito por ebrasca hace 6 años

Gracias por la respuesta.
Opino que seria mas adecuado 1.to(n) en vez de 1.until(n + 1)

Me pase un tiempo intentando entender (no me llevo muy bien con los tutoriales en ingles)
"foldLeft("")( (s, c) => s + (if(c <= n - q) ' ' else '*')"

Me entretuvo un buen tiempo en crear una solución mas entendible desde mi punto de vista
def arbol1(n: Int): String =
1.to(n).
map(q => " " * (n - q) "" (1 2 * (q - 1))).
foldLeft("")( '\n')

Espero no molestar.
0votos

Escrito por josejuan hace 6 años

"Espero no molestar."

¡Claro que no! opina y comenta siempre que quieras, cuanto más incisivo seas en tus apreciaciones más aprenderemos todos ;)

No se Python (bueno, se como es, he leído sus especificaciones, etc..., pero no lo uso nunca), por lo que sí probablemente hubiera sido mejor

  1.to(n)

      1.to(n + q - 1)


es habitual encontrar soluciones (muchas de las mías) que en sí mismas no son las más correctas, pero o bien muestran un aspecto diferente del lenguaje (como alguna en PHP usando ¡lambdas!) o bien son divertidas en una u otra forma.

)
0votos

Escrito por josejuan hace 6 años

"No se Python"

Igual con Scala ;)
0votos

Escrito por ebrasca hace 6 años

Perdona pero aun no manejo esto de los comentarios.El código es:
def arbol1(n: Int): String =
    1.to(n).
      map(q => " " * (n - q) + "*" * (1 + 2 * (q - 1))).
      foldLeft("")(_ + _ + '\n')

Comenta la solución

Tienes que identificarte para poder publicar tu comentario.