Tenemos Ganador al Juego de Fibonacci!!

Lo primero.. Gracias a esos 28 pedazo de participantes 🙂 Me lo he pasado genial, de hecho no me creía que se animase tanta gente a participar. Ha sido una pena el problema con algunos antivirus que se han comido las soluciones. Ya lo sabemos, a partir de ahora texto plano con el algoritmo 😀

Por cierto, tomo nota, ha habído un comentario general pidiendo retos más complicados. Este era sencillo y no pedía mucha potencia de calculo, ni tiempo de desarrollo, es para que pudiéséis seguir con vuestras vidas durante el reto 😛  Si es difícil normalmente no hay tanta participación 🙂

Pero lo dicho… tomo nota 😀

Soluciones propuestas

Ha sido muy variopinto, todos los participantes sabían que la solución recursiva tradicional no es más que un algoritmo “de laboratorio” y han planteado diversas soluciones. En C#, vb.net  y hasta en IL 🙂  Aquí os destaco los algoritmos más utilizados…

Algoritmo Recursivo con cache

El de toda la vida, pero guardando cada calculo en un Dictionary, por ejemplo, de modo que cada nueva llamada resultará en una suma de valores  precalculados en el Dictionary.

Sumas basadas en arrays

Se sustituye la llamada recursiva por una iteración donde se van sumando valores en un array.

Sumas con 3 variables

Igual que la anterior, pero se elimina el array, porque realmente solo hacen falta 3 valores. Actual, Anterior1 y Anterior2.

Calculos con el número phi

Estos me pillaron por sorpresa 🙂 Pero cuesta más tiempo hacer el calculo y paralelizarlo que sumar los valores. Habría que verlo para calcular valores más grandes.

Por lo que he visto muchos tienen ya las lambdas de .net como ciudadanos de primer nivel… cada vez más el código .net me recuerda menos a código .net 🙂

 

Al grano, cómo han acelerado el algoritmo?

La mayoría del trabajo de los participantes ha pasado por encontrar el algoritmo más rápido para fibonacci. 

Hay personas que han utilizado la librería de parallels para intentar acelerar un poco el cálculo. ( desafortunadamente, fibonacci tradicional no es la mejor oportunidad para que parallels se luzca. El cálculo esta basado en valores anteriores, de modo que tiene tinte secuencial por naturaleza.

Pero, no solo del algoritmo vive la aplicación…se puede paralelizar:

a)  Ir mostrando el resultado mientras se realiza el cálculo

b)  El cálculo en sí, siempre y cuando no se utilice el método secuencial. Por ejemplo los que utilizan el cálculo con phi, si hacen un Parallel.For para calcular los valores por separado.

Posiblemente para valores más grandes Parallels hubiese marcado la diferencia. )

Pero el tiempo total no era sólo el tiempo del algoritmo, de hecho era lo mínimo en la mayoría de los casos…al ser un número tan bajo, la mayoría del tiempo se invierte en presentar los valores al usuario. De modo que ahí es donde se ha marcado la diferencia.

Las soluciones pasaban por presentar strings por consola en cada iteración, concatenar con stringbuilder antes de presentar por pantalla, sacar los valores a un archivo de texto… y la inesperada aproximación del ganador.

Utilizando el mismo algoritmo que muchos participantes, la diferencia ha sido abismal, mirad algunos de los tiempos ( al final del post podéis ver como he hecho las pruebas):

4  – 187141

3  – 179870

2 –   16186   ( diferencia de usar un archivo en lugar de la consola )

1 –     959

 

Venga… cuál es la diferencia ?

La diferencia, ha sido que nuestro Ganador del juego, Jorge Serrano ha utilizado una aplicación Windows Forms para presentar el resultado. Como muestran los timers, el tiempo en mostrar la información por consola requiere mucho mas trabajo que mostrarla en un control de WinForms.

Felicidades Jorge!! te tengo que mandar el detalle, esperamos foto en el blog eh 😀

 

Las pruebas

He sufrido, lo reconozco. La próxima vez tengo que trabajar más en la descripción del reto O=)

