<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>La Sombra de Dijkstra</title>
	<atom:link href="http://www.programando.org/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.programando.org/blog</link>
	<description>Sobre el arte y la práctica de la programación</description>
	<lastBuildDate>Sat, 12 May 2012 13:03:43 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Desafío 2012-05: un poco de estadística</title>
		<link>http://www.programando.org/blog/2012/05/desafio-2012-05-un-poco-de-estadistica/</link>
		<comments>http://www.programando.org/blog/2012/05/desafio-2012-05-un-poco-de-estadistica/#comments</comments>
		<pubDate>Sat, 12 May 2012 13:03:05 +0000</pubDate>
		<dc:creator>ediaz</dc:creator>
				<category><![CDATA[Algoritmos]]></category>
		<category><![CDATA[Desafío]]></category>
		<category><![CDATA[Técnicas Avanzadas]]></category>

		<guid isPermaLink="false">http://www.programando.org/blog/?p=388</guid>
		<description><![CDATA[El desafío de este mes es fácil, pero vamos a ver que tan buenos son para calcular. Si tenemos una participación interesante (de 10 o más) el próximo mes este desafío tendrá premio, por ahora sólo el honor. Voy a tratar de ser lo más preciso posible en el requerimiento. Cálculo de la desviación estándar La desviación estándar se define como la raiz cuadrada de la varianza, una   fórmula para la varianza es esta: La X con la barrita encima es la media. El algoritmo típico para calcular la varianza de una lista L de números es el siguiente: &#160; def Varianza(X[], N): let M = media(X, N) let S = 0 for x in X: S = S + (x-M)^2 return S/N def media(X[], N): let S = 0 for x in X: S = S + x return S/N Este algoritmo requiere &#8220;pasar&#8221; dos veces por los datos, una para calcular la media y otra para calcular la varianza. El desafío de este mes es el siguiente: Calcular la varianza de una manera más rápida y eficiente. Desafio extra El resultado debe ser el más preciso posible. Con el fin de probar este ejercicio usaré una lista [...]]]></description>
			<content:encoded><![CDATA[<p>El desafío de este mes es fácil, pero vamos a ver que tan buenos son para calcular. Si tenemos una participación interesante (de 10 o más) el próximo mes este desafío tendrá premio, por ahora sólo el honor.</p>
<p>Voy a tratar de ser lo más preciso posible en el requerimiento.</p>
<p><strong>Cálculo de la desviación estándar</strong></p>
<p>La desviación estándar se define como la raiz cuadrada de la varianza, una   fórmula para la varianza es esta:</p>
<p><a href="http://www.programando.org/blog/wp-content/uploads/2012/05/varianza.png"><img class="aligncenter size-full wp-image-389" title="varianza" src="http://www.programando.org/blog/wp-content/uploads/2012/05/varianza.png" alt="" width="171" height="61" /></a></p>
<p>La X con la barrita encima es la media.</p>
<p>El algoritmo típico para calcular la varianza de una lista L de números es el siguiente:</p>
<p>&nbsp;</p>
<p style="padding-left: 60px;"><code><br />
def Varianza(X[], N):</code></p>
<p style="padding-left: 90px;">let M = media(X, N)<br />
let S = 0<br />
for x in X:<br />
S = S + (x-M)^2<br />
return S/N</p>
<p style="padding-left: 60px;">def media(X[], N):</p>
<p style="padding-left: 90px;">let S = 0<br />
for x in X:<br />
S = S + x<br />
return S/N</p>
<p>Este algoritmo requiere &#8220;pasar&#8221; dos veces por los datos, una para calcular la media y otra para calcular la varianza.</p>
<p>El desafío de este mes es el siguiente:</p>
<blockquote><p>Calcular la varianza de una manera más rápida y eficiente.</p></blockquote>
<p>Desafio extra</p>
<blockquote><p>El resultado debe ser el más preciso posible.</p></blockquote>
<p>Con el fin de probar este ejercicio usaré una lista de un millón de números con cuatro dígitos decimales, el resultado se deberá entregar como un número con 8 dígitos decimales. Ganará el programa más rápido y más preciso (proximamente publicaré la lista de números en GitHub y el resultado esperado, así que visiten este post nuevamente para ver estos datos).</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.programando.org/blog/2012/05/desafio-2012-05-un-poco-de-estadistica/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Cómo conseguir un PhD</title>
		<link>http://www.programando.org/blog/2012/05/como-conseguir-un-phd/</link>
		<comments>http://www.programando.org/blog/2012/05/como-conseguir-un-phd/#comments</comments>
		<pubDate>Sat, 05 May 2012 16:03:13 +0000</pubDate>
		<dc:creator>ediaz</dc:creator>
				<category><![CDATA[Algoritmos]]></category>
		<category><![CDATA[Técnicas]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[lógica binaria]]></category>
		<category><![CDATA[optimización]]></category>
		<category><![CDATA[programación dinámica]]></category>

		<guid isPermaLink="false">http://www.programando.org/blog/?p=375</guid>
		<description><![CDATA[En Programming Pearls[1], Jon Bentley propone la manera de hacerse de un PhD: Dado el siguiente algoritmo while (n &#62; 1) do if (n is even) n &#60;- n / 2 else n &#60;- n*3+1 end Demuestre que este programa se detiene para cualquier número n entero. Si ustedes resuelven este acertijo entonces, dice Bentley, ¡vayan a la universidad más cercana y reclamen su PhD! Claro que en el camino se podrían quedar sin amigos, como nos recuerda XKCD: Este es un problema planteado por Lothar Collatz en 1937, que ha generado bastante investigación. Para los interesados hay una revisión del problema en esta página: http://www.numbertheory.org/keith/george.html. Lo que sabemos Este problema es la base del desafío de abril, donde algunos de ustedes participaron. Mi respuesta al problema es la siguiente (que llamaremos siracusa-1): No es la más breve, que era una de los requerimientos del desafío. La solución en Ruby de Daniel Torres es la más breve presentada, se me ocurre que podríamos escribir una más breve en perl, pero lamentablemente estas soluciones tienen un mal desempeño, llegando a consumir mucho tiempo de cpu. Pero si vamos a dedicarnos a obtener nuestro PhD debemos encontrar una solución con buen desempeño y [...]]]></description>
			<content:encoded><![CDATA[<p>En <a href="http://amzn.to/IlzYgo">Programming Pearls</a>[1], Jon Bentley propone la manera de hacerse de un PhD:</p>
<blockquote><p>Dado el siguiente algoritmo</p>
<blockquote><p>while (n &gt; 1) do<br />
if (n is even)<br />
n &lt;- n / 2<br />
else<br />
n &lt;- n*3+1<br />
end</p></blockquote>
<p>Demuestre que este programa se detiene para cualquier número n entero.</p></blockquote>
<p>Si ustedes resuelven este acertijo entonces, dice Bentley, ¡vayan a la universidad más cercana y reclamen su PhD!</p>
<p>Claro que en el camino se podrían quedar sin amigos, como nos recuerda <a href="http://xkcd.com/710/">XKCD</a>:</p>
<p><a href="http://www.programando.org/blog/wp-content/uploads/2012/05/collatz_conjecture.png"><img class="aligncenter size-full wp-image-376" title="collatz_conjecture" src="http://www.programando.org/blog/wp-content/uploads/2012/05/collatz_conjecture.png" alt="" width="311" height="452" /></a></p>
<p>Este es un problema planteado por Lothar Collatz en 1937, que ha generado bastante investigación. Para los interesados hay una revisión del problema en esta página: <a href="http://www.numbertheory.org/keith/george.html">http://www.numbertheory.org/keith/george.html</a>.<br />
Lo que sabemos</p>
<p>Este problema es la base del <a href="http://www.programando.org/blog/2012/04/desafio-2012-04-el-problema-de-siracusa/">desafío de abril</a>, donde algunos de <a href="http://www.programando.org/blog/2012/04/desafio-2012-04-and-the-winner-is/">ustedes participaron</a>.</p>
<p>Mi respuesta al problema es la siguiente (que llamaremos <a href="siracusa/siracusa-1.c">siracusa-1</a>):</p>
<p><script src="https://gist.github.com/2572943.js"> </script></p>
<p>No es la más breve, que era una de los <a href="http://www.programando.org/blog/2012/04/desafio-2012-04-el-problema-de-siracusa/">requerimientos del desafío</a>. La solución en <a href="https://github.com/lnds/programando.org/blob/master/siracusa/dtorres-1.rb">Ruby de Daniel Torres</a> es la más breve presentada, se me ocurre que podríamos escribir una más breve en perl, pero lamentablemente estas soluciones tienen un mal desempeño, llegando a consumir mucho tiempo de cpu.</p>
<p>Pero si vamos a dedicarnos a obtener nuestro PhD debemos encontrar una solución con buen desempeño y eficiente, después de todo hay que recorrer todos los números enteros. <img src='http://www.programando.org/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>La solución de Aldrin Martoq usa un bonito <a href="https://github.com/aldrinmartoq/lnds-siracusa/blob/master/siracusa-performante.c">método de programación dinámica</a>, con un costo de memoria proporcional al tamaño del problema. Su código usa un arreglo de 10 millones de enteros (de 64bits). En mi mac su solución toma menos de 2 segundos para cualquier parámetro menor o igual a 10.000.000. Cuando empezamos a jugar con parámetros mayores a esa cifra el desempeño empieza a decaer. Claro está que podemos aumentar los requerimientos de memoria del programa y mantener su desempeño para números mayores.</p>
<p>Vamos a intentar romper el record de Aldrin&#8230;</p>
<p>Lo primero que vamos a hacer es operar con bits.</p>
<p>La expresión:</p>
<blockquote><p>n % 2 == 0 ? n / 2 : n * 3 + 1</p></blockquote>
<p>Se transformará en</p>
<blockquote><p>n &#038; 0&#215;01 ? ((n << 1)|1)+n : n >> 1</p></blockquote>
<p>Esto requiere un poco de explicación, verificar que un número es par es equivalente a verificar el bit menos  significativo y ver si es un 1. Dividir por 2 es lo mismo que hacer un shift a la derecha en 1.</p>
<p>La expresión n*3+1 es lo mismo que hacer: ((n*2)+1)+n = ((n<<2)|1)+n.</p>
<p>La verdad es que este cambio no impacta en el desempeño. Pero debemos notar que una vez que multiplicamos por 3 y sumamos 1 lo que hacemos es obtener un número par. Así que esto nos da la clave para reformular nuestro función orbita de la siguiente manera:</p>
<p><script src="https://gist.github.com/2602718.js"> </script></p>
<p>Esta solución, que llamaremos <a href="https://github.com/lnds/programando.org/blob/master/siracusa/siracusa-2.c">siracusa-2</a>, tiene una mejora notable en desempeño, estos son los valores de ejecutar la versión de aldrin, siracusa-1 y siracusa-2 en mi pc:</p>
<p><code><br />
time ./amartoq-2 10000000<br />
8400511</p>
<p>real	0m1.526s<br />
user	0m1.518s<br />
sys	0m0.006s</p>
<p>time ./siracusa-1 10000000<br />
8400511</p>
<p>real	0m4.069s<br />
user	0m4.063s<br />
sys	0m0.004s</p>
<p>time ./siracusa-2 10000000<br />
8400511</p>
<p>real	0m2.511s<br />
user	0m2.507s<br />
sys	0m0.003s<br />
</code></p>
<p>Probando amartoq-2 y siracusa-2 para n=100.000.000 tenemos estos tiempos:</p>
<p><code><br />
time ./amartoq-2 100000000<br />
63728127</p>
<p>real	0m27.943s<br />
user	0m27.916s<br />
sys	0m0.019s</p>
<p>time ./siracusa-2 100000000<br />
63728127</p>
<p>real	0m27.605s<br />
user	0m27.583s<br />
sys	0m0.015s<br />
</code></p>
<p>Y para 1.000.000.000:</p>
<p><code><br />
time ./amartoq-2 1000000000<br />
670617279</p>
<p>real	6m37.638s<br />
user	6m37.381s<br />
sys	0m0.198s</p>
<p>time ./siracusa-2 1000000000<br />
670617279</p>
<p>real	4m59.104s<br />
user	4m58.883s<br />
sys	0m0.160s<br />
</code></p>
<p>Wujuu!! Gané!! Claro que es una <a href="http://es.wikipedia.org/wiki/Victoria_p%C3%ADrrica">victoria pírrica</a>, dado el uso de cpu sostenido durante esos 4 minutos.</p>
<p>Por cierto, el programa de Aldrin siempre puede mejorar para valores mayores de n si aumentamos el tamaño del arreglo <strong>saltos</strong>.</p>
<p>Ahora les toca a ustedes, les dejo algunos desafíos interesantes, cómo saben si alguno de ustedes encuentra la solución a la <a href="http://en.wikipedia.org/wiki/Collatz_conjecture">Conjetura de Collatz</a>?</p>
<p><strong>Desafíos</strong></p>
<p>1. Modifica el programa de <a href="https://github.com/lnds/programando.org/blob/master/siracusa/amartoq-2.c">amartoq-2.c</a> para usar las optimizaciones aritméticas usadas en <a href="https://github.com/lnds/programando.org/blob/master/siracusa/siracusa-2.c">siracusa-2.c</a> y mide el impacto en el desempeño.<br />
2. Fíjate que nuestros programas usan un tipo de datos de 64bits, pero no han sido ejecutados con valores que ocupen todos esos bits, escribe versiones modificadas de los programas usando sólo 32bits y mide el impacto en desempeño.<br />
3. El programa siracusa-3.c imprime los números y el largo de sus secuencias, úsalo para armar una base de datos que permita a los investigadores de este problema consultar rapidamente cual es la secuencia más larga que se genera en un rango de números dados.<br />
4. Para los estudiantes de ciencias de la computación: ¿Se puede calcular la complejidad de los algoritmos usados en este artículo? ¿Cuáles son?<br />
5. ¿Por qué el hacer estos programas no es la forma correcta de ganarse un PhD, qué es lo que falta?</p>
<p><strong>Notas</strong><br />
[1] Este libro es fundamental: <a href="http://amzn.to/IlzYgo">Programming Pearls, Jon Bentley</a> ¿en que están que no lo han incorporado a su biblioteca?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.programando.org/blog/2012/05/como-conseguir-un-phd/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Desafío 2012-04, and the winner is&#8230;</title>
		<link>http://www.programando.org/blog/2012/04/desafio-2012-04-and-the-winner-is/</link>
		<comments>http://www.programando.org/blog/2012/04/desafio-2012-04-and-the-winner-is/#comments</comments>
		<pubDate>Sun, 29 Apr 2012 19:17:21 +0000</pubDate>
		<dc:creator>ediaz</dc:creator>
				<category><![CDATA[Desafío]]></category>

		<guid isPermaLink="false">http://www.programando.org/blog/?p=369</guid>
		<description><![CDATA[Vaya, pasó volando abril, la verdad es que pasaron los días de este ajetreado mes y yo apenas pude dejarles el desafío, y esperar sus respuestas. Vamos a revisar los resultados del desafío 2012-04: El problema de Siracusa, si no sabe de que hablamos le sugiero leer este post. Participantes: damowe: Daniel Molina en Haskell, con 2 respuestas, aunque la segunda es la que implementa el requerimiento, Daniel incluso escribió un post en su blog e investigó un poco más sobre este problema. A la solución correcta de Daniel la llamaremos damowe-2.hs. dtorres: Daniel Torres participó con dos soluciones, una  en ruby dtorres-1.rb (elegí la más corta), y otra en c: dtorres-2.c. amartoq: Aldrin Martoq aportó varias soluciones, de hecho varias están en un proyecto en github en que estuvo explorando el tema. Tomaremos dos de sus soluciones para participar, una en ruby: amartoq-1.rb y otra en C: amartoq-2.c. chancesman: Michael Chances participó tambien con una solución en C: chancesman-1.c umolina: Uriel Molina particpa con una solución en PHP, umolina1.php. Desempeño: Para evaluar el ganador vamos a descartar los programas que no cumplen el requerimiento descrito anteriormente: El desafío de este mes es escribir el programa más breve posible, en [...]]]></description>
			<content:encoded><![CDATA[<p>Vaya, pasó volando abril, la verdad es que pasaron los días de este ajetreado mes y yo apenas pude dejarles el desafío, y esperar sus respuestas.</p>
<p>Vamos a revisar los resultados del desafío 2012-04: El problema de Siracusa, si no sabe de que hablamos le sugiero leer <a href="http://www.programando.org/blog/2012/04/desafio-2012-04-el-problema-de-siracusa/">este post</a>.</p>
<h2><strong>Participantes</strong>:</h2>
<ul>
<li><strong>damowe</strong>: Daniel Molina en Haskell, con 2 respuestas, aunque la segunda es la que implementa el requerimiento, Daniel incluso <a href="http://coder.cl/2012/04/collatz-problem-and-haskell/">escribió un post en su blog</a> e investigó un poco más sobre este problema. A la solución correcta de Daniel la llamaremos damowe-2.hs.</li>
<li><strong>dtorres</strong>: Daniel Torres participó con dos soluciones, una  en ruby dtorres-1.rb (elegí la más corta), y otra en c: dtorres-2.c.</li>
<li><strong>amartoq: </strong>Aldrin Martoq aportó varias soluciones, de hecho varias están en un <a href="https://github.com/aldrinmartoq/lnds-siracusa">proyecto en github </a>en que estuvo explorando el tema. Tomaremos dos de sus soluciones para participar, una en ruby: amartoq-1.rb y otra en C: amartoq-2.c.</li>
<li><strong>chancesman: </strong>Michael Chances participó tambien con una solución en C: chancesman-1.c</li>
<li><strong>umolina</strong>: Uriel Molina particpa con una solución en PHP, umolina1.php.</li>
</ul>
<h2><strong>Desempeño</strong>:</h2>
<p>Para evaluar el ganador vamos a descartar los programas que no cumplen el requerimiento <a href="http://www.programando.org/blog/2012/04/desafio-2012-04-el-problema-de-siracusa/">descrito anteriormente</a>:</p>
<blockquote><p>El desafío de este mes es escribir el programa más breve posible, en el lenguaje que quieran, que encuentre el número base de la secuencia de números más larga, este número debe estar entre 1 y un parámetro de entrada al programa.</p>
<p>Por ejemplo, si le paso como parámetro el número 5 al programa este debería imprimir 3, pues 3 es el número entre 1 y 5 que genera la secuencia más larga:</p>
<p>1: 4, 2, 1.<br />
2: 1.<br />
3: 10, 5, 16, 8, 4, 2, 1 &lt;&#8211; esta es la secuencia más larga, por tanto el resultado es 3.<br />
4: 2, 1.<br />
5: 16, 8, 4, 2, 1.</p></blockquote>
<p>Por lo tanto si ejecuto Siracusa(2) el resultado debe ser 1.</p>
<h2><strong>Ronda Número 1:</strong></h2>
<div></div>
<div>Veamos como le va a los participantes con n = 2:</div>
<div>
<ul>
<li>damowe-2.hs: FAIL, retorna 2.</li>
<li>dtorres-1.rb: OK, retorna 1.</li>
<li>dtorres-2.c: FAIL, retorna 0.</li>
<li>amartoq-1.rb: OK, retorna 1.</li>
<li>amartoq-2.c: OK, retorna 1</li>
<li>chancesman-1.c: OK, retorna 1</li>
<li>umolina-1.php: FAIL, retorna 2 (además el parámetro está &#8220;en duro&#8221;)</li>
</ul>
<h2><strong>Ronda Número 2:</strong></h2>
<p>El otro requerimiento es que el programa sea lo más breve posible. Vamos a ignorar comentarios y vamos a considerar la cantidad de líneas de código para los programas que pasan la ronda número 1:</p>
<ul>
<li>dtorres-1.rb: <strong>4</strong></li>
<li>amartoq-1.rb: <strong>7</strong></li>
<li>amartoq-2.c:<strong> 28</strong></li>
<li>chancesman-1.c: <strong>30</strong></li>
<li>umolina-1.php: <strong>20</strong></li>
</ul>
<div><strong><br />
</strong></div>
</div>
<h2><strong>Ganador</strong></h2>
<div></div>
<div>Así que el ganador es <strong>dtores Daniel Torres, </strong>con el programa más breve.</div>
<div></div>
<div></div>
<div></div>
<h3><strong>Mención Honrosa</strong></h3>
<div></div>
<div>Aldrin Martoq escribió el programa más eficiente, amartoq.c, con 28 lineas.</div>
<div></div>
<div></div>
<h2><strong>Código Fuente</strong></h2>
<div></div>
<div></div>
<div>El código de los concursantes está disponible en <a href="https://github.com/lnds/programando.org/tree/master/siracusa">este repositorio github</a>.</div>
<div></div>
<div>Proximamente mi solución a este problema y un nuevo desafío.</div>
<div></div>
<div>Felicitaciones a Daniel y a todos los que participaron.</div>
<div>Gracias a todos por participar!!</div>
]]></content:encoded>
			<wfw:commentRss>http://www.programando.org/blog/2012/04/desafio-2012-04-and-the-winner-is/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Desafio 2012-04: El problema de Siracusa</title>
		<link>http://www.programando.org/blog/2012/04/desafio-2012-04-el-problema-de-siracusa/</link>
		<comments>http://www.programando.org/blog/2012/04/desafio-2012-04-el-problema-de-siracusa/#comments</comments>
		<pubDate>Sat, 07 Apr 2012 17:24:27 +0000</pubDate>
		<dc:creator>ediaz</dc:creator>
				<category><![CDATA[Desafío]]></category>
		<category><![CDATA[el problema de Siracusa]]></category>
		<category><![CDATA[secuencia de Hailstone]]></category>
		<category><![CDATA[secuencias]]></category>

		<guid isPermaLink="false">http://www.programando.org/blog/?p=364</guid>
		<description><![CDATA[Parece que no me he dado el tiempo para escribir en este blog como esperaba, así que mis disculpas. Pero vamos a mantener la idea de tener al menos un desafío mensual. Cada desafío será identificado por el mes y año así que este es el desafío 2012-04. Vamos por él. El problema de Siracusa Piensa en un número positivo cualquiera, si es par divídelo por 2, si es impar multiplícalo por 3 y súmale 1. Repite el proceso con el resultado. Llegará un momento en que obtendrás el número 1, no importa el número que elijas. A la secuencia de números que genera este algoritmo la llamamos la secuencia de Hailstone. Veamos algunos ejemplos: Supongamos que partimos con el 4, la secuencia que obtendremos será: 4, 2, 1. Partamos con el 11: 11, 34 (=11*3+1), 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1. A 4 y 11 los llamaremos los números bases. Podrán apreciar que este algoritmo puede generar secuencias muy largas. El desafío de este mes es escribir el programa más breve posible, en el lenguaje que quieran, que encuentre el número base de la secuencia de números más larga, este número debe [...]]]></description>
			<content:encoded><![CDATA[<p>Parece que no me he dado el tiempo para escribir en este blog como esperaba, así que mis disculpas. Pero vamos a mantener la idea de tener al menos un desafío mensual. Cada desafío será identificado por el mes y año así que este es el desafío 2012-04. </p>
<p>Vamos por él.</p>
<p><strong>El problema de Siracusa</strong></p>
<p>Piensa en un número positivo cualquiera, si es par divídelo por 2, si es impar multiplícalo por 3 y súmale 1. Repite el proceso con el resultado. Llegará un momento en que obtendrás el número 1, no importa el número que elijas.</p>
<p>A la secuencia de números que genera este algoritmo la llamamos la secuencia de Hailstone.</p>
<p>Veamos algunos ejemplos:</p>
<blockquote><p>Supongamos que partimos con el 4, la secuencia que obtendremos será: 4, 2, 1.</p>
<p>Partamos con el 11: 11, 34 (=11*3+1), 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1.
</p></blockquote>
<p>A 4 y 11 los llamaremos los números bases. Podrán apreciar que este algoritmo puede generar secuencias muy largas. </p>
<p>El desafío de este mes es escribir el programa más breve posible, en el lenguaje que quieran, que encuentre el número base de la secuencia de números más larga, este número debe estar entre 1 y un parámetro de entrada al programa.</p>
<p>Por ejemplo, si le paso como parámetro el número 5 al programa este debería imprimir 3, pues 3 es el número entre 1 y 5 que genera la secuencia más larga:</p>
<blockquote><p>1: 4, 2, 1.<br />
2: 1.<br />
3: 10, 5, 16, 8, 4, 2, 1 <-- esta es la secuencia más larga, por tanto el resultado es 3.<br />
4: 2, 1.<br />
5: 16, 8, 4, 2, 1.</p></blockquote>
<p>Tienen un mes para contestar, el programa más breve gana (es decir, que tenga menos caracteres, no consideraremos los saltos de linea, tabuladores y espacios en blanco porque igual queremos que sea un programa legible).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.programando.org/blog/2012/04/desafio-2012-04-el-problema-de-siracusa/feed/</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
		<item>
		<title>¿Cómo probar?</title>
		<link>http://www.programando.org/blog/2012/03/como-probar/</link>
		<comments>http://www.programando.org/blog/2012/03/como-probar/#comments</comments>
		<pubDate>Sun, 11 Mar 2012 16:42:44 +0000</pubDate>
		<dc:creator>ediaz</dc:creator>
				<category><![CDATA[Fundamentos]]></category>
		<category><![CDATA[Técnicas]]></category>
		<category><![CDATA[bugs]]></category>
		<category><![CDATA[calidad]]></category>
		<category><![CDATA[pruebas]]></category>
		<category><![CDATA[tests]]></category>

		<guid isPermaLink="false">http://www.programando.org/blog/?p=360</guid>
		<description><![CDATA[En el post anterior les contaba sobre un bug con el manejo de la fecha. El bug esencialmente era este: &#8220;Se debe implementar una función que dada una fecha calcule la fecha correspondiente a 10 años antes. Por ejemplo, si la fecha es 3 de marzo de 2012 la fecha de 10 años antes se define como 3 de marzo de 2002. El problema ocurre en los años bisiestos. Cuando llega el 29 de febrero de 2012 la implementación calcula como resultado 29 de febrero de 2002, una fecha que no existe.&#8221; El origen del problema está en la definición del requerimiento y en las condiciones de borde del mismo. La definición del problema implica que para calcular un desplazamiento de 10 años hacia atrás en el tiempo simplemente se deben restar 10 a la fecha dada. Esa definición es discutible, pero sólo cuando empezamos a considerar los desplazamientos debidos a los años bisiestos. Después de todo un año bisiesto introduce un error de 1 día cada cuatro años, ¿no es verdad? Pues no. Por que la regla del año bisiesto es: Un año es bisiesto si es divisible entre 4, a menos que sea divisible entre 100. Sin embargo, si un [...]]]></description>
			<content:encoded><![CDATA[<p>En el <a href="http://www.programando.org/blog/2012/03/el-bug-del-bisiesto/">post anterior</a> les contaba sobre un bug con el manejo de la fecha.</p>
<p>El bug esencialmente era este:</p>
<blockquote><p>&#8220;Se debe implementar una función que dada una fecha calcule la fecha correspondiente a 10 años antes. Por ejemplo, si la fecha es 3 de marzo de 2012 la fecha de 10 años antes se define como 3 de marzo de 2002. El problema ocurre en los años bisiestos. Cuando llega el 29 de febrero de 2012 la implementación calcula como resultado 29 de febrero de 2002, una fecha que no existe.&#8221;</p></blockquote>
<p>El origen del problema está en la definición del requerimiento y en las condiciones de borde del mismo.</p>
<p>La definición del problema implica que para calcular un desplazamiento de 10 años hacia atrás en el tiempo simplemente se deben restar 10 a la fecha dada. Esa definición es discutible, pero sólo cuando empezamos a considerar los desplazamientos debidos a los años bisiestos. Después de todo un año bisiesto introduce un error de 1 día cada cuatro años, ¿no es verdad?</p>
<p>Pues no. Por que la regla del año bisiesto es:</p>
<blockquote><p>Un año es bisiesto si es <a title="Divisibilidad" href="http://es.wikipedia.org/wiki/Divisibilidad">divisible</a> entre 4, a menos que sea divisible entre 100. Sin embargo, si un año es divisible entre 100 y además es divisible entre 400, también resulta bisiesto. Obviamente, esto elimina los años <a title="Siglo" href="http://es.wikipedia.org/wiki/Siglo">finiseculares</a> (últimos de cada siglo, que <strong>ha de terminar en 00</strong>) divisibles sólo entre 4 y entre 100.</p></blockquote>
<p>En código, podemos definir una función bisiesto de esta manera (en C):</p>
<p><script src="https://gist.github.com/2017018.js?file=gistfile1.c"></script></p>
<p>Esta función es fundamental para poder implementar la solución correcta de nuestro problema, así que considerenla, todavía quedan días para resolver este desafío.</p>
<p>Pero sigamos analizando el bug. Una técnica que es muy util para desarrollar código de calidad es crear pruebas unitarias, o test unitarios como se les conoce. La idea es definir un conjunto de pruebas que permitan validar el funcionamiento de nuestra implementación.</p>
<p>Supongamos que nuestra función que calcula una fecha previa se define de este modo:</p>
<p>prev_year(cur_day, cur_mon, cur_year,  delta_year);</p>
<p>cur_day, cur_mon y cur_year son la fecha que le pasamos como argumento, delta_year es la cantidad de años que queremos que se &#8220;retroceda en el tiempo&#8221; para calcular la fecha deseada. Esta funcion nos devuelve una estructura que expresa la fecha deseada e en sus tres parámetros día, mes y año.</p>
<p>Ahora usemos seudo código para expresar nuestras pruebas unitarias (lo que sigue parece python, pero no lo es, es un lenguaje inventado para efectos de expresar la idea):</p>
<blockquote><p>prueba_1: assert prev_year(2012, 3, 1, 10) == (2002, 3, 1);<br />
prueba_2: assert prev_year(2012, 2, 29, 10) == (2002, 3, 1);
</p></blockquote>
<p>assert es una primitiva que intenta ejecutar una expresión booleana, si la expresión se cumple entonces assert indica que todo está bien, si no se cumple assert nos informa de un error. El modo específico de como funciona esto depende de cada lenguaje de programación.</p>
<p>La idea importante que quiero expresarles es que cuando nos enfrentamos a un problema de este tipo, sobretodo cuando hay que depurar algún error, el uso de pruebas unitarias es de gran ayuda. Así que si quieren responder el desafío que les he planteado en el post anterior les sugiero implementar esto tests unitarios, y de esta forma estarán validando si cumplen con el requerimiento.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.programando.org/blog/2012/03/como-probar/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>El Bug del Bisiesto</title>
		<link>http://www.programando.org/blog/2012/03/el-bug-del-bisiesto/</link>
		<comments>http://www.programando.org/blog/2012/03/el-bug-del-bisiesto/#comments</comments>
		<pubDate>Thu, 01 Mar 2012 02:42:40 +0000</pubDate>
		<dc:creator>ediaz</dc:creator>
				<category><![CDATA[Sin categoría]]></category>

		<guid isPermaLink="false">http://www.programando.org/blog/?p=357</guid>
		<description><![CDATA[29 de febrero, de 2012. Hoy nos topamos en mi trabajo con un bug de año bisiesto. Se debía validar fechas anteriores a 10 años atrás. La solución que el programador implementó consiste simplemente en restar 10 al año. Así, si la fecha es 28 de febrero de 2012, entonces 10 años antes se calcula restando 10 a 2012, es decir, la fecha buscada es 28 de febrero de 2002. Por supuesto aplicando ese criterio para el día de hoy genera la imaginaria fecha del 29 de febrero de 2002. Esa no es la manera correcta de calcular la fecha para 10 años atrás, así que este es el desafío de esta oportunidad ¿cuál es la mejor manera de calcular la fecha correspondiente a 10 años atrás en el tiempo? Más sobre bugs del bisiesto en la naturaleza del software.]]></description>
			<content:encoded><![CDATA[<p>29 de febrero, de 2012. Hoy nos topamos en mi trabajo con un bug de año bisiesto. Se debía validar fechas anteriores a 10 años atrás. La solución que el programador implementó consiste simplemente en restar 10 al año.</p>
<p>Así, si la fecha es 28 de febrero de 2012, entonces 10 años antes se calcula restando 10 a 2012, es decir, la fecha buscada es 28 de febrero de 2002. Por supuesto aplicando ese criterio para el día de hoy genera la imaginaria fecha del 29 de febrero de 2002.</p>
<p>Esa no es la manera correcta de calcular la fecha para 10 años atrás, así que este es el desafío de esta oportunidad ¿cuál es la mejor manera de calcular la fecha correspondiente a 10 años atrás en el tiempo?</p>
<p>Más sobre bugs del bisiesto en la<a href="http://www.lnds.net/blog/2012/02/bisiesto.html"> naturaleza del software.</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.programando.org/blog/2012/03/el-bug-del-bisiesto/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Habilidades y características de un programador</title>
		<link>http://www.programando.org/blog/2012/02/habilidades-y-caracteristicas-de-un-programador/</link>
		<comments>http://www.programando.org/blog/2012/02/habilidades-y-caracteristicas-de-un-programador/#comments</comments>
		<pubDate>Thu, 23 Feb 2012 15:34:30 +0000</pubDate>
		<dc:creator>ediaz</dc:creator>
				<category><![CDATA[Fundamentos]]></category>
		<category><![CDATA[capacidades]]></category>
		<category><![CDATA[entendimiento]]></category>
		<category><![CDATA[habilidades]]></category>
		<category><![CDATA[mente analítica]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://www.programando.org/blog/?p=354</guid>
		<description><![CDATA[El sitio Penny Arcade publicó dos videos titulados &#8220;so you want to be a developer&#8221;, en que exponen algunas características y habilidades para ser un desarrollador de software. Elaborados con la ayuda de la gente de StackExchange, los videos dan algunas recomendaciones para las personas que están interesadas en ser desarrolladores de software. Estos son los enlaces a los videos: Parte 1 Parte 2 En general estoy de acuerdo con lo expuesto en los videos, pero tengo mis comentarios. En el video un desarrollador se define básicamente como una persona analítica con la capacidad de resolver problemas. Bueno, eso coincide curiosamente con la descripción de ingeniero Pero sí, un desarrollador debe tener las mismas habilidades cognitivas de un ingeniero, por eso que en Chile al menos, tenemos la carrera de ingeniería en informática, computación o software (no hay mucho consenso al respecto). De todas maneras aparecen mencionadas en la segunda parte algunas habilidades y características que un desarrollador debe tener. La primera, y estoy de acuerdo que es una de las más importantes, es la habilidad para comunicarse. La idea del programador como una persona aislada, solitaria encerrada en una sala oscura llena de pantallas es inadecuada, después de todo, [...]]]></description>
			<content:encoded><![CDATA[<p>El sitio <a href="http://penny-arcade.com/">Penny Arcade</a> publicó dos videos titulados &#8220;so you want to be a developer&#8221;, en que exponen algunas características y habilidades para ser un desarrollador de software.</p>
<p>Elaborados con la ayuda de la gente de <a href="http://stackexchange.com/">StackExchange</a>, los videos dan algunas recomendaciones para las personas que están interesadas en ser desarrolladores de software.</p>
<p>Estos son los enlaces a los videos:</p>
<ul>
<li><a href="http://penny-arcade.com/patv/episode/so-you-want-to-be-a-developer-part-1">Parte 1</a></li>
<li><a href="http://penny-arcade.com/patv/episode/so-you-want-to-be-a-developer-part-2">Parte 2</a></li>
</ul>
<p>En general estoy de acuerdo con lo expuesto en los videos, pero tengo mis comentarios.</p>
<p>En el video un desarrollador se define básicamente como una persona analítica con la capacidad de resolver problemas. Bueno, eso coincide curiosamente con la descripción de ingeniero <img src='http://www.programando.org/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<div id="attachment_355" class="wp-caption aligncenter" style="width: 437px"><a href="http://www.programando.org/blog/wp-content/uploads/2012/02/RubiksCubeCat.jpg"><img class="size-full wp-image-355" title="Mente Analitica" src="http://www.programando.org/blog/wp-content/uploads/2012/02/RubiksCubeCat.jpg" alt="" width="427" height="375" /></a><p class="wp-caption-text">Una mente analitica y capacidad para resolver problemas</p></div>
<p>Pero sí, un desarrollador debe tener las mismas habilidades cognitivas de un ingeniero, por eso que en Chile al menos, tenemos la carrera de ingeniería en informática, computación o software (no hay mucho consenso al respecto).</p>
<p>De todas maneras aparecen mencionadas en la segunda parte algunas habilidades y características que un desarrollador debe tener.</p>
<p>La primera, y estoy de acuerdo que es una de las más importantes, es la habilidad para comunicarse. La idea del programador como una persona aislada, solitaria encerrada en una sala oscura llena de pantallas es inadecuada, después de todo, hoy en día el software apoya a muchas industrias y disciplinas, lo que obliga a trabajar en equipos con gente con distintas profesiones y oficios. Es importante saber escuchar y trabajar en conjunto en pos del objetivo de la empresa o institución. Un buen programador debe ser empático y colaborador, ser un aporte y no un estorbo a la organización. Desarrollar las habilidades sociales y de comunicación es un requisito mínimo para el desarrollador. Cuando no hay comunicación se resuelven los problemas equivocados, se asumen cosas incorrectas, se generan errores, los proyectos se retrasan.</p>
<p>Luego hay una serie de habilidades más concretas:</p>
<ul>
<li><strong>Matemáticas: </strong>fundamental. Probablemente no necesitas ser un genio de las matemáticas, pero es básico saber álgebra, geometría y probabilidades. Yo agregaría matemáticas discretas, es fundamental saber contar,  hablaremos sobre matemáticas más adelante en este blog.</li>
<li><strong>Estimación</strong>: Hay que saber estimar, ese es uno de los mayores defectos de los programadores, y algo que deben aprender a mejorar rápidamente en su carrera. Una buena manera es dividir el problema en partes más pequeñas, estimar el esfuerzo de cada una, llevar un registro de las estimaciones, y después revisar que fue lo que estuvo mal con la estimación, y corregir. Aprender en retrospectiva, para ir mejorando las estimaciones.</li>
<li><strong>Micro economía: </strong>en esto estoy totalmente de acuerdo, se deben entender los fundamentos de la economía, oferta, demanda, costo de oportunidad, etc. Muchos programadores ignoran el aspecto económico o no se preocupan del impacto que su perfeccionismo pueda tener sobre el negocio. Muchas decisiones en un proyecto van a estar influenciada por el dinero. Se debe entender la diferencia entre lo perfecto y lo que es relevante para el valor del negocio.</li>
<li><strong>Diseño de Interfaces de Usuario: </strong>finalmente otra persona será la que use tu programa, y hay una manera adecuada de desplegar la información y definir las interacciones. Muchas interfaces malas son creadas por programadores, que no se preocupan de la importancia de la usabilidad y la accesibilidad.No se trata de que se vea lindo, se trata de que sea usable, entendible. Hay que aprender el lenguaje de los controles en pantalla y saber cuando usar cada control para cada uso específico.</li>
<li><strong>Lenguajes de Bajo Nivel: </strong>C o Assembler. En algún momento aparecen los problemas de desempeño, y hay que entender cómo un lenguaje de alto nivel nos abstrae de detalles de bajo nivel como punteros, uso de memoria, branching, aritmética, representación de la información en bits, etc. Cuando uno entiende esto puede llegar a optimizar el código de mejor manera.</li>
<li><strong>Arquitectura de Computadores</strong>, o cómo funciona un computador internamente. Esto incluye el conocimiento de hardware, redes, sistemas operativos. En algún momento se encontrarán con problemas de paginamiento, pérdida de paquetes, falla a nivel de hardware, y hay que saber como enfrentar esos problemas.</li>
<li><strong>Programar, programar, programar.</strong> Escribir código, leer código. Participar en algún proyecto opensource, escribir tu propio código, realizar algún code kata (ya veremos que es eso). Leer blogs sobre programación donde enseñen alguna técnica, o leer tutoriales sobre un framework, y probarlos por ti mismo.</li>
</ul>
<p>Estas son las sugerencias de StackExchange y Penny Arcade sobre las habilidades para ser un buen programador/desarrollador de software, ¿qué opinan ustedes?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.programando.org/blog/2012/02/habilidades-y-caracteristicas-de-un-programador/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Hello, again</title>
		<link>http://www.programando.org/blog/2012/02/hello-again/</link>
		<comments>http://www.programando.org/blog/2012/02/hello-again/#comments</comments>
		<pubDate>Thu, 23 Feb 2012 14:37:03 +0000</pubDate>
		<dc:creator>ediaz</dc:creator>
				<category><![CDATA[Sin categoría]]></category>
		<category><![CDATA[2012]]></category>
		<category><![CDATA[metas]]></category>
		<category><![CDATA[reboot]]></category>

		<guid isPermaLink="false">http://www.programando.org/blog/?p=351</guid>
		<description><![CDATA[Hace rato que no escribo en este blog, y voy a cambiar eso. El curso ha quedado detenido, pero lo voy a retomar dentro de los próximos días. Les recuerdo que el curso es opensource y se encuentra disponible en GitHub, a través de este sistema ustedes pueden hacer aportes, correcciones y mejoras al mismo (basta con que hagan un pull request)[1]. Estoy trabajando en dos capítulos nuevos así que pronto habrá más material para leer pronto. Con respecto a este blog, voy a imponerme una meta de escribir al menos un post semanal, esto incluirá un desafío de programación al mes, así que atentos. Pero voy a orientar este blog a que significa ser un buen programador, contar algunas historias, personales o que he presenciado, probablemente invitar a otros programadores. El objetivo de este blog será enseñar y transmitir experiencia. Hay una gran necesidad de contar con buenos programadores, y espero con este blog motivar a más gente a dedicarse a este hermoso oficio. Hay muchos lugares donde se pueden aprender técnicas, lenguajes de programación, etc. Este blog pretende orientarlos en la búsqueda, también pretende acortar una brecha que existe respecto al idioma. Hay mucho material, pero está en [...]]]></description>
			<content:encoded><![CDATA[<p>Hace rato que no escribo en este blog, y voy a cambiar eso. El curso ha quedado detenido, pero lo voy a retomar dentro de los próximos días. Les recuerdo que el curso es opensource y se encuentra <a href="https://github.com/lnds/Aprende-a-Programar">disponible en GitHub</a>, a través de este sistema ustedes pueden hacer aportes, correcciones y mejoras al mismo (basta con que hagan un pull request)[1]. Estoy trabajando en dos capítulos nuevos así que pronto habrá más material para leer pronto.</p>
<p>Con respecto a este blog, voy a imponerme una meta de escribir al menos un post semanal, esto incluirá un desafío de programación al mes, así que atentos. Pero voy a orientar este blog a que significa ser un buen programador, contar algunas historias, personales o que he presenciado, probablemente invitar a otros programadores. El objetivo de este blog será enseñar y transmitir experiencia. Hay una gran necesidad de contar con buenos programadores, y espero con este blog motivar a más gente a dedicarse a este hermoso oficio.</p>
<p>Hay muchos lugares donde se pueden aprender técnicas, lenguajes de programación, etc. Este blog pretende orientarlos en la búsqueda, también pretende acortar una brecha que existe respecto al idioma. Hay mucho material, pero está en inglés. Si quieren dedicarse seriamente a la programación deben aprender inglés, pero mientras tanto, hay que ayudar con algo de material en nuestra lengua.</p>
<p>Esos son los planes para este blog durante este año, espero verlos más seguido y me comprometo a cumplir con estas metas, y espero vuestro apoyo.</p>
<p>[1] Acá hay nota introductoria sobre GitHub en mi otro blog: <a href="http://www.lnds.net/blog/2012/02/el-senor-de-los-archivos.html">http://www.lnds.net/blog/2012/02/el-senor-de-los-archivos.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.programando.org/blog/2012/02/hello-again/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Una buena idea</title>
		<link>http://www.programando.org/blog/2011/07/una-buena-idea/</link>
		<comments>http://www.programando.org/blog/2011/07/una-buena-idea/#comments</comments>
		<pubDate>Fri, 29 Jul 2011 11:23:04 +0000</pubDate>
		<dc:creator>ediaz</dc:creator>
				<category><![CDATA[Herramientas]]></category>
		<category><![CDATA[control de versiones]]></category>
		<category><![CDATA[dropbox]]></category>
		<category><![CDATA[git]]></category>

		<guid isPermaLink="false">http://www.programando.org/blog/?p=343</guid>
		<description><![CDATA[GIT es una gran herramienta de control de versiones distribuido, podemos trabajar en la casa y en la oficina y sincronizar nuestros repositorios de código fuente. Pero está siempre el problema de donde alojar un servidor central donde colocar nuestro repositorio. GitHub permite arrendar espacio en sus servidores para alojar nuestros repositorios, y hay otros servicios por ahí. Pero una alternativa bastante ingeniosa es usar DropBox, alojar nuestros repositorios en la carpeta compartida de Dropbox, crear repositorios limpios (bare repositories) y hacer git pull/pull localmente sobre esa carpeta compartida. La idea aparece en este post (en inglés), y es bastante simple y potente. Supongo que esto también puede servir con otros gestores de control de versiones, como Mercurial o Bzr, pero incluso es una buena idea que se podría aplicar con gestores más tradicionales como Subversion. Si alguien lo implementa con esos sistemas lo invito a comentar y compartir la experiencia.]]></description>
			<content:encoded><![CDATA[<p><a href="http://git-scm.com/">GIT</a> es una gran herramienta de <a href="http://www.lnds.net/blog/2010/07/control-de-versiones-distribuido.html">control de versiones distribuido</a>, podemos trabajar en la casa y en la oficina y sincronizar nuestros repositorios de código fuente. Pero está siempre el problema de donde alojar un servidor central donde colocar nuestro repositorio.</p>
<p><a href="http://www.github.com">GitHub</a> permite arrendar espacio en sus servidores para alojar nuestros repositorios, y hay otros servicios por ahí. Pero una alternativa bastante ingeniosa es usar <a href="http://db.tt/3IdZpmw">DropBox</a>, alojar nuestros repositorios en la carpeta compartida de <a href="http://db.tt/3IdZpmw">Dropbox</a>, crear repositorios limpios (bare repositories) y hacer git pull/pull localmente sobre esa carpeta compartida. La idea aparece en <a href="http://random-rails.blogspot.com/2009/08/on-version-control.html">este post</a> (en inglés), y es bastante simple y potente.</p>
<p>Supongo que esto también puede servir con otros gestores de control de versiones, como Mercurial o Bzr, pero incluso es una buena idea que se podría aplicar con gestores más tradicionales como Subversion. Si alguien lo implementa con esos sistemas lo invito a comentar y compartir la experiencia.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.programando.org/blog/2011/07/una-buena-idea/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Capítulo 20, dispositivos</title>
		<link>http://www.programando.org/blog/2011/07/capitulo-20-dispositivos/</link>
		<comments>http://www.programando.org/blog/2011/07/capitulo-20-dispositivos/#comments</comments>
		<pubDate>Sun, 24 Jul 2011 00:57:12 +0000</pubDate>
		<dc:creator>ediaz</dc:creator>
				<category><![CDATA[Sin categoría]]></category>

		<guid isPermaLink="false">http://www.programando.org/blog/?p=340</guid>
		<description><![CDATA[Ya se encuentra disponible el capítulo 20 de nuestro curso de programación, dispositivos. http://www.programando.org/aprende-a-programar/segunda-parte/arquitectura-de-computadores/dispositivos.html Este capítulo cierra la parte dedicada a la arquitectura de computadores. A continuación retomaremos el objetivo de la segunda parte del curso, que es construir una versión gráfica de nuestro juego.]]></description>
			<content:encoded><![CDATA[<p>Ya se encuentra disponible el capítulo 20 de nuestro curso de programación, dispositivos.</p>
<p><a href="http://www.programando.org/aprende-a-programar/segunda-parte/arquitectura-de-computadores/dispositivos.html">http://www.programando.org/aprende-a-programar/segunda-parte/arquitectura-de-computadores/dispositivos.html</a></p>
<p>Este capítulo cierra la parte dedicada a la arquitectura de computadores. A continuación retomaremos el objetivo de la segunda parte del curso, que es construir una versión gráfica de nuestro juego.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.programando.org/blog/2011/07/capitulo-20-dispositivos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

