<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://geeks.ms/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>programancia101</title><link>http://geeks.ms/blogs/programancia101/default.aspx</link><description>aprendiendo a aprender...</description><dc:language>en</dc:language><generator>CommunityServer 2008.5 SP1 (Build: 31106.3070)</generator><item><title>a veces, las cosas cambian</title><link>http://geeks.ms/blogs/programancia101/archive/2007/10/22/a-veces-las-cosas-cambian.aspx</link><pubDate>Mon, 22 Oct 2007 17:53:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:44478</guid><dc:creator>phobeo</dc:creator><slash:comments>9</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/programancia101/rsscomments.aspx?PostID=44478</wfw:commentRss><comments>http://geeks.ms/blogs/programancia101/archive/2007/10/22/a-veces-las-cosas-cambian.aspx#comments</comments><description>&lt;p&gt;Esta semana estaré de reunión en Santiago de Chile, preparando la próxima edición de &lt;a href="http://www.ieee.org/xtreme" target="_blank"&gt;IEEEXtreme&lt;/a&gt;, el concurso de programacion de &lt;a href="http://www.ieee.org" target="_blank"&gt;IEEE&lt;/a&gt;, pero prometo mandar algun problemilla desde allá en cuanto tenga conexion. &lt;br /&gt;&lt;/p&gt;

&lt;p&gt;De momento, por dejar algo mas ligero que el ultimo problema que puse, para que no se me queje nadie, os dejo un pequeño puzzler, en el que (como &lt;a href="http://geeks.ms/blogs/programancia101/archive/2006/12/25/que-es-programancia.aspx" target="_blank"&gt;ya comentamos&lt;/a&gt;) lo que queremos es adivinar que función realiza un determinado programa pero SIN ejecutarlo. La idea subyacente es que, si lo que pasa no es lo que esperábamos, siempre podemos investigar por qué.
&lt;/p&gt;

&lt;p&gt;En nuestro caso, sea el siguiente programa: &lt;br /&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;span style="color:Blue;font-family:Courier New;font-size:11px;background-color:White;"&gt;using&lt;/span&gt; System;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:Blue;font-family:Courier New;font-size:11px;background-color:White;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;font-family:Courier New;font-size:11px;background-color:White;"&gt;class&lt;/span&gt; MusicStar {&lt;br /&gt;	&lt;span style="color:Blue;font-family:Courier New;font-size:11px;background-color:White;"&gt;string&lt;/span&gt; name;&lt;br /&gt;	Style style;&lt;br /&gt;&lt;br /&gt;	&lt;span style="color:Blue;font-family:Courier New;font-size:11px;background-color:White;"&gt;protected&lt;/span&gt; MusicStar() {&lt;br /&gt;		&lt;span style="color:Green;font-family:Courier New;font-size:11px;background-color:White;"&gt;// utilizado solo para las herencias&lt;br /&gt;&lt;/span&gt;	}&lt;br /&gt;&lt;br /&gt;	&lt;span style="color:Blue;font-family:Courier New;font-size:11px;background-color:White;"&gt;public&lt;/span&gt; MusicStar(String name, Style style) {&lt;br /&gt;		&lt;span style="color:Blue;font-family:Courier New;font-size:11px;background-color:White;"&gt;this&lt;/span&gt;.name &lt;span style="color:Red;font-family:Courier New;font-size:11px;background-color:White;"&gt;=&lt;/span&gt; name;&lt;br /&gt;		&lt;span style="color:Blue;font-family:Courier New;font-size:11px;background-color:White;"&gt;this&lt;/span&gt;.style &lt;span style="color:Red;font-family:Courier New;font-size:11px;background-color:White;"&gt;=&lt;/span&gt; style;&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt; 	&lt;span style="color:Blue;font-family:Courier New;font-size:11px;background-color:White;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;font-family:Courier New;font-size:11px;background-color:White;"&gt;override&lt;/span&gt; &lt;span style="color:Blue;font-family:Courier New;font-size:11px;background-color:White;"&gt;string&lt;/span&gt; ToString() {&lt;br /&gt;		&lt;span style="color:Blue;font-family:Courier New;font-size:11px;background-color:White;"&gt;return&lt;/span&gt; &lt;span style="font-family:Courier New;font-size:11px;"&gt;&amp;quot;nombre: &amp;quot;&lt;/span&gt; &lt;span style="color:Red;font-family:Courier New;font-size:11px;background-color:White;"&gt;+&lt;/span&gt; name &lt;span style="color:Red;font-family:Courier New;font-size:11px;background-color:White;"&gt;+&lt;/span&gt; &lt;span style="font-family:Courier New;font-size:11px;"&gt;&amp;quot; (estilo:&amp;quot;&lt;/span&gt; &lt;span style="color:Red;font-family:Courier New;font-size:11px;background-color:White;"&gt;+&lt;/span&gt; style &lt;span style="color:Red;font-family:Courier New;font-size:11px;background-color:White;"&gt;+&lt;/span&gt; &lt;span style="font-family:Courier New;font-size:11px;"&gt;&amp;quot;)&amp;quot;&lt;/span&gt;;&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	&lt;span style="color:Blue;font-family:Courier New;font-size:11px;background-color:White;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;font-family:Courier New;font-size:11px;background-color:White;"&gt;class&lt;/span&gt; Style {&lt;br /&gt;		&lt;span style="color:Blue;font-family:Courier New;font-size:11px;background-color:White;"&gt;string&lt;/span&gt; stylename;&lt;br /&gt;&lt;br /&gt;		&lt;span style="color:Blue;font-family:Courier New;font-size:11px;background-color:White;"&gt;public&lt;/span&gt; Style() { &lt;br /&gt;		}&lt;br /&gt;&lt;br /&gt;		&lt;span style="color:Blue;font-family:Courier New;font-size:11px;background-color:White;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;font-family:Courier New;font-size:11px;background-color:White;"&gt;void&lt;/span&gt; SetStyleName(&lt;span style="color:Blue;font-family:Courier New;font-size:11px;background-color:White;"&gt;string&lt;/span&gt; name) { &lt;br /&gt;			&lt;span style="color:Blue;font-family:Courier New;font-size:11px;background-color:White;"&gt;this&lt;/span&gt;.stylename &lt;span style="color:Red;font-family:Courier New;font-size:11px;background-color:White;"&gt;=&lt;/span&gt; name; &lt;br /&gt;		}&lt;br /&gt;&lt;br /&gt;		&lt;span style="color:Blue;font-family:Courier New;font-size:11px;background-color:White;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;font-family:Courier New;font-size:11px;background-color:White;"&gt;override&lt;/span&gt; &lt;span style="color:Blue;font-family:Courier New;font-size:11px;background-color:White;"&gt;string&lt;/span&gt; ToString() { &lt;br /&gt;			&lt;span style="color:Blue;font-family:Courier New;font-size:11px;background-color:White;"&gt;return&lt;/span&gt; stylename; &lt;br /&gt;		}&lt;br /&gt;	}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color:Blue;font-family:Courier New;font-size:11px;background-color:White;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;font-family:Courier New;font-size:11px;background-color:White;"&gt;class&lt;/span&gt; HardRockStar : MusicStar {&lt;br /&gt;&lt;br /&gt;	&lt;span style="color:Blue;font-family:Courier New;font-size:11px;background-color:White;"&gt;public&lt;/span&gt; HardRockStar(String name, Style style) : &lt;span style="color:Blue;font-family:Courier New;font-size:11px;background-color:White;"&gt;base&lt;/span&gt;(name, style) {&lt;br /&gt;		&lt;span style="color:Blue;font-family:Courier New;font-size:11px;background-color:White;"&gt;if&lt;/span&gt;(style.ToString() !&lt;span style="color:Red;font-family:Courier New;font-size:11px;background-color:White;"&gt;=&lt;/span&gt; &lt;span style="font-family:Courier New;font-size:11px;"&gt;&amp;quot;Hard Rock&amp;quot;&lt;/span&gt;) {&lt;br /&gt;			throw &lt;span style="color:Blue;font-family:Courier New;font-size:11px;background-color:White;"&gt;new&lt;/span&gt; ArgumentException(&lt;br /&gt;				&lt;span style="font-family:Courier New;font-size:11px;"&gt;&amp;quot;Nada de mariconadas! Solo me gusta el rock!&amp;quot;&lt;/span&gt;);&lt;br /&gt;		} &lt;br /&gt;	}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color:Blue;font-family:Courier New;font-size:11px;background-color:White;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;font-family:Courier New;font-size:11px;background-color:White;"&gt;class&lt;/span&gt; Changes {&lt;br /&gt;	&lt;br /&gt;	&lt;span style="color:Blue;font-family:Courier New;font-size:11px;background-color:White;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;font-family:Courier New;font-size:11px;background-color:White;"&gt;static&lt;/span&gt; &lt;span style="color:Blue;font-family:Courier New;font-size:11px;background-color:White;"&gt;void&lt;/span&gt; Main(String[] args) {&lt;br /&gt;		MusicStar.Style style &lt;span style="color:Red;font-family:Courier New;font-size:11px;background-color:White;"&gt;=&lt;/span&gt; &lt;span style="color:Blue;font-family:Courier New;font-size:11px;background-color:White;"&gt;new&lt;/span&gt; MusicStar.Style();&lt;br /&gt;&lt;br /&gt;		style.SetStyleName(&lt;span style="font-family:Courier New;font-size:11px;"&gt;&amp;quot;Hard Rock&amp;quot;&lt;/span&gt;);&lt;br /&gt;		HardRockStar slash &lt;span style="color:Red;font-family:Courier New;font-size:11px;background-color:White;"&gt;=&lt;/span&gt; &lt;span style="color:Blue;font-family:Courier New;font-size:11px;background-color:White;"&gt;new&lt;/span&gt; HardRockStar(&lt;span style="font-family:Courier New;font-size:11px;"&gt;&amp;quot;Slash&amp;quot;&lt;/span&gt;, style);&lt;br /&gt;&lt;br /&gt;		style.SetStyleName(&lt;span style="font-family:Courier New;font-size:11px;"&gt;&amp;quot;CutrePop&amp;quot;&lt;/span&gt;);&lt;br /&gt;		MusicStar paulina &lt;span style="color:Red;font-family:Courier New;font-size:11px;background-color:White;"&gt;=&lt;/span&gt; &lt;span style="color:Blue;font-family:Courier New;font-size:11px;background-color:White;"&gt;new&lt;/span&gt; MusicStar(&lt;span style="font-family:Courier New;font-size:11px;"&gt;&amp;quot;Paulina Rubio&amp;quot;&lt;/span&gt;, style);&lt;br /&gt;		MusicStar marta &lt;span style="color:Red;font-family:Courier New;font-size:11px;background-color:White;"&gt;=&lt;/span&gt; &lt;span style="color:Blue;font-family:Courier New;font-size:11px;background-color:White;"&gt;new&lt;/span&gt; MusicStar(&lt;span style="font-family:Courier New;font-size:11px;"&gt;&amp;quot;Marta Sanchez&amp;quot;&lt;/span&gt;, style);&lt;br /&gt;&lt;br /&gt;		Console.WriteLine(&lt;span style="font-family:Courier New;font-size:11px;"&gt;&amp;quot;nuestras estrellas de esta noche son:&amp;quot;&lt;/span&gt;);&lt;br /&gt;		Console.WriteLine(slash.ToString());&lt;br /&gt;		Console.WriteLine(paulina.ToString());&lt;br /&gt;		Console.WriteLine(marta.ToString());&lt;br /&gt;	}&lt;br /&gt;}&lt;/pre&gt;

&lt;p&gt;&lt;b&gt;&lt;font color="#009966"&gt;¿Cual seria la salida al ejecutar la funcion principal (Main) de MainProgram? ¿Por que?&lt;/font&gt;&lt;/b&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;NOTA: para el que quiera alguna pista adicional, aqui os dejo dos en forma de videos: &lt;a href="http://youtube.com/watch?v=gR3wpUtgdQU" target="_blank"&gt;Paulina&lt;/a&gt; y &lt;a href="http://youtube.com/watch?v=_Xvl2Vy1pzA" target="_blank"&gt;Marta&lt;/a&gt; (para ahorraros el tiempo de ver el resto de la basurilla musical, os recomiendo pasar directamente a los minutos 2:30 y 2:45 respectivamente)&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;ACTUALIZACION:&lt;/b&gt; me di cuenta tarde que habia pegado la version del codigo que no era! Os he dejado la version actualizada, pero abajo pongo un comentario para los que ya os animasteis a enviar respuestas. Mil perdones!&amp;nbsp;&lt;/p&gt;
&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=44478" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/programancia101/archive/tags/basico/default.aspx">basico</category><category domain="http://geeks.ms/blogs/programancia101/archive/tags/puzzler/default.aspx">puzzler</category><category domain="http://geeks.ms/blogs/programancia101/archive/tags/depuracion/default.aspx">depuracion</category></item><item><title>todos por igual</title><link>http://geeks.ms/blogs/programancia101/archive/2007/10/16/todos-por-igual.aspx</link><pubDate>Tue, 16 Oct 2007 13:30:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:41515</guid><dc:creator>phobeo</dc:creator><slash:comments>14</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/programancia101/rsscomments.aspx?PostID=41515</wfw:commentRss><comments>http://geeks.ms/blogs/programancia101/archive/2007/10/16/todos-por-igual.aspx#comments</comments><description>&lt;p&gt;Este es otro problema de algoritmia generica, antes de que sigamos analizando algoritmos y tecnicas de diseño, para intentar pensar &amp;quot;out-of-the-box&amp;quot;. &lt;/p&gt;&lt;p&gt;Imaginemos que tenemos un &lt;b&gt;array de enteros, de tamaño K&lt;/b&gt;, y un &lt;b&gt;flujo del que vamos leyendo enteros, hasta un numero N&lt;/b&gt;. No conocemos N de antemano, pero sabemos que sera &lt;b&gt;igual o mayor que K&lt;/b&gt;. Lo que queremos es tener en nuestro array de K posiciones una &lt;b&gt;muestra equiprobable&lt;/b&gt; de los enteros del flujo.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;¿Que quiere decir esto? Imaginemos que nuestro array tiene K=5 elementos y supongamos una notacion (a-b-c) para un flujo que contenga los elementos a, b y c.&lt;br /&gt;&lt;br /&gt;Si nuestro flujo fuera todo de unos, como en (1-1-1-1-1-1-1), nuestro array final debe contener 5 unos siempre. &lt;br /&gt;&lt;br /&gt;Si en cambio nuestro flujo fuera algo como (1-1-1-1-2-1-1-1-1-2), debe haber 4 veces mas posibilidades de tener unos que doses, con lo que nuestros posibles resultados serian: un array con todo unos (aproximadamente un 22.2% de las veces), un array con 4 unos y 1 dos (el dos puede estar en distintas posiciones, pero ocurrira aproximadamente un 55.6% de las veces) y un array con 3 unos y 2 doses (de nuevo pudiendo estar los doses en distintas posiciones, y que ocurrira aproximadamente el 22.2% de las veces) &lt;/p&gt;

&lt;p align="center"&gt;&lt;img src="http://geeks.ms/photos/programancia101/images/41520/original.aspx" border="0" alt="" /&gt;
&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;Supongamos que nuestro flujo de entrada esta modelado mediante las funciones:&lt;br /&gt;&lt;br /&gt;- &lt;b&gt;boolean hasNext()&lt;/b&gt;: devuelve true si quedan elementos por leer, false en otro caso&lt;br /&gt;- &lt;b&gt;int getNext()&lt;/b&gt;: obtiene el siguiente entero del flujo mientras queden elementos, o un valor indeterminado en otro caso&lt;br /&gt;&lt;br /&gt;Dado un numero K de posiciones para el array, y un flujo de entrada de longitud N indeterminada (pero finita):&lt;font color="#009966"&gt;&lt;b&gt; &lt;/b&gt;&lt;/font&gt;&lt;b&gt;&lt;font color="#009966"&gt;¿serias capaz de construir el algoritmo para devolver una muestra equiprobable tal como la hemos definido anteriormente?&lt;/font&gt;&lt;/b&gt; &lt;/p&gt;

&lt;p&gt;&lt;b&gt;nota:&lt;/b&gt; las funciones que modelan el flujo estan dadas en notacion estilo C. Podeis cambiarlas a algo apropiado en el lenguaje que utiliceis, siempre y cuando conserven la semantica, claro&amp;nbsp;&lt;/p&gt;
&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=41515" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/programancia101/archive/tags/medio/default.aspx">medio</category><category domain="http://geeks.ms/blogs/programancia101/archive/tags/algoritmos/default.aspx">algoritmos</category></item><item><title>ejercicio y números confusos</title><link>http://geeks.ms/blogs/programancia101/archive/2007/10/04/ejercicio-y-numeros-confusos.aspx</link><pubDate>Thu, 04 Oct 2007 09:19:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:39490</guid><dc:creator>phobeo</dc:creator><slash:comments>13</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/programancia101/rsscomments.aspx?PostID=39490</wfw:commentRss><comments>http://geeks.ms/blogs/programancia101/archive/2007/10/04/ejercicio-y-numeros-confusos.aspx#comments</comments><description>&lt;p&gt;Supongo que no hace falta que os diga que el ejercicio es bueno para la salud. Todo el mundo deberia practicarlo a menudo: te hace sentir bien, te pones menos enfermo... A mi hasta me parece que piensas mejor si haces ejercicio de cuando en cuando! Y eso sin contar con que supone una muy buena &amp;quot;desconexion&amp;quot; del mundo, que ayuda a dar otro punto de vista a las cosas. &lt;br /&gt;&lt;br /&gt;Yo suelo tener por costumbre hacer ejercicio a mediodia, antes de la hora de comer. Despues de la jornada de la mañana, una pausa para nadar te da una hora de relajacion que ademas puedes aprovechar al volver para repensar aquello en lo que estabas trabajando.. y a veces darle a las cosas un giro en el que no habias caido antes. &lt;br /&gt;&lt;br /&gt;De hecho, este problema se me ocurrio en una de estas visitas a la piscina antes de trabajar, y tiene que ver bastante con &amp;quot;cambiar el punto de vista&amp;quot;. A ver que os parece:&lt;br /&gt;&lt;br /&gt;En el centro al que yo voy, como en muchos otros, hay un sistema de taquillas para dejar la bolsa mientras nadas. simplemente pides una taquilla en la puerta y te dan una llavecita con un numero. Vas a la taquilla, dejas tus cosas, cierras, te vas a nadar y posiblemente cuando vuelvas aun este todo alli. El caso esta en que esa tarde a mi me dieron la llave numero 89. Yo fui tan contento a cambiarme y cuando estaba buscando... me di cuenta que solo veia 80 taquillas. &lt;br /&gt;&lt;br /&gt;&lt;i&gt;&amp;quot;Se me debe estar pasando algo&amp;quot;&lt;/i&gt;, me dije. Conte el numero de armarios, vi cuantas taquillas cabian... y no, no podia ser. Ademas, no hay mas sitio para armarios. &lt;i&gt;&amp;quot;¿Sera que a lo mejor a partir de la 80 estan en el vestuario de las chicas y me han dado la llave que no es?&amp;quot;&lt;/i&gt; Estaba yo pensando en dar la vuelta e ir a preguntar a recepcion cuando me dije... &lt;i&gt;&amp;quot;mmm... dar la vuelta... podia ser...&amp;quot;&lt;/i&gt; Y claro, es que un llavero no tiene un derecho ni un reves, y los numeros escritos a mano son dificiles de leer, asi que mi llave numero 89, dada la vuelta, bien podria ser la numero 68, ¿no? Pues efectivamente... ¡asi de simple era! Asi que abri mi taquilla, deje mis cosas y me fui a nadar&lt;/p&gt;
&lt;p align="center"&gt;&lt;img src="http://geeks.ms/photos/programancia101/images/39489/original.aspx" border="0" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Pero claro, ya iba pensando en lo siguiente: imaginemos que hacemos un sistema de OCR limitado, que usaremos para &lt;b&gt;reconocer numeros&lt;/b&gt; a partir de imagenes de video. Como &lt;b&gt;no conocemos la orientacion&lt;/b&gt; de la camara, esos numeros podrian estar en un momento cualquiera tanto al derecho como al reves. Asi, esfacil leer un 6 como si fuera un 9, o viceversa. Ademas, si estos numeros estan escritos a mano y las imagenes son de baja resolucion &lt;b&gt;es facil confundir&lt;/b&gt; algunos incluso sin tener orientacion: por ejemplo el 8 con el 0 (especialmente si escribis el cero con una barra cruzada, como yo)&lt;br /&gt;&lt;br /&gt;Imaginemos entonces que hemos definido las siguientes posibles confusiones:&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;0 se puede confundir con 8, tanto al derecho como al reves&lt;/li&gt;
&lt;li&gt;1 se puede confundir con 7, tanto al derecho como al reves&lt;/li&gt;
&lt;li&gt;2 se puede confundir con 7, al reves&lt;/li&gt;
&lt;li&gt;3 se puede confundir con 8, tanto al derecho como al reves&lt;/li&gt;
&lt;li&gt;4 y 5 no se confunden con nada, son asi de majos&lt;/li&gt;
&lt;li&gt;6 se puede confundir con 9, al reves&lt;/li&gt;

&lt;li&gt;7 se puede confundir con 1, tanto al derecho como al reves, y con 2, al reves&lt;/li&gt;
&lt;li&gt;8 se puede confundir con 0 y con 3, tanto al derecho como al reves&lt;/li&gt;
&lt;li&gt;9 se puede confundir con 6, al reves&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;&lt;font color="#009966"&gt;¿Podrias crear una funcion que reciba un array de caracteres con lo que hemos leido del OCR y devuelva un array de enteros con todos los posibles valores que pueden representar leidos al derecho o al reves (si se puede), teniendo en cuenta que pueden ocurrir las confusiones que hemos citado antes?&lt;/font&gt;&lt;/b&gt; En el ejemplo de mi llave de la taquilla, recibiriamos el array [&amp;#39;8&amp;#39;,&amp;#39;9&amp;#39;] y tendriamos que devolver [89, 68, 09, 60, 39, 63] &lt;br /&gt;&lt;br /&gt;Suponemos que la entrada siempre es un array de caracteres que representa un numero entero positivo.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=39490" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/programancia101/archive/tags/medio/default.aspx">medio</category><category domain="http://geeks.ms/blogs/programancia101/archive/tags/algoritmos/default.aspx">algoritmos</category><category domain="http://geeks.ms/blogs/programancia101/archive/tags/general/default.aspx">general</category></item><item><title>el bug de multiplicacion de Excel 2007</title><link>http://geeks.ms/blogs/programancia101/archive/2007/09/28/el-bug-de-multiplicacion-de-Excel-2007.aspx</link><pubDate>Thu, 27 Sep 2007 23:14:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:37944</guid><dc:creator>phobeo</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/programancia101/rsscomments.aspx?PostID=37944</wfw:commentRss><comments>http://geeks.ms/blogs/programancia101/archive/2007/09/28/el-bug-de-multiplicacion-de-Excel-2007.aspx#comments</comments><description>
&lt;p&gt;Acabo de aterrizar de Ibiza de unas minivacaciones impresionantes (y en las cuales de paso he escrito un par de problemas nuevos para programancia101!) asi que no he podido seguir en directo la serie de articulos que han aparecido en la blogosfera acerca de un bug en Excel 2007. Afortunadamente, mi amigo &lt;a href="http://www.elladodelmal.com" target="_blank"&gt;Chema &amp;quot;el maligno&amp;quot;&lt;/a&gt; me ha mandado un correito para asegurarse que nos haciamos eco de esta noticia.&lt;/p&gt;

&lt;p&gt;&amp;nbsp;Para los que no lo hayais visto ya, resulta que se ha encontrado un &lt;a href="http://groups.google.com/group/microsoft.public.excel/browse_thread/thread/2bcad1a1a4861879/2f8806d5400dfe22?hl=en#2f8806d5400dfe22" target="_blank"&gt;pequeño bug en Excel 2007&lt;/a&gt; (&lt;a href="http://www.microsiervos.com/archivo/ordenadores/bug-excel-2007.html" target="_blank"&gt;noticia en español en Microsiervos&lt;/a&gt;) con algunas multiplicaciones. Podeis encontrar mas ejemplillos por la web, pero el aviso original se referia a la multiplicacion 850 * 77.1, que en vez de 65535, que es el &lt;a href="http://www.google.es/search?q=850*77.1" target="_blank"&gt;resultado correcto&lt;/a&gt;, se muestra como 100000.&lt;/p&gt;
&lt;p align="center"&gt;&lt;a href="http://es.wikipedia.org/wiki/%C3%81baco_neperiano" target="_blank"&gt;&amp;nbsp;&lt;img src="http://geeks.ms/photos/programancia101/images/37959/original.aspx" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Como buenos lectores de programancia101 y revisando algunos de nuestros articulos anteriores (como &lt;a href="http://geeks.ms/blogs/programancia101/archive/2007/01/31/numeros-bestias-y-descuentos.aspx" target="_blank"&gt;este&lt;/a&gt; y &lt;a href="http://geeks.ms/blogs/programancia101/archive/2007/02/01/expansiones-infinitas.aspx" target="_blank"&gt;este&lt;/a&gt;), &lt;b&gt;&lt;font color="#009966"&gt;seriais capaces de adivinar cual es la hipotesis razonable mas probable que puede causar este tipo de fallo?&lt;/font&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;Para los que quieran directamente &amp;quot;la solucion&amp;quot;, podeis mirar &lt;a href="http://blogs.msdn.com/excel/archive/2007/09/25/calculation-issue-update.aspx" target="_blank"&gt;este post del equipo de Excel&lt;/a&gt;, que se puso manos a la obra para arreglarlo el dia despues del aviso.&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=37944" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/programancia101/archive/tags/avanzado/default.aspx">avanzado</category><category domain="http://geeks.ms/blogs/programancia101/archive/tags/tipos+de+datos/default.aspx">tipos de datos</category><category domain="http://geeks.ms/blogs/programancia101/archive/tags/depuracion/default.aspx">depuracion</category><category domain="http://geeks.ms/blogs/programancia101/archive/tags/ingenieria+inversa/default.aspx">ingenieria inversa</category><category domain="http://geeks.ms/blogs/programancia101/archive/tags/ejemplo+real/default.aspx">ejemplo real</category></item><item><title>arrejuntando listas</title><link>http://geeks.ms/blogs/programancia101/archive/2007/09/19/arrejuntando-listas.aspx</link><pubDate>Wed, 19 Sep 2007 10:15:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:35591</guid><dc:creator>phobeo</dc:creator><slash:comments>17</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/programancia101/rsscomments.aspx?PostID=35591</wfw:commentRss><comments>http://geeks.ms/blogs/programancia101/archive/2007/09/19/arrejuntando-listas.aspx#comments</comments><description>&lt;p&gt;Antes de que nadie me comente nada: prometo que &amp;quot;arrejuntarse&amp;quot; es un verbo español perfectamente valido! Pese a que suene un poco &amp;quot;brutito&amp;quot; en realidad se refiere a vivir vida de casados sin estarlo. Tengo de hecho un par de amigos que estaban haciendo eso mismo hasta que hace unos meses &lt;strike&gt;se les fue la pinza&lt;/strike&gt; cambiaron de idea y decidieron casarse, asi que este finde nos tocara boda! (y vistos los ejemplos de &lt;a href="http://geeks.ms/blogs/unai/" target="_blank"&gt;algunos&lt;/a&gt; &lt;a href="http://geeks.ms/blogs/pablo/default.aspx" target="_blank"&gt;miembros&lt;/a&gt; de geeks, parece que este año hay &lt;strike&gt;ida de olla general&lt;/strike&gt; tendencia al tema)&lt;/p&gt;

&lt;p&gt;Pero en fin, nosotros a lo que es el codigo, que es lo nuestro...&lt;/p&gt;
&lt;p align="center"&gt;&amp;nbsp;&lt;img src="http://geeks.ms/photos/programancia101/images/35592/original.aspx" border="0" alt="" /&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;&amp;nbsp;Vamos a proponer hoy un par de variaciones de problemas con listas:&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;Para empezar, imaginemos que tenemos &lt;b&gt;dos listas previamente ordenadas&lt;/b&gt; y que queremos generar una tercera lista que tenga &lt;b&gt;todos los elementos&lt;/b&gt; de las dos anteriores, pero &lt;b&gt;tambien ordenados&lt;/b&gt;. Asi por ejemplo si una lista es (1,4,7) y la otra (2,5,6) el resultado debe ser la lista (1,2,4,5,6,7)&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;font color="#009966"&gt;Podrias escribir una funcion que reciba como entrada las dos listas y que devuelva la lista resultante&lt;/font&gt;&lt;/b&gt;, segun la descripcion anterior? &lt;b&gt;&lt;font color="#009966"&gt;Se te ocurre una forma de crear una funcion generalizada que haga lo mismo para un numero N de listas?&lt;/font&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;Y ahora imaginemos que tenemos un sentido del orden un poco extraño, y que lo que queremos es ordenar las listas de modo que en la lista resultado &lt;b&gt;los elementos impares esten ordenados ascendentemente partiendo desde el centro y hacia la izquierda, y los pares desde el centro, hacia la derecha&lt;/b&gt;. Es decir, en el ejemplo anterior con (1,4,7) y (2,5,6) nuestro resultado deberia ser (7,5,1,2,4,6)&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;font color="#009966"&gt;Podrias escribir una funcion que cree la lista resultante en este caso?&lt;/font&gt;&lt;/b&gt;&lt;/p&gt;
&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=35591" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/programancia101/archive/tags/medio/default.aspx">medio</category><category domain="http://geeks.ms/blogs/programancia101/archive/tags/algoritmos/default.aspx">algoritmos</category><category domain="http://geeks.ms/blogs/programancia101/archive/tags/basico/default.aspx">basico</category></item><item><title>que tal vuestra vuelta al cole?</title><link>http://geeks.ms/blogs/programancia101/archive/2007/09/14/que-tal-vuestra-vuelta-al-cole.aspx</link><pubDate>Fri, 14 Sep 2007 07:49:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:34526</guid><dc:creator>phobeo</dc:creator><slash:comments>5</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/programancia101/rsscomments.aspx?PostID=34526</wfw:commentRss><comments>http://geeks.ms/blogs/programancia101/archive/2007/09/14/que-tal-vuestra-vuelta-al-cole.aspx#comments</comments><description>&lt;p&gt;Buenas a todos!&lt;/p&gt;&lt;p&gt;Esto no es ninguna noticia pero... se acabaron las vacaciones! Agh! Que sufrir! Hay que volver al trabajo, verle la cara al jefe otra vez, reunirnos con unos clientes que necesitan algo &amp;quot;para ya&amp;quot; porque se les ha ido el verano y nadie se acordaba que habia que entregar en septiembre, pasar la semana releyendo el codigo que dejamos &amp;quot;a medias&amp;quot; y que no recordamos muy bien lo que hace porque con las prisas se nos &amp;quot;olvido&amp;quot; documentar y comentar... os suena? (el caso peor de esto ultimo es cuando al volver miras tu codigo y dices: &amp;quot;seguro que esto lo escribi yo?&amp;quot;)&lt;/p&gt;&lt;p&gt;Para haceroslo mas leve, os recomiendo que empeceis leyendo algo gracioso como &lt;a href="http://cm.bell-labs.com/cm/cs/who/dmr/odd.html" target="_blank"&gt;este clasico sobre comentarios en el sistema UNIX&lt;/a&gt; (que incluye uno de mis favoritos: &amp;quot;no hace falta que entiendas esto&amp;quot; };D) Si conoceis algun otro ejemplo, de esos dignos de salir en &lt;a href="http://worsethanfailure.com/"&gt;worsethanfailure.com&lt;/a&gt;... compartidlo!&lt;br /&gt;&lt;/p&gt;&lt;p&gt;En fin, solo queria avisar que en breve comenzamos el nuevo curso en programancia101, con nuevos problemas de todos los niveles y los ocasionales truquitos divertidos. Este curso ademas contaremos con un par de &amp;quot;articulos invitados&amp;quot; y algunas recomendaciones de libros. Y por supuesto, si teneis alguna otra idea que podamos añadir, hacedmelo saber! }:)&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Feliz vuelta al cole!&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=34526" width="1" height="1"&gt;</description></item><item><title>volvemos a la carga: rellenando espacios</title><link>http://geeks.ms/blogs/programancia101/archive/2007/05/16/volvemos-a-la-carga_3A00_-rellenando-espacios.aspx</link><pubDate>Wed, 16 May 2007 09:50:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:14752</guid><dc:creator>phobeo</dc:creator><slash:comments>18</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/programancia101/rsscomments.aspx?PostID=14752</wfw:commentRss><comments>http://geeks.ms/blogs/programancia101/archive/2007/05/16/volvemos-a-la-carga_3A00_-rellenando-espacios.aspx#comments</comments><description>&lt;P&gt;Hola de nuevo, crases! Mil perdones por mi desconexion del mundo estas ultimas semanas. He tenido algunos lios que atender que han ido postponiendo la publicacion de mas problemas. La buena noticia es que me ha dado tiempo a pensar algunos problemas mas asi que... espero resarcirme publicando a un ritmo mas acelerado en los proximos dias!&lt;/P&gt;
&lt;P&gt;Como deciamos en los ultimos posts, habia pensado seguir con algunos ejercicios de algoritmia basica y que nos permitan repasar conceptos como la ordenacion, la insercion y distintas tecnicas que nos serviran mas adelante. Para empezar a calentar despues de esta pausa, os propongo un problema sencillo:&lt;/P&gt;
&lt;P&gt;Imaginemos que tenemos un &lt;STRONG&gt;array de caracteres&lt;/STRONG&gt; que representa una cadena de texto&amp;nbsp;formada por palabras &lt;STRONG&gt;separadas por espacios&lt;/STRONG&gt;. Imaginemos que tenemos una cantidad &lt;STRONG&gt;N de caracteres de subrayado&lt;/STRONG&gt; ('_') por los que queremos sustituir los espacios, de una forma uniforme. Es decir: si tenemos los caracteres que representan &lt;EM&gt;"una frase cualquiera"&lt;/EM&gt; y tenemos 4 caracteres de subrayado, querriamos algo como &lt;EM&gt;"una__frase__cualquiera"&lt;/EM&gt; (2 signos de subrayado por espacio). Si solo tuvieramos 3 caracteres, tanto &lt;EM&gt;"una_frase__cualquiera"&lt;/EM&gt; (un subrayado primero, dos en el segundo) como &lt;EM&gt;"una__frase_cualquiera"&lt;/EM&gt;&amp;nbsp; (dos subrayados en el primero, uno en el segundo) serian validas.&lt;/P&gt;
&lt;P align=center&gt;&lt;IMG src="http://geeks.ms/photos/programancia101/images/14755/original.aspx" border=0&gt;&lt;BR&gt;&lt;FONT color=#d3d3d3 size=1&gt;taken from &lt;/FONT&gt;&lt;A href="http://flickr.com/photos/ashleylynn/252023013/"&gt;&lt;FONT color=#d3d3d3 size=1&gt;http://flickr.com/photos/ashleylynn/252023013/&lt;/FONT&gt;&lt;/A&gt;&lt;FONT color=#d3d3d3 size=1&gt;)&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;Asi que en resumidas cuentas:&amp;nbsp;&lt;FONT color=#009966&gt;&lt;STRONG&gt;podrias escribir una funcion que dado el array de caracteres que representa la cadena, y un numero N de caracteres de subrayado, devuelva la cadena resultante de sustituir los espacios por subrayados de forma uniforme? &lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#009966&gt;&lt;FONT color=#000000&gt;Si quieres complicarlo un poco mas podrias intentar tambien &lt;/FONT&gt;&lt;STRONG&gt;&lt;FONT color=#009966&gt;devolver todas las posibles cadenas (si hay mas de una)&amp;nbsp;&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Actualizacion:&lt;/STRONG&gt;&amp;nbsp;Parece ser que no me explique del todo bien en este problema, lo siento. Para que no haya equivocos sobre&amp;nbsp;que quiere decir "distribucion uniforme" una definicion "formal" seria: no puede haber una diferencia de mas de 1 entre el numero de subrayados que asignamos a cada espacio. Asi por ejemplo:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Si tenemos &lt;EM&gt;"frase con tres espacios"&lt;/EM&gt; y 7 signos de subrayado,&amp;nbsp;la distribucion &lt;EM&gt;"frase__con__tres___espacios"&lt;/EM&gt;&amp;nbsp;(2 al primero, 2 al segundo y 3 al tercero) es uniforme, pero la distribucion &lt;EM&gt;"frase___con___tres_espacios"&lt;/EM&gt; (3 al primero, 3 al segundo y uno al tercero) no lo es&lt;/LI&gt;
&lt;LI&gt;Si tenemos &lt;EM&gt;"frase mas larga que la anterior",&lt;/EM&gt; la distribucion&lt;EM&gt; "frase_mas_larga_que__la__anterior"&lt;/EM&gt; (1-1-1-2-2 signos de subrayado) es uniforme, pero la distribucion &lt;EM&gt;"frase___mas_larga_que_la_anterior"&lt;/EM&gt; (3-1-1-1-1 signos de subrayado) no lo es&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Asimismo, para efectos de "precondiciones" podeis suponer que la frase siempre tiene al menos un espacio, y que solo hay un espacio entre palabra y palabra.&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=14752" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/programancia101/archive/tags/algoritmos/default.aspx">algoritmos</category><category domain="http://geeks.ms/blogs/programancia101/archive/tags/basico/default.aspx">basico</category></item><item><title>dandole al interruptor</title><link>http://geeks.ms/blogs/programancia101/archive/2007/03/09/dandole-al-interruptor.aspx</link><pubDate>Fri, 09 Mar 2007 00:33:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:11488</guid><dc:creator>phobeo</dc:creator><slash:comments>11</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/programancia101/rsscomments.aspx?PostID=11488</wfw:commentRss><comments>http://geeks.ms/blogs/programancia101/archive/2007/03/09/dandole-al-interruptor.aspx#comments</comments><description>&lt;P&gt;El fin de semana pasado&amp;nbsp;prometi a varios amigos que de esta semana no pasaba que publicara un nuevo problemilla de programancia101, porque ya veo que a la que uno se descuida, le sale competencia! Mirad si no a mi camarada&amp;nbsp;Kartones, que se esta animando &lt;A href="http://kartones.net/blogs/kartones/archive/2007/03/07/puzzles.aspx"&gt;a publicar problemas&lt;/A&gt; en su blog.&lt;/P&gt;
&lt;P&gt;Como me ha gustado la idea, se me ha ocurrido dejar otro problema que podeis resolver con un algoritmo sencillito, o bien usando "trucos": &lt;/P&gt;
&lt;P align=center&gt;&lt;A href="http://geeks.ms/photos/programancia101/picture11487.aspx" target=_blank&gt;&lt;IMG src="http://geeks.ms/photos/programancia101/images/11487/original.aspx" border=0&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Imaginemos que tenemos una fila con &lt;STRONG&gt;64 interruptores&lt;/STRONG&gt;, cada uno de los cuales conectamos a una bombilla. Supongamos que partimos de una posicion en la que &lt;STRONG&gt;todas las bombillas estan apagadas&lt;/STRONG&gt; y procedemos a pasar por todas ellas y &lt;STRONG&gt;cambiar el estado del interruptor&lt;/STRONG&gt;. Una vez hecho esto, volvemos al principio y volvemos a cambiar la posicion del interruptor pero solo para las bombillas en posiciones que sean &lt;STRONG&gt;multiplos de 2&lt;/STRONG&gt; (la segunda, la cuarta, la sexta, ...) De nuevo volvemos al principio y volvemos a cambiar la posicion del interruptor pero solo para posiciones &lt;STRONG&gt;multiplos de 3&lt;/STRONG&gt; (la tercera, la sexta, la novena, ...) Y seguimos repitiendo el procedimiento para posiciones multiplos de 4, de 5, de 6... asi hasta los multiplos de 64.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT color=#009966&gt;Que algoritmo usarias para saber&amp;nbsp;cuales de las bombillas permaneceran encendidas al terminar?&lt;/FONT&gt;&lt;/STRONG&gt;&amp;nbsp;Y, si te apetece complicarte un poco mas:&amp;nbsp;&lt;STRONG&gt;&lt;FONT color=#009966&gt;Como podriamos hacerlo utilizando la menor cantidad de memoria posible?&amp;nbsp; &lt;/FONT&gt;&lt;/STRONG&gt;&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=11488" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/programancia101/archive/tags/medio/default.aspx">medio</category><category domain="http://geeks.ms/blogs/programancia101/archive/tags/algoritmos/default.aspx">algoritmos</category><category domain="http://geeks.ms/blogs/programancia101/archive/tags/basico/default.aspx">basico</category></item><item><title>ordenando a montones</title><link>http://geeks.ms/blogs/programancia101/archive/2007/02/14/ordenando-a-montones.aspx</link><pubDate>Wed, 14 Feb 2007 12:45:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:10367</guid><dc:creator>phobeo</dc:creator><slash:comments>11</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/programancia101/rsscomments.aspx?PostID=10367</wfw:commentRss><comments>http://geeks.ms/blogs/programancia101/archive/2007/02/14/ordenando-a-montones.aspx#comments</comments><description>&lt;p&gt;Como algunos de vosotros sabreis, esta semana tengo a&amp;nbsp;&lt;a href="http://elladodelmal.blogspot.com"&gt;Chema&lt;/a&gt; de visita en casa, asi que escribir se nos esta haciendo mucho mas dificil (porque claro, la fiesta y los blogs no son muy compatibles). Sin embargo, tenia pensado empezar a anyadir mas tipos de problemas esta semana, asi que... alla vamos!&lt;/p&gt;
&lt;p&gt;En este problema vamos a intentar subir un poco el nivel... de abstraccion, quiero decir. Vamos a desempolvar un poco esos libros de algoritmos y ver un problema muy basico: la ordenacion. Pero claro, esto es programancia101 y aqui no podemos ordenar cualquier cosa. Al igual que en otras ocasiones,&amp;nbsp;vamos a plantear este problema por fases:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;La primera parte seria algo como: &lt;strong&gt;&lt;font color="#009966"&gt;sabrias decir cual es la forma mas rapida de ordenar diez mil (10.000) numeros? Que tiempo (aproximadamente) llevaria hacerlo en tu ordenador?&lt;/font&gt;&lt;/strong&gt; &lt;/li&gt;
&lt;li&gt;La segunda, continuando con la idea: &lt;strong&gt;&lt;font color="#009966"&gt;cual es la forma mas rapida de ordenar un millon (1.000.000) de numeros? Que tiempo (aproximadamente) llevaria hacerlo en tu ordenador? Se comporta de forma lineal con el caso anterior? Por que?&lt;/font&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;La tercera, partiendo de este segundo caso: imaginemos que la maquina en la que vamos a ordenar&amp;nbsp;nuestro millon de numeros solo tiene &lt;b&gt;2 megabytes de memoria&lt;/b&gt;, una cantidad &lt;b&gt;ilimitada de disco duro&lt;/b&gt; y que nuestros numeros son &lt;b&gt;enteros sin signo de 32 bits&lt;/b&gt;. Supon que disponemos de un &lt;b&gt;flujo de entrada para leer los enteros&lt;/b&gt; de forma secuencial y un &lt;b&gt;flujo de salida&lt;/b&gt; en el que podemos escribir enteros, ambos accesibles mediante las funciones/metodos:&lt;br&gt;&lt;span style="color:Black;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;&lt;span style="color:Green;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;// Devuelve el siguiente entero a ordenar&lt;/span&gt;&lt;br&gt;&lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;int&lt;/span&gt; LeerSiguiente();&lt;br&gt;&lt;span style="color:Green;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;// Escribe el entero en el stream de salida&lt;/span&gt;&lt;br&gt;&lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;void&lt;/span&gt; Escribir(&lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;int&lt;/span&gt; numero);&lt;/span&gt;&lt;br&gt;&lt;b&gt;NOTA:&lt;/b&gt; a efectos de complejidad, podemos suponer que las llamadas a estas funciones/metodos son de orden constante&lt;strong&gt;&lt;font color="#009966"&gt;&lt;br&gt;Cual seria la mejor forma en este caso?&lt;/font&gt;&lt;/strong&gt;&lt;/li&gt;

&lt;li&gt;Y finalmente, la cuarta, rizando el rizo: imaginemos que los numeros anteriores proceden de un &lt;b&gt;listado sin repeticiones de numeros de telefono de exactamente 7 digitos&lt;/b&gt; y que &lt;b&gt;NO tenemos acceso a disco&lt;/b&gt; (y si, seguimos teniendo solo 2 megabytes de memoria): &lt;strong&gt;&lt;font color="#009966"&gt;serias capaz de ordenarlos de la forma mas rapida posible?&lt;/font&gt;&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Como siempre, estais invitados a comentar vuestras soluciones en los comentarios, o bien publicarlas en vuestro blog y dejar un enlace! }:)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;font color="#ffa500"&gt;NOTAS: &lt;/font&gt;&lt;/strong&gt;Como orientacion de dificultad: las dos primeras partes deberian ser sencillas para un nivel basico/medio y repasando un poco algo de algoritmos de ordenacion. La tercera es un poco mas intermedia y la cuarta requiere un poco mas de pensar (asi que la he puesto como avanzada).&lt;/p&gt;&lt;p align="center"&gt;&lt;img src="http://geeks.ms/photos/programancia101/images/10428/original.aspx" border="0"&gt;&lt;br&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=10367" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/programancia101/archive/tags/avanzado/default.aspx">avanzado</category><category domain="http://geeks.ms/blogs/programancia101/archive/tags/medio/default.aspx">medio</category><category domain="http://geeks.ms/blogs/programancia101/archive/tags/algoritmos/default.aspx">algoritmos</category><category domain="http://geeks.ms/blogs/programancia101/archive/tags/basico/default.aspx">basico</category></item><item><title>testeando en el cuarto de baño</title><link>http://geeks.ms/blogs/programancia101/archive/2007/02/06/9895.aspx</link><pubDate>Tue, 06 Feb 2007 11:35:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:9895</guid><dc:creator>phobeo</dc:creator><slash:comments>5</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/programancia101/rsscomments.aspx?PostID=9895</wfw:commentRss><comments>http://geeks.ms/blogs/programancia101/archive/2007/02/06/9895.aspx#comments</comments><description>&lt;i&gt;(y pondria lo de "testeando" entre comillas porque no se como traducir "bonitamente" el anglicismo, pero es que entonces suena sospechoso)&lt;br&gt;&lt;/i&gt;&lt;br&gt;Ya comente que una de las cosas que queria poner en programancia101, aparte de problemas, son recomendaciones de "buenas practicas". En este caso, no es que vaya a decir que testear es una buena idea, eso lo sabeis todos (verdad?)... solo queria compartir este programa que usamos en Google para dar a conocer buenas practicas para la fase de pruebas entre los desarrolladores. La idea basica es: &lt;b&gt;coloca la informacion donde TODOS puedan leerla&lt;/b&gt; }:)&lt;br&gt;&lt;br&gt;&lt;div align="center"&gt;&lt;img src="http://geeks.ms/photos/programancia101/images/9894/original.aspx" border="0"&gt;&lt;br&gt;&lt;/div&gt;&lt;br&gt;Asi surgio la idea de &lt;a href="http://googletesting.blogspot.com/2007/01/introducing-testing-on-toilet.html"&gt;"Testing On The Toilet"&lt;/a&gt; (lo que viene a traducirse en español como el titulo de este articulo).  Si colocamos semanalmente una hoja con problemas sobre testing en uno de los lugares mas visitados de la oficina, la gente acaba por leerla. Desde hace unos dias, estos bonitos ejemplos de cultura Googley estan disponibles para descarga desde el &lt;a href="http://googletesting.blogspot.com/"&gt;Google Testing Blog&lt;/a&gt; (solo en ingles, eso si)&lt;br&gt;&lt;br&gt;Asi que ya sabes: &lt;strong&gt;&lt;font color="#009966"&gt;bajatelo, imprime y... difunde el conocimiento alla donde sea necesario!&lt;/font&gt;&lt;/strong&gt; }:)&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=9895" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/programancia101/archive/tags/general/default.aspx">general</category><category domain="http://geeks.ms/blogs/programancia101/archive/tags/consejos/default.aspx">consejos</category><category domain="http://geeks.ms/blogs/programancia101/archive/tags/testing/default.aspx">testing</category></item><item><title>expansiones infinitas</title><link>http://geeks.ms/blogs/programancia101/archive/2007/02/01/expansiones-infinitas.aspx</link><pubDate>Thu, 01 Feb 2007 10:45:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:9563</guid><dc:creator>phobeo</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/programancia101/rsscomments.aspx?PostID=9563</wfw:commentRss><comments>http://geeks.ms/blogs/programancia101/archive/2007/02/01/expansiones-infinitas.aspx#comments</comments><description>Para los que ya le han echado un ojo al problema anterior y han leido los comentarios sobre las expansiones (hey! recuerdo que si no habeis probado sin leer pistas primero es hacer trampa!) os dejo otro pequeño puzzler sobre el tema. &lt;br&gt;&lt;br&gt;Imaginemos un trocito de codigo como:&lt;br&gt;&lt;br&gt;&lt;span style="color:Black;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;&lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;double&lt;/span&gt; result1 &lt;span style="color:Red;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; 3.65d &lt;span style="color:Red;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;+&lt;/span&gt; 0.05d;&lt;br&gt;&lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;float&lt;/span&gt; result2 &lt;span style="color:Red;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; 3.65f &lt;span style="color:Red;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;+&lt;/span&gt; 0.05f;&lt;br&gt;&lt;br&gt;Console.WriteLine(result1 == 3.7d);&lt;br&gt;Console.WriteLine(result2 == 3.7f);&lt;br&gt;Console.WriteLine(result1 == result2);&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;strong&gt;&lt;font color="#009966"&gt;¿Sabríais decir cuál será la salida que obtendremos al ejecutar?&lt;/font&gt;&lt;/strong&gt;&lt;br&gt;&lt;br&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=9563" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/programancia101/archive/tags/tipos+de+datos/default.aspx">tipos de datos</category><category domain="http://geeks.ms/blogs/programancia101/archive/tags/medio/default.aspx">medio</category><category domain="http://geeks.ms/blogs/programancia101/archive/tags/puzzler/default.aspx">puzzler</category></item><item><title>numeros bestias y descuentos</title><link>http://geeks.ms/blogs/programancia101/archive/2007/01/31/numeros-bestias-y-descuentos.aspx</link><pubDate>Wed, 31 Jan 2007 22:54:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:9539</guid><dc:creator>phobeo</dc:creator><slash:comments>20</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/programancia101/rsscomments.aspx?PostID=9539</wfw:commentRss><comments>http://geeks.ms/blogs/programancia101/archive/2007/01/31/numeros-bestias-y-descuentos.aspx#comments</comments><description>&lt;p&gt;Que bonita esa cancion de los Maiden... 666, el numero de la bestia. Sin embargo, programanticamente hablando, el 666 es un numero de lo mas normalito (si lo ponemos&amp;nbsp; como 0x29A, 0o1232 o 0b1010011010 no impone el mismo respeto, verdad?)&lt;/p&gt;
&lt;p align="center"&gt;&lt;img src="http://geeks.ms/photos/programancia101/images/9540/original.aspx" border="0"&gt;&lt;/p&gt;
&lt;p&gt;Pero en programacion si que hay numeros "especiales" que son a la vez enormemente interesantes para los curiosos y terribles para los descuidados. En este articulo vamos a ver un par de puzzlers que espero que nos hagan pensar un par de veces la proxima vez que tengamos que evaluar estos "casos extremos" y de paso nos ayuden a repasar un poquito mas de aritmetica programante.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;El primero&lt;/strong&gt;, hablando de casos extremos,&amp;nbsp;es para&amp;nbsp;examinar unos &lt;strong&gt;conceptos basicos sobre matematica&lt;/strong&gt;. Si tenemos este trocito de codigo que declara distintos valores y operaciones:&lt;/p&gt;
&lt;p&gt;&lt;span style="font-weight:normal;font-size:11px;color:black;font-family:Courier New;background-color:transparent;"&gt;&lt;span style="font-weight:normal;font-size:11px;color:blue;font-family:Courier New;background-color:transparent;"&gt;float&lt;/span&gt; zero &lt;span style="font-weight:normal;font-size:11px;color:red;font-family:Courier New;background-color:transparent;"&gt;=&lt;/span&gt; 0.0f;&lt;br&gt;&lt;span style="font-weight:normal;font-size:11px;color:blue;font-family:Courier New;background-color:transparent;"&gt;float&lt;/span&gt; one &lt;span style="font-weight:normal;font-size:11px;color:red;font-family:Courier New;background-color:transparent;"&gt;=&lt;/span&gt; 1.0f;&lt;br&gt;&lt;span style="font-weight:normal;font-size:11px;color:blue;font-family:Courier New;background-color:transparent;"&gt;float&lt;/span&gt; negativeone &lt;span style="font-weight:normal;font-size:11px;color:red;font-family:Courier New;background-color:transparent;"&gt;=&lt;/span&gt; -1.0f;&lt;br&gt;&lt;br&gt;&lt;span style="font-weight:normal;font-size:11px;color:blue;font-family:Courier New;background-color:transparent;"&gt;float&lt;/span&gt; division1 &lt;span style="font-weight:normal;font-size:11px;color:red;font-family:Courier New;background-color:transparent;"&gt;=&lt;/span&gt; zero &lt;span style="font-weight:normal;font-size:11px;color:red;font-family:Courier New;background-color:transparent;"&gt;/&lt;/span&gt; one;&lt;br&gt;&lt;span style="font-weight:normal;font-size:11px;color:blue;font-family:Courier New;background-color:transparent;"&gt;float&lt;/span&gt; division2 &lt;span style="font-weight:normal;font-size:11px;color:red;font-family:Courier New;background-color:transparent;"&gt;=&lt;/span&gt; zero &lt;span style="font-weight:normal;font-size:11px;color:red;font-family:Courier New;background-color:transparent;"&gt;/&lt;/span&gt; negativeone;&lt;br&gt;&lt;br&gt;&lt;span style="font-weight:normal;font-size:11px;color:blue;font-family:Courier New;background-color:transparent;"&gt;float&lt;/span&gt; infinity1 &lt;span style="font-weight:normal;font-size:11px;color:red;font-family:Courier New;background-color:transparent;"&gt;=&lt;/span&gt; one &lt;span style="font-weight:normal;font-size:11px;color:red;font-family:Courier New;background-color:transparent;"&gt;/&lt;/span&gt; zero;&lt;br&gt;&lt;span style="font-weight:normal;font-size:11px;color:blue;font-family:Courier New;background-color:transparent;"&gt;float&lt;/span&gt; infinity2 &lt;span style="font-weight:normal;font-size:11px;color:red;font-family:Courier New;background-color:transparent;"&gt;=&lt;/span&gt; negativeone &lt;span style="font-weight:normal;font-size:11px;color:red;font-family:Courier New;background-color:transparent;"&gt;/&lt;/span&gt; zero;&lt;br&gt;&lt;br&gt;&lt;span style="font-weight:normal;font-size:11px;color:blue;font-family:Courier New;background-color:transparent;"&gt;float&lt;/span&gt; division0 &lt;span style="font-weight:normal;font-size:11px;color:red;font-family:Courier New;background-color:transparent;"&gt;=&lt;/span&gt; zero &lt;span style="font-weight:normal;font-size:11px;color:red;font-family:Courier New;background-color:transparent;"&gt;/&lt;/span&gt; zero;&lt;br&gt;&lt;br&gt;Console.WriteLine(division1 == division2);&lt;br&gt;Console.WriteLine(infinity1 == infinity2);&lt;br&gt;&lt;br&gt;Console.WriteLine(infinity1 == infinity1);&lt;br&gt;Console.WriteLine(infinity2 == infinity2);&lt;br&gt;Console.WriteLine(division0 == division0);&lt;br&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;font color="#009966"&gt;¿Sabríais decir cuál será la salida que obtendremos al ejecutar?&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Y el &lt;strong&gt;segundo es un caso de "depuracion pensando"&lt;/strong&gt; que tiene que ver con numeros especiales tambien. Supongamos que tenemos una serie de&amp;nbsp;productos a los que queremos aplicar un descuento (porque para eso estamos de rebajas de Enero). Tenemos algunos cuyo precio se ha reducido a la mitad, y otros que rebajamos un 10%. Como no nos gusta andar con la calculadora todo el rato nos hemos hecho un programita que aplica los descuentos por nosotros. El trocito de codigo que hace lo que queremos es algo como:&lt;/p&gt;
&lt;p&gt;&lt;span style="font-weight:normal;font-size:11px;color:black;font-family:Courier New;background-color:transparent;"&gt;&lt;span style="font-weight:normal;font-size:11px;color:blue;font-family:Courier New;background-color:transparent;"&gt;int&lt;/span&gt;[] precios &lt;span style="font-weight:normal;font-size:11px;color:red;font-family:Courier New;background-color:transparent;"&gt;=&lt;/span&gt; {20, 30, 20};&lt;br&gt;&lt;span style="font-weight:normal;font-size:11px;color:blue;font-family:Courier New;background-color:transparent;"&gt;float&lt;/span&gt;[] descuentos &lt;span style="font-weight:normal;font-size:11px;color:red;font-family:Courier New;background-color:transparent;"&gt;=&lt;/span&gt; {0.5f, 0.5f, 0.1f};&lt;br&gt;&lt;br&gt;&lt;span style="font-weight:normal;font-size:11px;color:blue;font-family:Courier New;background-color:transparent;"&gt;for&lt;/span&gt;(&lt;span style="font-weight:normal;font-size:11px;color:blue;font-family:Courier New;background-color:transparent;"&gt;int&lt;/span&gt; i &lt;span style="font-weight:normal;font-size:11px;color:red;font-family:Courier New;background-color:transparent;"&gt;=&lt;/span&gt; 0; i &amp;lt; precios.Length &amp;amp;&amp;amp; i &amp;lt; descuentos.Length; i++) {&lt;br&gt;&lt;span style="font-weight:normal;font-size:11px;color:blue;font-family:Courier New;background-color:transparent;"&gt;&amp;nbsp; int&lt;/span&gt; precioRebajado &lt;span style="font-weight:normal;font-size:11px;color:red;font-family:Courier New;background-color:transparent;"&gt;=&lt;/span&gt; (&lt;span style="font-weight:normal;font-size:11px;color:blue;font-family:Courier New;background-color:transparent;"&gt;int&lt;/span&gt;) (precios[ i ] &lt;span style="font-weight:normal;font-size:11px;color:red;font-family:Courier New;background-color:transparent;"&gt;*&lt;/span&gt; (1 &lt;span style="font-weight:normal;font-size:11px;color:red;font-family:Courier New;background-color:transparent;"&gt;-&lt;/span&gt; descuentos[ i ]));&lt;br&gt;&lt;span style="font-weight:normal;font-size:11px;color:blue;font-family:Courier New;background-color:transparent;"&gt;&amp;nbsp; int&lt;/span&gt; porcentaje &lt;span style="font-weight:normal;font-size:11px;color:red;font-family:Courier New;background-color:transparent;"&gt;=&lt;/span&gt; (&lt;span style="font-weight:normal;font-size:11px;color:blue;font-family:Courier New;background-color:transparent;"&gt;int&lt;/span&gt;) (100 &lt;span style="font-weight:normal;font-size:11px;color:red;font-family:Courier New;background-color:transparent;"&gt;*&lt;/span&gt; descuentos[ i ]);&lt;br&gt;&amp;nbsp; Console.WriteLine(&lt;span style="font-weight:normal;font-size:11px;font-family:Courier New;"&gt;"antes: {0} euros... ahora solo {1}!!! (-{2}%)"&lt;/span&gt;, &lt;br&gt;&amp;nbsp; precios[ i ], precioRebajado, porcentaje);&lt;br&gt;}&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Sin embargo, al ejecutar nos hemos dado cuenta que &lt;strong&gt;la salida no es justo la que esperabamos&lt;/strong&gt;. &lt;strong&gt;&lt;font color="#009966"&gt;¿Sabríais decir cuál es el error o errores que hemos cometido? ¿Como podemos hacer que nuestro programa funcione correctamente?&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;font color="#ffa500"&gt;&lt;strong&gt;NOTAS/Actualizacion:&lt;/strong&gt;&lt;/font&gt; Un par de apuntes sobre el problema de parte de un par de lectores avanzados (ver comentarios) }:)&lt;br&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Tal y como menciona &lt;a href="http://geeks.ms/blogs/aruiz"&gt;Augusto&lt;/a&gt;, estos problemas pueden arreglarse usando la clase &lt;b&gt;System.Decimal&lt;/b&gt; (o java.math.BigDecimal o el equivalente en cada plataforma). El tipo Decimal es bastante interesante, asi que dejamos aqui la referencia por si alguien es curioso y quiere adivinar por que sirve para este tipo de problemas (y cuales son sus ventajas e inconvenientes)&lt;br&gt;&lt;/li&gt;&lt;li&gt;Curiosea que te curiosea, &lt;b&gt;Tio_Luiso&lt;/b&gt; nos indica que en el primer trocito de codigo, C# parece que no representa el resultado de 0/-1 como "menos cero" (de acuerdo al estandar IEEE 754). En cuanto pueda informarme sobre esto pongo una actualizacion! }:)&lt;/li&gt;&lt;/ul&gt;Muchisimas gracias a los dos por tomaros el tiempo de compartir esta informacion! }:D&lt;br&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=9539" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/programancia101/archive/tags/tipos+de+datos/default.aspx">tipos de datos</category><category domain="http://geeks.ms/blogs/programancia101/archive/tags/medio/default.aspx">medio</category><category domain="http://geeks.ms/blogs/programancia101/archive/tags/basico/default.aspx">basico</category><category domain="http://geeks.ms/blogs/programancia101/archive/tags/puzzler/default.aspx">puzzler</category><category domain="http://geeks.ms/blogs/programancia101/archive/tags/depuracion/default.aspx">depuracion</category></item><item><title>contando hacia atras</title><link>http://geeks.ms/blogs/programancia101/archive/2007/01/05/contando-hacia-atras.aspx</link><pubDate>Fri, 05 Jan 2007 09:50:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:8255</guid><dc:creator>phobeo</dc:creator><slash:comments>12</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/programancia101/rsscomments.aspx?PostID=8255</wfw:commentRss><comments>http://geeks.ms/blogs/programancia101/archive/2007/01/05/contando-hacia-atras.aspx#comments</comments><description>&lt;P&gt;Vaya, este artículo debería haberlo publicado hace unos días, cuando muchos de vosotros sí que os estábais preparando para la cuenta atrás... de final de año, claro. Espero que me perdonéis, pero estoy un poco griposillo así que no me ha dado instancia a dedicar tiempo a escribir.&lt;/P&gt;
&lt;P&gt;Aun así: ¡aprovecho para felicitaros a todos desde aquí y desear que los 0x757B12C00 milisegundos de este 2007 os sean propicios! }:)&lt;/P&gt;
&lt;P align=center&gt;&lt;A href="http://www.flickr.com/photos/dps/" target=_blank&gt;&lt;IMG src="http://geeks.ms/photos/programancia101/images/8260/original.aspx" border=0&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P align=center&gt;&lt;A href="http://geeks.ms/photos/programancia101/picture8259.aspx" target=_blank&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;El caso es que, continuando&amp;nbsp;con el emocionante&amp;nbsp;tema de los tipos de datos, he pensado en dejaros un pequeño puzzler para empezar el año. Os recuerdo que la idea de los puzzlers es responder a las preguntas sobre el código &lt;STRONG&gt;sin ejecutarlo primero&lt;/STRONG&gt; (y si sois capaces ademas de saber qué hace, saber el &lt;STRONG&gt;por qué&lt;/STRONG&gt;... ¡son gallifantes extra!)&lt;/P&gt;
&lt;P&gt;Al igual que en el problema anterior, &lt;STRONG&gt;podéis publicar la solución en vuestro blog y enlazarla&lt;/STRONG&gt; desde un comentario aquí &lt;STRONG&gt;o bien enviarlas directamente como comentario&lt;/STRONG&gt; del artículo. En cualquier caso, intentaremos comentar la solución entre todos }:)&lt;/P&gt;
&lt;P&gt;Pero basta ya de preámbulos: la idea es que tenemos estos tres pedacitos de código:&lt;/P&gt;
&lt;P&gt;
&lt;TABLE style="WIDTH:100%;" cellSpacing=1 cellPadding=1 align=center&gt;