Primero he estandarizado la forma en la que se tomaba el tiempo..de modo que he plantado Stopwatch por vuestro código.. Start justo al empezar el algoritmo y stop justo al acabar la visualización. He medido el valor de ElapsedTicks. A los que no tenían visualización les he añadido un for concatenando con stringbuilder.

A los que me habéis enviado varias opciones.. las he probado todas y solo he tenido en cuenta la más rápida.

Para tomar un valor por participante, he tomado la media de  5 ejecuciones en frío de cada algoritmo.

Para la próxima, posiblemente de yo el esqueleto de código e indique dónde hay que rellenar con el algoritmo 😀

 

Gracias y happy monday meetings!!

Momento Coder …. Acelera Fibonacci a tope!!!

Hace mucho que no ponemos ningún reto … a sí que a la carga!!!


Hoy no vamos a hablar ni de empresa, ni de servicios, ni de web ni nada, hoy toca picarse a ver quién es el más rápido!


Recuerdas tus primeros pinitos en la algoritmia? hacer piramides, ordenar números… si? y recuerdas Fibonacci? 😉


No voy a explicarlo de nuevo, la red esta llena de explicaciones y algoritmos de retos de este tipo de cosas. Te propongo un reto, para coders con algo de tiempo ( en casa o en el trabajo )  …



¿Cómo de rápido eres haciendo Fibonacci del 1 al 44? Me explico… tiempo acumulado utilizado en calcular Fibonacci para los números enteros comprendidos entre el 1 y el 44, ambos incluidos 🙂


Ojo, el algoritmo es bien conocido, implementado de una forma más o menos bonita, pero se te ocurre alguna forma de hacer la ejecución más rápida?


Como condición… tiene que compilar con Visual Studio 2008 y ser código .NET ( ahora bien, puedes usar herramientas/librerías instaladas sobre Visual Studio 2008 )


Te parece bien hasta este domingo 22/11/08 a las 6pm en tiempo GMT+1?


Para hacer esto un poco más interesante… habrá un detalle para el más rápido…. a no ser que gane yo 😉


Como el detalle te lo mandaré a casa, me temo que lo tenemos que restringir a los participantes de España ( lo siento por el resto, pero si no, os iba a salir el detalle caro de narices en la aduana :_) )


Los que os animéis… cuando estéis listos podéis enviarme vuestros proyectos / soluciones a david.salgado en microsoft.com


Publicaré el ganador el lunes 13/11/08 23/11/08 (tnx phobeo)


Happy Coding!!!

Interpretar los contenidos del PDC sin agobiarse

¡Que nadie se agobie! 🙂

Hace un par de semanas fue el PDC en los Ángeles, el professional developers conference. En este evento, los grupos de producto de Microsoft nos presentan lo que nos están preparando para el futuro. Futuro a un par de años!!! de modo que nada de agobiarse por aprender C# 4.0 o VB10 ahora mismo. Los que lo estamos haciendo es porque a) Estamos intentando ver la mejor manera posible de contarlo luego, crear documentación, demos… b) Son MUY frikis y lo hacen por hobby 🙂

De todos modos, siguiendo con el ejemplo, si cualquiera queréis probar alguna de las nuevas características de los futuros lenguajes, tenéis disponible en internet una máquina virtual con los bits de Visual Studio 2010. Sinceramente, por ahora creo que a la gran mayoría de la gente no os merece la pena bajarlo, a día de hoy y teniendo en cuenta el tiempo que falta, con leeros el post y ver hacia a donde apuntan las cosas es más que suficiente 🙂

Pero por si acaso… aquí esta el enlace

Download details- Visual Studio 2010 and .NET Framework 4.0 CTP

Volvemos al PDC, como os he comentado, es un evento de tendencias, y como tal creo que hemos de tomarlo, se han dicho muchos nombres, pero a mi me gusta ver el conjunto. En definitiva

¿Qué podemos sacar en claro de todo esto?

