[OT] Duelo: El juego de Euler (1)

Bueno… Está por ahí Quique, que como se aburre se ha decidido a picarme un poco (pobre mortal ^_^).

Se ve que junto con Álex se han embarcado en resolver los problemas de Euler en distintos lenguajes… Álex se ha quedado con F# (el patito desconocido de .NET), mientras que Quique se ha armado con todo el poder de (mi amado) C#.

Dado que Toni Recio se ha sumado y ha pillado Javascript (quien lo ha visto y quien lo ve) yo he decidido participar, pero esta vez armado con todo el potencial de un lenguaje de programación funcional de verdad. Y el elegido ha sido Scala.

Cada post que haga con la solución aprovecharé para intentar comentar algo de Scala. Ya, Scala no es .NET, pero lo pongo en este blog porque no tengo otro y me da muuuucha pereza abrirlo. Así que… :p

Bueno, al tajo. El primer reto es sencillo (si todos son así, vamos bien): Sumar todos los números del 1 al 1000 que sean divisibles entre 3 ó entre 5. Pues al tajo:

package duel.Euler

object Euler1 extends App {

      println(

          (1 until 1000).filter(n=> (n % 3 == 0) || (n % 5 ==0 )).foldLeft(0)(_+_)

      );

}

¡Listos!

Si conocéis LINQ no hay mucho que añadir:

  1. La construcción (1 until 1000) es equivalente a Enumerable.Range
  2. filter es nuestro amado Where
  3. foldLeft equivale al Aggregate de LINQ. Usado con la sintaxis (_+_) equivale al Sum() de LINQ.

Y que narices es esto de foldLeft

Pues bien, foldLeft es una función existente en todas las colecciones de Scala que básicamente permite ejecutar una función que acepte dos parámetros (que serán sacados iterando por la colección). Además foldLeft proporciona un valor inicial.

La sintaxis básica de foldLeft es:

coleccion.foldLeft(valor_inicial) función_a_ejecutar

En nuestro caso está claro:

  1. La colección son los números de 1 a 1000 que son divisibles entre 3 ó 5
  2. El valor inicial es 0
  3. La función a ejecutar es (_+_). Esta es una sintaxis especial de Scala que equivale a una función anónima que suma los dos operandos que se le pasan.

De hecho un código totalmente equivalente hubiese sido usar foldLeft(0)((a,b) => a+b). En este caso estamos pasando la función a usar (sumar los dos operandos) de forma más explícita.

Listos para el siguiente reto 😉

Un comentario en “[OT] Duelo: El juego de Euler (1)”

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *