Entradas

Mostrando entradas de mayo, 2014

Construcción de torres. Elixir

Recientemente un compañero me planteó el siguiente problema. Un problema ideal para hacer una kata con Elixir… Enunciado Hay que construir todas las torres posibles de altura n apilando piezas que son idénticas en todo menos en la altura. La altura de las piezas es 1, 2, 3, 4… y hay infinitas piezas. La torre se construye apilando una pieza encima de otra, no hay varias piezas en el mismo nivel. ¿Para una altura  n , cuantas torres diferentes se pueden construir? Ejemplos Torre altura 1  1 Torre altura 2  1 1 2 _ Torre altura 3  1 1 1 2 _ 1 1 2 _ 3 _ _ Para construir todas las torres, tenemos que buscar un procedimiento ordenado. Procedimiento contrucción torres Ejemplo construcción torre altura 3  1 .... 1 .... 1 111 2 12_ 2 .... 1 2_1 3 3__ Ejemplo construcción torre altura 4  1 .... 1 .... 1 .... 1 1111 2 112_ 2 .... 1

Collazt. Algoritmo sencillo Elixir.

Imagen
Se trata de buscar la secuenca de Collazt más larga para números inferiores a 1_000_000. http://projecteuler.net/problem=14 Una se cuencia de Collazt para un número  n  se genera… n → n/2 (n is even) n → 3n + 1 (n is odd) Solución directa La secuencia la podemos generar en  Elixir … defmodule Collazt do def generate_serie n do ( generate_serie [], n ) |> Enum . reverse end defp generate_serie serie , 1 do [ 1 | serie ] end defp generate_serie serie , n do if rem ( n , 2 ) == 0 do generate_serie [ n | serie ], div ( n , 2 ) else generate_serie [ n | serie ], 3 * n + 1 end end end Aquí tenemos una horrible repetición de código en que podemos quitar fácilmente gracias a que en Elixir  todos son expresiones. defp generate_serie serie , n do next = if ( rem n , 2 ) == 0