&lt;TR&gt;
&lt;TD&gt;&lt;FONT size=2&gt;&lt;STRONG&gt;pedacito #1&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:black;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;int&lt;/SPAN&gt; counter &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; (&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;int&lt;/SPAN&gt;)1e8;&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;while&lt;/SPAN&gt;(counter &amp;gt; 0) {&lt;BR&gt;counter--;&lt;BR&gt;}&lt;BR&gt;Console.WriteLine(&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:#666666;FONT-FAMILY:Courier New;BACKGROUND-COLOR:#e4e4e4;"&gt;"counter: "&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;+&lt;/SPAN&gt; counter);&lt;/SPAN&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TABLE&gt;&lt;/P&gt;
&lt;P&gt;
&lt;TABLE style="WIDTH:100%;" cellSpacing=1 cellPadding=1 align=center&gt;

&lt;TR&gt;
&lt;TD&gt;&lt;FONT size=2&gt;&lt;STRONG&gt;pedacito #2&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/TD&gt;
&lt;TR&gt;
&lt;TD&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:black;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;float&lt;/SPAN&gt; counter &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; (&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;float&lt;/SPAN&gt;)1e8;&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;while&lt;/SPAN&gt;(counter &amp;gt; 0) {&lt;BR&gt;counter--;&lt;BR&gt;}&lt;BR&gt;Console.WriteLine(&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:#666666;FONT-FAMILY:Courier New;BACKGROUND-COLOR:#e4e4e4;"&gt;"counter: "&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;+&lt;/SPAN&gt; counter);&lt;/SPAN&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TABLE&gt;&lt;/P&gt;
&lt;P&gt;
&lt;TABLE style="WIDTH:100%;" cellSpacing=1 cellPadding=1 align=center&gt;

&lt;TR&gt;
&lt;TD&gt;&lt;FONT size=2&gt;&lt;STRONG&gt;pedacito #3&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:black;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;double&lt;/SPAN&gt; counter &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; (&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;double&lt;/SPAN&gt;)1e8;&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;while&lt;/SPAN&gt;(counter &amp;gt; 0) {&lt;BR&gt;counter--;&lt;BR&gt;}&lt;BR&gt;Console.WriteLine(&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:#666666;FONT-FAMILY:Courier New;BACKGROUND-COLOR:#e4e4e4;"&gt;"counter: "&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;+&lt;/SPAN&gt; counter);&lt;/SPAN&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TABLE&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT color=#009966&gt;¿Sabríais decir cuál será la salida de cada uno de ellos?&lt;/FONT&gt;&lt;/STRONG&gt; Y ya puestos: &lt;STRONG&gt;&lt;FONT color=#009966&gt;¿sabríais decir cuál tardará MENOS y cual MÁS en ejecutarse?&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;NOTA:&lt;/STRONG&gt; tal y como estan expresados, estos pedacitos deberían ejecutarse sin problemas en C#, Java, C y C++ (&lt;FONT color=#000000&gt;simplemente&lt;/FONT&gt; cambiando la última línea por la llamada a&amp;nbsp;&lt;FONT face="Courier New"&gt;System.out.println&lt;/FONT&gt;,&lt;FONT face="Courier New"&gt; printf&lt;/FONT&gt; o &lt;FONT face="Courier New"&gt;cout &amp;lt;&amp;lt;&lt;/FONT&gt;&amp;nbsp;apropiada). ¡Siento no haber podido hacer versiones en otros lenguajes!&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=8255" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/programancia101/archive/tags/avanzado/default.aspx">avanzado</category><category domain="http://geeks.ms/blogs/programancia101/archive/tags/tipos+de+datos/default.aspx">tipos de datos</category><category domain="http://geeks.ms/blogs/programancia101/archive/tags/medio/default.aspx">medio</category><category domain="http://geeks.ms/blogs/programancia101/archive/tags/puzzler/default.aspx">puzzler</category></item><item><title>empezando por el principio</title><link>http://geeks.ms/blogs/programancia101/archive/2006/12/26/empezando-por-el-principio.aspx</link><pubDate>Tue, 26 Dec 2006 11:04:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:7892</guid><dc:creator>phobeo</dc:creator><slash:comments>23</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/programancia101/rsscomments.aspx?PostID=7892</wfw:commentRss><comments>http://geeks.ms/blogs/programancia101/archive/2006/12/26/empezando-por-el-principio.aspx#comments</comments><description>&lt;P&gt;Como en programancia101 estamos solo empezando, creo que lo más apropiado es empezar por el principio, pero claro, esto sería si hubiera un principio.&lt;/P&gt;
&lt;P&gt;Lo ideal sería poder identificar cuál es la habilidad más importante que debe tener un desarrollador y decir: &lt;EM&gt;"¡aha! éste es el truco y éste es el problema que necesitáis para afinar la capacidad X"&lt;/EM&gt;. Pero esto creo que es un problema bastante difícil. &lt;FONT color=#009966&gt;&lt;STRONG&gt;¿Cuál creéis vosotros que debería ser la habilidad número uno del buen programante?&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;Yo he sido incapaz de decidirme sólo por una, pero sí que he visto una actitud común en muchos programantes avezados: no se conforman con saber que algo funciona, sino que quieren saber &lt;STRONG&gt;por qué&lt;/STRONG&gt; funciona, o&lt;STRONG&gt; por qué no&lt;/STRONG&gt; funciona, o &lt;STRONG&gt;por qué funciona mejor&lt;/STRONG&gt; en tal o cual caso. Saber este tipo de cosas está directamente relacionado con la curiosidad por conocer cómo maneja cada concepto "por dentro" nuestro lenguaje favorito, nuestro entorno, nuestro marco de trabajo...&lt;/P&gt;
&lt;P&gt;Una de las típicas&amp;nbsp;preguntas que suelen hacerse cuando&amp;nbsp;se quiere comprobar qué tal maneja alguien los conceptos desde el principio es: ¿sabes darle la vuelta? Sí, exactamente, darle la vuelta a las cosas es un procedimiento poco usual en la "programación estándar", pero nos viene al pelo para empezar a proponer el que se vean las cosas de un modo distinto&lt;/P&gt;
&lt;P align=center&gt;&lt;IMG src="http://geeks.ms/photos/programancia101/images/7879/original.aspx"&gt;&lt;/P&gt;
&lt;P&gt;Vamos a plantear esta pregunta a distintos niveles:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;la idea más básica sería: &lt;FONT color=#009966&gt;&lt;STRONG&gt;¿sabrías escribir un trozo de código que reciba una cadena de texto y le dé la vuelta?&lt;/STRONG&gt;&lt;/FONT&gt; Es decir, si nuestra entrada es "abc",&amp;nbsp;la salida sería&amp;nbsp;"cba" 
&lt;LI&gt;Bajando un poco más dentro de nuestros tipos de datos: &lt;FONT color=#009966&gt;&lt;STRONG&gt;¿y un trozo de código que le de la vuelta a los bits de un byte?&lt;/STRONG&gt;&lt;/FONT&gt; Es decir, si la entrada es 1,&amp;nbsp;la salida sería&amp;nbsp;128 
&lt;LI&gt;Y para terminar, uno un poco más complejo: en C# (y muchos otros lenguajes) los tipos flotantes se representan mediante el estándar aritmético IEEE 754. &lt;FONT color=#009966&gt;&lt;STRONG&gt;¿Sabrías escribir un trozo de código que le de la vuelta a los bits del exponente y&amp;nbsp;la mantisa de esa representación IEEE 754?&lt;/STRONG&gt;&lt;/FONT&gt; Es decir, si la entrada es&amp;nbsp;-118,625, la salida sería -17.180.580.000 (nota: en español la coma "," es decimal y el punto "." el separador cada 3 números de la parte entera)&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&lt;STRONG&gt;Podéis poner vuestras respuestas, preguntas o ideas en los comentarios o bien poner un post con la solución en vuestro propio blog y dejar aquí un enlace&lt;/STRONG&gt; (¡es mejor que mandármelas por mail, porque así todos podemos opinar!)&lt;/P&gt;
&lt;P&gt;Preparados, listos... ¡ya! }:)&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=7892" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/programancia101/archive/tags/avanzado/default.aspx">avanzado</category><category domain="http://geeks.ms/blogs/programancia101/archive/tags/tipos+de+datos/default.aspx">tipos de datos</category><category domain="http://geeks.ms/blogs/programancia101/archive/tags/medio/default.aspx">medio</category><category domain="http://geeks.ms/blogs/programancia101/archive/tags/algoritmos/default.aspx">algoritmos</category><category domain="http://geeks.ms/blogs/programancia101/archive/tags/basico/default.aspx">basico</category><category domain="http://geeks.ms/blogs/programancia101/archive/tags/bits/default.aspx">bits</category></item><item><title>¿qué es programancia?</title><link>http://geeks.ms/blogs/programancia101/archive/2006/12/25/que-es-programancia.aspx</link><pubDate>Mon, 25 Dec 2006 22:11:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:7880</guid><dc:creator>phobeo</dc:creator><slash:comments>12</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/programancia101/rsscomments.aspx?PostID=7880</wfw:commentRss><comments>http://geeks.ms/blogs/programancia101/archive/2006/12/25/que-es-programancia.aspx#comments</comments><description>&lt;P&gt;Si buscais en un diccionario &lt;STRONG&gt;"programación",&lt;/STRONG&gt; os encontraréis con algo como:&lt;EM&gt; "acto de crear un programa de computadora, un conjunto concreto de instrucciones que una computadora puede ejecutar"&lt;/EM&gt; (&lt;A class="" title=Wikipedia:Programacion href="http://es.wikipedia.org/wiki/Programacion" target=_blank&gt;Wikipedia&lt;/A&gt; dixit) &lt;/P&gt;
&lt;P&gt;Quiero empezar diciendo que &lt;STRONG&gt;este blog no trata de eso&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Quiero decir, no trata de eso únicamente. Seguro que a algunos de vosotros os gusta programar. Quiero decir que os gusta mucho. Vamos, que os apasiona. Para vosotros, es posible que la definición anterior se quede un poco corta. Sí, el mecanismo de programar está contenido en esa definición pero... falta algo....&lt;/P&gt;
&lt;P&gt;Programación en vuestra cabeza suena a reto, suena a crear algo fantástico que funciona a partir de la nada, sólo con ideas y líneas de código, suena a la lucha cuando las cosas no funcionan y a la sensación de triunfo cuando por fin das con el problema y todo encaja.&lt;/P&gt;
&lt;P&gt;Aunque puede que me equivoque y para ti programar sea solamente eso que te obligan a hacer en tu trabajo, de 9 a 18 (con pausa para comer), y a lo que prefieres no dar muchas vueltas...&lt;/P&gt;
&lt;P&gt;En ese caso, puede que este blog no te interese&lt;/P&gt;
&lt;P&gt;Por supuesto yo intentaré convencerte de lo contrario. De que sí te interesa porque hay más cosas en la programación que escribir líneas sobre siempre lo mismo&lt;/P&gt;
&lt;P&gt;Si me pidieran una definición para qué quiero decir con&amp;nbsp;&lt;STRONG&gt;programancia&lt;/STRONG&gt; yo diría que es algo como &lt;STRONG&gt;"el conjunto de técnicas, ideas y mecanismos de pensamiento que hacen del acto de crear programas una actividad creativa, divertida y útil".&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Y es que tal y como yo lo veo,&amp;nbsp;desarrollar aplicaciones es uno de los campos más intelectualmente estimulantes en la actualidad. ¿Conocéis muchos más campos en los que haya tantas posibilidades de probar nuevos conceptos, mejorar día a día y disfrutar de la sensación de haber realizado un trabajo que va a ahorrar trabajo a otras personas?&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Programancia101&lt;/STRONG&gt; es un experimento que pretende que todos aprendamos un poco más sobre distintas formas de abordar problemas y/o&amp;nbsp;practicar esas técnicas e ideas que a veces tenemos un poco olvidadas, pero que hacen del desarrollo algo mucho más entretenido.&lt;/P&gt;
&lt;P&gt;Desde aquí iremos planteando distintos tipos de problemas interesantes, divertidos o simplemente que nos obliguen a revisitar conceptos que puede que nos sean útiles en un futuro (o que al menos nos sirvan para desconectar un poco y ver las cosas de un modo distinto) y comentarlos. Ejemplos de problemas que podrían ser interesantes son:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Programación genérica: a partir de&amp;nbsp;una descripción, llegar al código para resolverlos (preferentemente en términos que nos permitan independencia del lenguaje) 
&lt;LI&gt;Problemas de tipo "puzzler" en los que se presenta un trozo de código y se intenta que determinemos qué hace exactamente (sin ejecutarlo, claro) 
&lt;LI&gt;Problemas de depurar pensando ("debugging by thinking") en los que el código mostrado contiene errores y tenemos que localizarlos 
&lt;LI&gt;Otras habilidades relacionadas con la programación, como&amp;nbsp;trucos matemáticos o representación de datos.&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Y por supuesto, estamos más que abiertos a recibir otras recomendaciones o sugerencias de actividades. Esto no sería ni la mitad de interesante si no os animáis a colaborar, proponer nuevas ideas y discutir los problemas entre todos. Yo haré lo que pueda por aportar mi granito de arena&lt;/P&gt;
&lt;P&gt;Asi que... ¿qué me decís? ¿Os animáis a probar? }:)&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=7880" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/programancia101/archive/tags/general/default.aspx">general</category></item></channel></rss>