Coding4fun na Way2
Na Way2 a gente passa tanto tempo desenvolvendo software para web que as vezes esquecemos o quanto é desafiador ter que resolver um problema com algoritmos complexos.
Estamos prontos para criar código testável, inverter o controle injetando dependências, fazer mágicas com javascript e domar o hibernate como ninguém, mas tenho notado um certo delay nas poucas tasks que envolvem criação de algoritmos mais sofisticados. O problema é justamente esse, no tipo de software que a gente produz temos poucas situações onde isso é necessário, mas são os pontos mais importantes na diferenciação de nossos produtos.
Para manter nossas habilidades em algoritmos e ao mesmo tempo sanar nossa vontade de resolvê-los, criamos uma nova prática na Way2 que chamamos de “Coding4fun” (sim, o nome é cópia descarada do Channel9).
Como funciona?
A cada sprint a gente define alguns algoritmos para resolver. Cada um cria um gist com suas versões e discutimos as diferentes maneiras de resolver os problemas.
Esse primeiro sprint fizemos os três primeiros problemas do Project Euler, só para esquentar os motores.
Por exemplo: “Add all the natural numbers below one thousand that are multiples of 3 or 5.”
O Bassani resolveu usando linq. Achei que ficou bem elegante:
1 2 3 4 5 6 7 8 |
public class Problema1 { public int Resolva() { return Enumerable.Range(3, 997) .AsParallel() .Where(i => i % 3 == 0 || i % 5 == 0) .Sum(); } } |
Já o Marcel fez com Ruby, o que já dá outra cara:
[ruby]
limit = 1000
sum = 0
(1…limit).each { |v| sum += v if v%3 == 0 || v%5 == 0 }
puts sum
[/ruby]
A Dri já usou uma abordagem mais procedural:
1 2 3 4 5 6 7 8 9 |
public static void Problema1() { int soma = 0; for (int i = 3; i < 1000; i++) { if ((i % 3 == 0) || (i % 5 == 0)) { soma += i; } } Console.WriteLine(soma); } |
A próxima rodada já vai ser diferente, vamos fazer um único algoritmo (mais difícil) e cada um vai resolvê-lo em c# (nossa linguagem do dia-a-dia) e em outra linguagem de sua escolha. Vai ser bem interessante ver em quanto a linguagem vai nos influenciar na maneira de resolver o problema.
E você, gosta de algoritmos? Como resolveria esse aí?