“Code Golf” con Ruby

“Code Golf” es el arte de escribir código utilizando el menor número de caracteres posibles. La idea es originaria del mundo Perl (“Perl Golf), aunque en Ruby también se pueden conseguir muy buenos resultados.

La obsesión por tratar de minimizar el número de bytes utilizados en un programa proviene de tiempos pasados, cuando la memoria era un bien escaso y cada byte era importante. En realidad hoy en día esto no tiene demasiado sentido, pero esto no quiere decir que no se haga. Un ejemplo podrían ser las competiciones 1k de JavaScript o Perl Apocalypse.

Desafortunadamente, el código que se produce en este tipo de competiciones a menudo es muy difícil de entender, ya que por lo general se basa en el uso de diversos hacks y accesos directos. La idea de este post es recoger algunas técnicas para lograr disminuir el número de caracteres utilizados en nuestro código pero sin perder la legibilidad del mismo.

Prerequisitos:

  • Un equipo con Ruby instalado.

Tips:

Veamos algunos consejos para reducir el tamaño de nuestro código Ruby:

  • Asignación masiva Casi todo el mundo conoce esta técnica, la idea es inicializar todas las variables en la misma línea.
  • Crear arrays utilizando la notación %w Podemos crear arrays de strings de la siguiente forma:
  • Utilizar el operador ternario para las operaciones lógicas
  • Utilizar el operador ternario de forma encadenada
  • Usar la notación científica para números grandes Si vas a usar números grandes mejor escribir 1e6 que 1000000.
  • Usar “->” para las expresiones lambdasDesde ruby 1.9 podemos utilizar “->” para la sintaxis de las expresiones lambdas en vez de la palabra reservada “lambda”.
  • Usar “Map” para iterarLos iteradores suelen ser mejores que los bucles, y “map” es mejor que “each”, no solo porque tiene menos caracteres sino porque además crea una nueva proyección del contenido iterado.

Ejemplo:

Para finalizar, a modo de ejemplo, voy a escribir un método que recibe por parámetro dos números y calcula la suma de todos los múltiplos del primer número hasta el valor del segundo parámetro. Sum(3, 14) calculará la suma de todos los múltiplos de 3 hasta 14 (3 + 6 + 9 + 12 = 30).

Primeros pasos con Ruby

Este artículo va a ser el primero de una serie de entradas dedicadas al aprendizaje del lenguaje Ruby. Nos centraremos en los aspectos básicos y levantaremos una pequeña aplicación web utilizando el framework Sinatra.

¿Qué es Ruby?

Ruby es un lenguaje de programación orientado a objetos simple pero muy potente. Fue creado en 1995 por Yukihiro ‘Matz’ Matsumoto, desde entonces Ruby ha atraído a desarrolladores de todo el mundo. En el 2006, Ruby alcanzó reconocimiento masivo, gracias a Rails su framework web por excelencia.

Instalando Ruby

La instalación de Ruby es bastante sencilla, se realiza de forma diferente dependiendo del sistema operativo utilizado.
Si usas linux, te recomiendo que uses Ruby Version Manager (RVM). Para ello pega la siguiente linea de código en tu terminal:

En caso de usar windows lo ideal es usar Ruby Installer. Esta aplicación es un instalador que nos permite instalar Ruby con todo lo que necesitas a través de un asistente.
Si usas Mac puedes usar RVM al igual que en linux, o usando Homebrew , con el siguiente comando:

Para comprobar que todo funciona correctamente, abrimos la terminal y escribimos lo siguiente:

Esto comprueba la versión de ruby que tenemos instalada:

 

Probando la consola interactiva de Ruby

La consola interactiva de Ruby, también conocida como IRB, nos permite experimentar de manera rápida con Ruby. Para ello accedemos a la terminal y ejecutamos lo siguiente:

Debería aparecer algo similar a esto:

Una vez que estamos en la IRB vamos a escribir nuestro primer “hello world” en Ruby, para ello escribiremos lo siguiente:

Salida:

Para salir de la consola interactiva tan solo tenemos que escribir el comando exit.

Escribiendo nuestro primer fichero Ruby

Una vez que hemos escrito nuestro primer trozo de código Ruby en IRB, es el momento de aprender a almacenar nuestro trabajo en un archivo. Para empezar vamos a crear un fichero de texto y lo vamos a guardar como “hello_ruby.rb”, y luego escribimos lo siguiente:

Esto es lo mismo que hemos escrito en la IRB, la diferencia es que la IRB evalúa el código al pulsar enter, y para ejecutar este programa debemos usar el comando “Ruby”. Para ello volvemos a la consola, nos situamos en el directorio en el cual se encuentra nuestro fichero y escribimos lo siguiente:

Debería producirse la siguiente salida:

 

Las gemas de Ruby

Las gemas de Ruby son librerías de código que ayudan a extender Ruby añadiéndole nuevas funcionalidades. Normalmente están escritas en Ruby, aunque algunas veces se usan otros lenguajes como C. Existen miles de gemas disponibles que nos pueden ayudar añadir todo tipo de funcionalidad a nuestros programas.

Sinatra, toma de contacto

Sinatra es una gema, que nos facilita la creación de aplicaciones web, de forma sencilla y muy ligera.
Antes que nada debemos instalar esta gema, para ello nos vamos a la consola y escribimos lo siguiente:

Volvamos a nuestro fichero “hello_ruby” y escribamos lo siguiente:

get ‘/hello’ do
“Hello Sinatra!”
end

“require ‘sinatra'” se usa para cargar la gema sinatra, añadiendo de esta manera añadimos sus funcionalidades a nuestro programa.
La siguiente parte del programa es lo que se conoce en Sinatra como un “manejador” de rutas. El funcionamiento de nuestro código es sencillo, cuando hagamos una petición get HTTP a la ruta “/hello” nuestro programa nos devolverá en el navegador “hello sinatra!”. Vamos a ejecutar nuestro programa para ver que sucede:

Resultado:

Ahora nos vamos a nuestro navegador y escribimos localhost:4567/hello. Si todo ha salido bien podremos ver nuestra aplicación web funcionando.

Recursos

Existe una gran cantidad de recursos para el aprendizaje de Ruby. A continuación se muestra una pequeña selección que he encontrado particularmente útil.

En resumen

En esta primera entrada de esta serie hemos introducido el lenguaje de programación Ruby de manera muy superficial, seguiremos profundizando en próximas entradas. Happy coding!