Por un lado, con los lanzamientos de Azure y de la infraestructura de Azure Services, vemos que en el mundo del desarrollo nos acercamos hacia la nube, ya sea para alojar nuestras aplicaciones (Azure hosting), nuestros datos (SQL Services), gestión de identidades y relaciones de confianza (Genova, .NET Services)… además de ir asumiendo los modelos de desarrollo y de negocio subyacentes, como desarrolladores, si no lo estamos, nos conviene ir familiarizándonos con la programación REST, el consumo de feeds, la gestión de identidades…

Con OSLO, Quadrant y M..vemos la importancia que se le está dando a las herramientas de Modelado, sabes lo que es un modelo? sabes lo que es Model Driven Development? no?  No te preocupes…aun no sale ni en la wikipedia….casi nadie se maneja en estos términos hoy en día… pero dentro de dos años parece que van a pegar fuerte 🙂  2 años…tenemos tiempo para leer un par de artículos y ver si nos interesa, no?

Muchas sesiones y peso en Visual Studio Team Foundation… ¿qué extraemos? Que la calidad en el proceso de desarrollo de software interesa cada día más, y cuál es el Call To Action que debemos tener? Es sencillo, testing, testing, testing, testing… y metodologías, metodologías y metodologías. Si no haces pruebas en tu código ( ya no digo TDD…digo unas pruebas unitarias e tu código) ponte YA las pilas.

Mejoras en los lenguajes, C#4 y VB10. Puede que a más de uno le piten los oídos con lo que voy a decir y con la forma de simplificar los avances en el lenguaje…lo siento si es así, pero es lo que pienso sinceramente O=)  Para mi todo va en una dirección…normas un poco más laxas para centrarnos en los resultados y no en la forma.

Se añade un tipo de datos nuevo llamado dynamic. Será como int, object, string… De modo que podremos declarar una variable para que su comportamiento sea dinámico. Por ejemplo, simplificará el código las operaciones con lenguajes dinámicos (Python, javascript, Ruby…) más detalles en otro post..

Parámetros opcionales en las funciones. Esta es una funcionalidad nueva de C#. Se había pedido desde hace muuuuucho tiempo, por fin lo han incluido 😉

CoVarianza y ContraVarianza. Para simplificar las operaciones con tipos genéricos y que el compilador se comporte como nosotros esperamos en ciertas situaciones. Entraré más en detalle en el futuros posts.

Mejora de la interoperabilidad con COM. ¿Alguien dudaba de que COM seguía por ahí abajo? 🙂 Se agradece que hayan retomado el tema win32 y que se hagan esfuerzos en mejorar la compatibilidad.

Hubo muchas sesiones sobre el nuevo Visual C++ 10. De hecho una de ellas daba a entender una revolución en el mundo de los desarrolladores C++, igual fue simplemente un buen truco de marketing, pero me quedé con muchas ganas de ver “Microsoft Visual C++: 10 is the new 6” Lo tengo en tareas pendientes.

Windows 7 me sorprendió para bien, mejoras en cuanto a la usabilidad y experiencia de usuario en las tareas más habituales, sobre todo reduciendo el número de clicks para hacer lo que queremos hacer, reducir el número de notificaciones que nos aparecen por pantalla, etcétera… Se añaden características muy interesantes para el mundillo profesional, montar vhd’s como discos duros en el storage manager, poder habilitar bitlocker en llaves USB y discos duros externos, trabajar con remote desktop en múltiples pantallas… Pero lo más importante en mi opinión, es que emantiene la compatibilidad con vista (mismos drivers y mismas aplicaciciones) de modo que si te funciona con Vista o con XP… te funcionará con Windows 7 y de hecho, por lo que vimos, te funcionará más rápido 😉

Podríamos seguir poniendo nombres durante muchas páginas, pero creo que estos han sido los lanzamientos más importantes, como he dicho al principio… no os lancéis a aprender estas cosas todavía! leed entre líneas e id alineando vuestro trabajo/aprendizaje con la tendencia, no con el producto en concreto 😉

Si alguno tiene curiosidad por ver alguna sesión, hay muchas muy buenas, personalmente la que más me gustó fue la de Parallel programming for Managed developers de Daniel Moth, espectacular.

http://www.microsoftpdc.com

Happy Videos!