Saturday, March 30, 2013

Mi nuevo gadget: grabadora digital de voz


En diciembre del año pasado recibí un simpático regalo: una grabadora de voz, de estado sólido, marca Memorex. Se trata del modelo MB2063 cuyo costo aproximado en México es de unos 250 pesos (unos 18 dólares al tipo de cambio de 13 pesos por dólar). Tiene una memoria flash de 128 MBytes y permite grabar hasta 56 horas (en modo LP). Usa dos pilas AAA y además, tiene un "mosquetón" (así le llama el manual), que es simplemente un círculo de plástico para poder enganchar la grabadora a -digamos- las llaves del auto y así tener siempre accesible el juguete. Además, tiene interconstruido el micrófono y el altavoz y una pequeña pantalla LCD en donde se muestra la información del tiempo de grabación la hora, etcétera.

Tiene control de volumen, cuatro carpetas en donde se pueden guardar hasta 99 mensajes en cada una. Puede grabar cuando hay sonido nada más y se apaga temporalmente si no hay sonido por dos segundos. Es fácil moverse entre las carpetas con pláticas grabadas y pesa muy poco. La calidad de la reproducción es más que aceptable y sin duda hace obsoletas las grabadoras de cassettes que se usaron por mucho tiempo.

Sin embargo, encuentro unos pocos detalles que la podrían hacer un mejor producto a esta grabadora:

  • El precio, 250 pesos, me parece relativamente costosa esta grabadora para lo que hace, pero desde luego, es cuestión de opiniones.
  • Las conversaciones se graban y se reproducen bien. Sin embargo, éstas no pueden ser pasadas a una computadora, cosa que ya debería ser algo más que común.
  • Sería interesante tener una ranura para una tarjeta SD y eso la haría incluso más atractiva a los usuarios.
  • Le puse unas baterías -supuestamente "Kodak"- AAA, que me costaron 10 pesos y duraron unas siete horas, 3 menos que lo que indica el manual (eso suponiendo que se usan para grabar contínuamente sin parar). De nuevo, puede ser que haya usado pilas "piratas".

Por lo demás, el gadget cumple con los objetivos y de hecho, he estado pensado en Lewis Carroll, que tenía un dispositivo de su propia invención para poder escribir notas si de pronto despertaba con una buena idea a la mitad de la noche y quería que no se le olvidara. En ese sentido esta grabadora podría servir para llevar notas o cuando se nos ocurra esa idea fantástica poderla usar.

La verdad es un bonito gadget, muy ligero, que cumple con su cometido. Creo que en promedio es recomendable.


Friday, March 29, 2013

La inseguridad cotidiana


México se ha convertido en un país inseguro. Antes, por ejemplo, la provincia mexicana era tranquila y hubo quienes decidieron emigrar del gigantesco DF a algún estado cercano (o no tan cercano). La medida parecer haber resultado contraproducente. En algunos estados del país la violencia es de lo peor. Los asesinatos, los secuestros, personas colgadas en los puentes, fusilados en las calles, etcétera, es algo cotidiano y sin duda lamentable. De hecho, en el DF pareciera que se ha logrado contener la criminalidad y no se ven estas escenas dantescas aunque a veces hay noticias de gente que ejecutan en calles por demás concurridas, como lo que le ocurrió a un Notario en las calles de masaryk y Moliere hace un par de semanas.

Por ello no están de más las precauciones. Nadie quiere ser víctima de ningún delito y observar el derredor donde uno vive, tener comunicación con los vecinos, conseguir vigilancia privada en algunos casos, cerrar calles para tener más control, etcétera, son algunas de las medidas que hay que considerar, aunque algunas no son fáciles de implanmtar. Por ejemplo, el gobierno local rechaza que vecinos de una colonia cierren calles con plumas. Si los colonos de dichas colonias ignoran al gobierno y ponen casetas de vigilancia y plumas para controlar el acceso, es común entonces ver bulldozers quitando estas "barricadas".

La cuestión es que ayer me fui a dormir a eso de las 10 de la noche y hoy me dice Pilar que al vecino le robaron lascuatro llantas de su camioneta. Esto debió haber pasado a eso de la madrugada. Desde luego nadie vio ni escuchó nada, pero es muy triste ver a una víctima de este robo, el cual ahora tendrá que conseguir no sólo las cuatro llantas, sino también los cuatro rines.

Haciendo una búsqueda rápida en la red y a ojo de buen cubero, el rin más barato para ese tipo de camioneta está en más de 1500 pesos y la llanta más barata cuesta unos 500 pesos. Así, por lo bajo, la víctima de este robo tendrá que desembolsar unos 8,000 pesos al menos para reponer lo que los amigos de lo ajeno le quitaron en unos cuantos minutos.

La imagen que ilustra este artículo la tomé hoy en la mañana. No es posible que esto pase. México no puede seguir así.

Wednesday, March 27, 2013

Uso absurdo de Twitter


Entro a Twitter y veo las sugerencias que me da el sistema para seguir a otros usuarios. Uno de ellos es la periodista/escritora Olga Wornat. La verdad no me apetece seguirla. Pero lo simpático del asunto es que Twitter me dice que uno de los que la siguen a esta señora es la Secretaría de Finanzas del DF. A ver, ¿no se supone que la Secretaría de Finanzas tiene Twitter para hacer los anuncios que quiera hacer vía este medio a la ciudadanía? ¿O es una cuenta a título personal y quien la generó le gusta leer a la Wornat? La verdad es que me parece absurdo que cualquier institución del gobierno, en las correspondientes cuentas de Twitter, siga a quien sea. No es para eso que un organismo del gobierno crea una cuenta en esta red de microblogging. De verdad ¿a qué estamos jugando?

Monday, March 25, 2013

Vivir angustiados


Hoy entro a Facebook y halló un enlace que puso el buen Max de Mendizábal, sobre la terrible historia del aspartame, que es un sustituto del azúcar. Antes existió la sacarina, pero en algún momento surgieron un sinfín de voces que indicaban que era cancerígeno. Más tarde leo otra nota en Facebook, de un amigo virtual cuyo nombre no recuerdo en estos momentos, que habla de un estudio que se hizo en Estados Unidos en donde se concluye que México es el país más peligroso en términos de enfermedades como la diabetes, entre otras, por consumir demasiadas bebidas refrescantes carbonatadas. (Los gringos ven la paja en el ojo ajeno y no ven la viga en el propio).

Pero si todo esto no fuese suficiente, a cada rato vemos ern las redes sociales enlaces a futuras desgracias, empezando por una absurda noticia que indica que para el 2060 podría caer un gran asteroide en la Tierra, acabando con la raza humana. Y es una noticia alarmante la cual no tiene remedio si es cierta. Pero ahí no para todo. Si esto no es suficiente para asustarlo, tenemos el cambio climático, que pende como espada de Damocles sobre la naturaleza humana: "si la temperatura del planeta sube un par de grados estamos en un problema insoluble", nos indican con cara de preocupación extrema. Y las malas noticias siguen: Corea del Norte hizo otra prueba nuclear y todos los países, particularmente los Estados Unidos, están preocupados. Estos orientales podrían iniciar una tercera guerra mundial porque quienes gobiernan ese paísito son una recua de esquizofrénicos y perturbados.

Pero nada de esto es alarmante para muchos, entonces nos hablan del bullying: casi la gran pandemia en México. Y que conste, no digo que no sea un problema pero ya nuestros hijos tampoco están seguros en las escuelas. Y qué decir de las drogas, que acechan a los jóvenes en cada esquina. Bueno, es un rosario interminable de potenciales desgracias las cuales, en última instancia, no nos dejan vivir tranquilos. Más bien, vivimos angustiados cotidianamente.

Y yo no sé de quién viene esta moda infame de alarmar por todo. Quizás son los medios que en su afán de querernos a fuerza vendernos las noticias del día, tienden a exagerarlo todo, aunque al día siguiente ya nadie se acuerde. Recuerdo por ejemplo al cretino de López-Dóriga, que a fines del año pasado decía que la crisis financiera en Europa estaba a punto de colapsar a todo el continente europeo si no se llegaba a acuerdos pronto... ¿Y qué pasó? Nada. Ahí sigue Europa a pesar del cataclismo esperado por el farsante periodista del canal de las estrellas. O cuando los medios retoman el asunto del virus del SIDA. Si no hay malas noticias no se preeocupen, que la pandemia del VIH sigue azotando y para esoestán los medios, para informarnos.

En mi opinión, todas estas potenciales desgracias no tienen necesariamente que ocurrir o estar ocurriendo. Además, todas esas notas son de tal magnitud de terror que no hay medida precautoria que se pueda implantar. Estamos casi casi, de acuerdo a estos voceros de las desgracias, indefensos ante estas catástrofes.

Como que ¡ya basta! Hace unos días se mencionó que una mujer que habíase tomado una foto mostrando sus senos iba a ser lapidada hasta morir. Hoy sabemos que es mentira, pero como nadie pretende informarse en las redes sociales y se le cree a un bonito cartel hecho con Photoshop, entonces nos alarmamos por esta barberie que ni siquiera tenía visos de ser cierta. Yo de verdad, apelo por evitar tanto noticia alarmante estúpida, que sólo busca hacer la vida más difícil de lo que es. ¿O me equivoco?

Friday, March 22, 2013

Capablanca: Jugada a Jugada


Probablemente el título de este libro ya diga mucho del mismo. Hablamos de Capablanca, uno de los grandes genios que ha dado el ajedrez, el cual ahora es analizado desde la perspectiva de Cyrus Lakdawala, Maestro Internacional de los Estados Unidos. Lakdawala, de 51 años ha enseñado ajedrez por más de 30 y se dice que ha sido entrenador de algunos de los jugadores junior más fuertes en el país vecino. Ha ganado el National Open (torneo que se juega tradicionalmente en Las Vegas) y ha sido Campeón del American Open, otro torneo abierto muy fuerte. Ha sido además seis veces campeón de su estado. Ladkawala tiene varios libros en este formato Move by Move (jugada a jugada).

El formato Jugada a Jugada es descrito por el editor del libro, John Emms (Gran Maestro británico), el cual dice, “intenta ser interactivo. Se basa en preguntas que se hacen al lector. Se intenta, en la medida de lo posible, el hacer del libro una especie de lección de ajedrez en donde el lector busca completar ejercicios, contestar preguntas y probar sus habilidades ajedrecísticas en los momentos claves de las partidas”. Emms indica:”Estamos en la firme creencia que practicando las habilidades es un método excelente para estudiar ajedrez”.

Desafortunadamente en el libro no se logra completamente este objetivo. Por una parte, parece que algunas preguntas deel autor están dirigidas a un tipo de jugadores (de cierto nivel en particular), mientras que otras parecen solamente puestas para completar la intención del libro. Sin embargo, las mejores preguntas tratan de tópicos relacionados con planeación, combinaciones, cálculo y decisiones críticas. Lakdawala dice que a la larga será beneficioso contestar estas preguntas y ejercicios y que además, él mismo ha notado que puede mantener su nivel de ajedrez de esta manera. De hecho, indica que cuando trabajaba en este libro, su rating (que mide la fuerza ajedrecística de un jugador), subió a 2588, diez puntos por encima de su mejor rating de 1998 (hablamos del rating norteamericano, unos 100 puntos por encima del rating FIDE, el cual es -para el autor- de 2421 puntos Elo).

Lakdawala se describe a sí mismo como un “acólito fiel de San Capa” y habla muchas veces de la tentación de dar a cada jugada del genio cubano un signo de admiración. El autor se da cuenta que es difícil mantenerse objetivo y probablemente esto demuestre una actitud fanática a las partidas de Capablanca, como Irving Chernev hace en sus libros cuando habla del mismo jugador. Curiosamente en Mis Grandes Predecesores, de Garry Kasparov, no parece admirar al cubano como lo hacen Lakdawala o Chernev, pero sí hace notar sin embargo el “efecto Capablanca”, que muestra a sus contrarios temerosos o ya casi aceptando la inminente derrota ante esta máquina de ajedrez que era. Cabe sin embargo decir que una explicación es que Kasparov admira a Alekhine, uno de sus grandes héroes, el cual fue acérrimo enemigo de Capablanca y que además, lo destronó como Campeón del Mundo en el año 1927 en Buenos Aires, Argentina, en un intenso y emocionante match.


Lakdawala pone a Capablanca como el segundo mejor jugador de todos los tiempos, en donde Fischer aparece como el primero en su lista. Morphy y Kasparov aparecen más abajo. Según el autor, esto lo hace porque piensa que Capablanca tenía el mayor talento natural para el juego ciencia y que además, fue el Campeón del Mundo más flojo de todos los tiempos. Es interesante decir que Boris Spassky ha dicho muchas veces que es demasiado flojo para el ajedrez. Desde luego que estas palabras se deben tomar en el contexto adecuado. Comparado con otros campeones mundiales como Botvinnik, que estudiaba metódicamente por muchas horas por día, casi cualquier campeón del mundo calificaría como flojo.

El libro se divide en los siguientes capítulos:

  • Prólogo
  • Bibliografía
  • Introducción
  • Capa en el ataque
  • Capa en la defensa
  • Capa en la explotación del desbalance
  • Capa en los finales
  • Índice de las aperturas
  • Índice de los oponentes

Hay 59 juegos (algunos parciales), anotados pensando en el aficionado. El libro contiene muchos diagramas y con un poco de esfuerzo se puede leer sin necesidad de usar un tablero (aunque en mi opinión, el mejor jugo al libro se le puede sacar poniendo las piezas y el ajedrez y reproduciendo las partidas y no sólo siguiéndolas en el libro).

  • 1901-1915 el aventurero joven y agresivo
  • 1916-1927 donde Capablanca fue el rey sin oposición y en el clímax de su fuerza
  • 1928-1942 en donde podemos ver a un Capa muy cuidadoso, súper-posicional

Lakdawala describe las aperturas de Capablanca como poco inspiradoras y hace un esfuerzo por no criticar al genio cubano bajo la mirada de los estándares modernos.  El autor piensa que Capa fue el jugador más fuerte de todos los tiempos en la transición del medio juego al final y piensa que fue el mejor táctico en los años 1917 a 1927.

Tal vez lo menos acertado del libro sean los grandilocuentes comentarios que el autor hace de algunas jugadas del cubano. Por lo demás, hay que reconocer que si se trabaja con el material que presenta Lakdawala, se puede llegar a tener una buena visión de quién era Capablanca y del gran ajedrez que jugó.

Capablanca: Move by Move, por Cyrus Lakdawala, Everyman Chess 2012.

Wednesday, March 20, 2013

Nuevo reto de programación lúdica: Óleo digital



Una característica de las imágenes en la computadora es que son digitales, es decir, hechas de dígitos, de números, pues. Cada dígito representa un punto en la pantalla, y normalmente el valor que vemos corresponde al color que ese punto tiene en la imagen. De esta manera, las fotografías digitales (ya sean escaneadas o tomadas con alguna cámara digital), son en realidad una matriz cuadrada de pixeles (puntos en la pantalla), que bien puede ser en color o en blanco y negro.

En la medida en que la tecnología ha progresado, hemos pasado de imágenes de 256 colores a las que nos pueden mostrar alrededor 16 millones de colores. Actualmente, cualquier tarjeta de video que se precie de serlo muestra los tres componentes de color R(ed – rojo), G(reen – verde) y B(lue – azul) en cada pixel (o punto), el cual puede ser un valor entre 0 y 255. De esta manera, 256 x 256 x 256 nos da 16,777,216 posibles colores. Cabe señalar que el ojo humano no puede ver semejante espectro de colores, pero es un hecho que la computadora puede desplegarlos.

Ahora bien, cada fotografía digital es en realidad una aproximación sobre lo que se fotografía tomando una cámara analógica, es decir, una que tenga filme. Por ello mismo, “el grano” de la cámara digital es la precisión con la cual puede distinguir los detalles. Por ello vemos que hay cámaras digitales de 4, 8, 10 o más megapixeles. De hecho, tampoco ya el ojo humano no distingue entre, digamos, 8 y 10 megapixeles. De esta manera, la resolución de las imágenes ha crecido y con ello la necesidad de usar cada vez más bytes en los archivos y memorias donde se guarda.

Con el advenimiento de la tecnología digital de imágenes y su gran aceptación en el mercado, estamos viendo desaparecer las cámaras analógicas y los filmes. Se acabó el revelado y los costos asociados a esto. Además, con la generación de imágenes digitales, también nació la posibilidad de post procesarlas para generar efectos en ellas. Photoshop, por ejemplo, es uno de los programas más populares para manipulación digital de imágenes.

Filtros Digitales


La manipulación de una imagen digital se denomina genéricamente como un “filtro”, el cual convierte una imagen en alguna otra cosa. Existen filtros que son reversibles, mientras que también los hay aquellos que no lo son. De acuerdo a las necesidades, se pueden tener diversos filtros o transformaciones que pueden aplicarse a una imagen incluso ya filtrada. Los resultados suelen ser sorprendentes.

Muchos filtros gráficos, sino es que todos, se consideran transformaciones gráficas basadas en una matriz llamada también “convolución” (no se asuste por la palabra, es sólo un término que da precisión a todo esto). Estas convoluciones es el procesar segmentos de la imagen a partir de una submatriz (que puede ser de 3×3, 4×4, 5×5, etc.) de pixeles, que va recorriendo la imagen completa. El resultado final convierte la imagen original en alguna otra cosa. Existen filtros para reconocer bordes, para quitar ruido, para meter ruido, para hacer más precisa una imagen, para hacerla más borrosa, para deformarla, etc. Las aplicaciones son infinitas.

El filtro Oleo Digital (en tonos de grises)


En el libro Beyond Photography (The Digital Darkroom), de Gerard J. Holzmann, que trabajó algunos años en los Laboratorios Bell, el autor nos habla de cómo alterar imágenes. Ahí presenta la fotografía de Dennis Ritchie (uno de los inventores del lenguaje C), y al procesarla la convierte en la misma imagen, pero como si fuese pintada al óleo. De acuerdo al autor, lo que hace es esto: “Para cada punto en la imagen, un programa calcula el histograma de los 36 bordes del derredor [del punto de interés], en la vecindad del punto de interés, y se asigna el valor [al propio punto que estamos procesando] el valor que contenga la mayor frecuencia. El resultado es casi una pintura al óleo”.

Cuando intenté escribir mi propio programa que hiciese este filtro “al óleo”, decidí, sin embargo, no usar 36 puntos, sino 49, para que así mi matriz (llamada: de convolución), mi cuadrícula, tenga un punto central en [4,4]. Con una convolución par no se puede tener un punto central. Igualmente, generé un arreglo de 256 números (de 0 a 255), para colocar la frecuencia de los 49 valores de la matriz de 7×7, que voy recorriendo en la imagen, pixel a pixel. Así, saco los primeros 49 valores y encuentro la frecuencia de los mismos. En el punto de interés pongo el que tenga la mayor frecuencia. ¿Qué pasa si hay más de uno valor con la mayor frecuencia? ¿Cuál pongo? Cualquiera de ellos. Da lo mismo.


La imagen de la izquierda es la de Dennis Ritchie (el creador del lenguaje C), como aparece en el libro de Holzmann. A la derecha aparece mi propia versión del algoritmo descrito. ¿Cuál le gusta más a usted? Este programa funcionaba originalmente sólo con imágenes en blanco y negro (tonos de grises), pues en imágenes de tonos de gris hay nada más 256 tonos y además, las componentes RGB de cada pixel tienen el mismo valor, es decir, R=B=G, lo cual hace sencillo el encontrar el histograma de frecuencias de color. La diferencia en resultados es que Holzmann usa una matriz par y yo uso matrices impares.

El filtro Oleo Digital (en color)

Para poder generar imágenes al mejor estilo óleo, en color, se necesita hacer una modificación que parece trivial, pero que no lo es. La dificultad es que al querer pasar a color, tenemos que las imágenes pueden contener poco más de 16 millones de colores. Esto, obviamente hace el problema un poco más difícil, pues no podemos generar un arreglo de 16 millones (para seguir con la técnica usada en la parte en tonos de gris), pues es totalmente ineficiente y absurdo. Así, aquí hay que contar y crear el histograma de frecuencias de manera más sencilla. Después de dos semanas de darle la vuelta al problema, finalmente hallé una solución simple. La implementé y de pronto ya tenía mi programa que generaba el óleo digital en color. (¿Cómo le hice?… es parte del reto)

Al poder hacer el histograma y hallar cuál es el valor de mayor frecuencia, simplemente lo pinto para cada punto en la pantalla. Es claro que el filtro hace una imagen que pierde precisión contra una fotografía real, pero se asemeja, sin duda, a un cuadro hecho al óleo.

El reto es pues el siguiente: hágase el filtro óleo en color siguiendo la técnica: “Para cada punto en la imagen, un programa calcula el histograma de los 36 bordes del derredor [del punto de interés] y se asigna el valor [al propio punto de interés] el valor que contenga la mayor frecuencia. El resultado es casi una pintura al óleo”.




He aquí las bases adicionales del reto:

  • Ganará el programa que transforme la imagen de Lena (que aparece más abajo), en el menor tiempo posible. El segundo mejor tiempo obtendrá el segundo lugar.
  • Habrá dos lugares: Ambos se llevarán una taza con el logotipo de La_Morsa. Mi intención es que al imprimir esas tazas aparezca una leyenda con el título de la misma y el lugar obtenido, para que quede constancia por el tiempo de vida de la taza.
  • Los programas pueden hacerse en cualquier lenguaje de propósito general y no se vale usar en éste particularmente, bibliotecas que hagan filtros gráficos. Los programadores tienen que resolver el problema por sí mismo, sin ayuda de bibliotecas externas. (Desde luego, se vale usar alguna biblioteca para cargar/guardar la imagen de Lena para procesarla, la cual es un JPG, pero nada más). Así pues, C, C++, C#, Pascal (Delphi), Javascript, Python, Ruby, Visual BASIC, Visual C, Java, etcétera, son idóneos para esta labor.
  • Los autores de los programas deberán mandar el código fuente y el archivo ejecutable en Windows 7.
  • Un autor puede mandar versiones mejoradas de su propio software dentro del tiempo del concurso. No se tomarán en cuenta las que se salgan del tiempo establecido.
  • En la medida de lo posible, el programa debe indicar el tiempo total del proceso realizado para crear la imagen al óleo de Lena.
  • El autor debe enviar el código fuente y quienes ganen aceptan que su código quede accesible para quien lo quiera ver.
  • Los programas deben poderse ejecutar en el sistema operativo Windows 7 de 64 bits. Se correrán en una máquina AMD con 6 núcleos y los resultados obtenidos son inapelables y definitivos. De nuevo aclaro: este es un reto de buena fe y no un concurso estrictamente. Los premios son meramente un estímulo extra para que se animen a entrarle al reto. Evidentemente asumo que el código de cada concursante es creación del mismo y que no andan copiando el código de otras partes, foros, sitios en Internet, etcétera. En caso de hallar que el código fue copiado, el programador queda descalificado.
  • El reto dura una semana a partir del día de la publicación del artículo. Por ejemplo, si éste se publica un 10 de mayo a las 3 de la tarde, el reto se cierra el 17 de mayo a esa misma hora.
  • Cuando reciba algún programa participante en el reto, le enviaré un acuse de recibo para asegurarnos que están todos los que son y son todos los que están.
  • El concurso es para quienes viven en la República Mexicana. Si alguien de otro país quiere participar es bienvenido, pero no podrá acceder a los premios.
  • Los programas deben ser enviados a morsa@la-morsa.com o en su defecto a lopem@hotmail.com, por si alguna de las direcciones no funciona.

Así que queridos y entusiastas programadores, a entrarle al reto. Afilen sus herramientas de programación y que gane el mejor.

Imagen a procesar (512 x 512 pixeles):


Monday, March 18, 2013

La obsesión del ajedrecista


El ajedrez es un juego apasionante. Millones de jugadores, de todos los niveles, de todas las fuerzas, juegan en torneos abiertos, ven los problemas que se publican en revistas y libros, analizan las partidas de los grandes jugadres, están en el ambiente ajedrecístico tanto como la vida se los permite y disfrutan incluso analizando en la soledad de la noche, un problema artístico.

¿Pero qué tan obsesivo es el ajedrecista? Todo dependerá de qué tan fuerte le haya sido inoculado el virus del ajedrez. Esto viene de una narración de Mijaíl Tal, en donde dice que cuando se tiene contacto con el ajedrez es como cuando de pronto nos cae el virus de la gripe. En el caso del juego ciencia, jugamos unas partidas y en el transcurso a casa ya el virus está en acción, como el de la gripe. Nosotros estamos contentos, pero ya vamos “enfermos”, por decirlo de alguna manera.

Los ajedrecistas más obsesivos son, desde luego, aquellos que dedican muchísimo tiempo al tablero y estos son -en general- los grandes jugadores del mundo. Por ejemplo, Fischer estudiaba aún después de haberse convertido en Campeón Mundial, todas las noches. Cuando vivió en Taxco, México, por unos seis u ocho meses, el excampeón se retiraba a su habitación a las 9 de la noche y salía de ella a las 3 de la tarde. Estudiaba toda la noche, hasta las cinco o seis de la mañana y entonces dormía. Y que conste, ya Bobby Fischer estaba retirado de los tableros.

Por ejemplo, Boris Gelfand -de acuerdo a las palabras de Karjakin, el gran maestro más joven de la historia- habla de cómo es la vida del ajedrecista ruso, con nacionalidad israelí ahora: “Para desayunar se toma unos ejercicios de táctica, después da un paseo para solucionar problemas de ajedrez a la ciega, en la cabeza. Para almorzar se toma un pincho de partidas de sus próximos oponentes y para cenar se toma el menú completo de análisis y estudios duros de sus propias partidas”.

Pero quizás debamos hablar de los exponentes más notables del ajedrez: los campeones del mundo. Garry Kasparov, por ejemplo, estudiaba incansablemente ajedrez. Boris Spassky, en contraste, decía que era flojo para agarrar los libros, pero es claro que eso es una broma. Nadie a ese nivel de ajedrez es flojo. Tal vez frente a las horas que le dedicaba al ajedrez, Spassky era flojo con respecto a Kasparov, pero evidentemente cada ajedrecista de esos tamaños dedica mucho, prácticamente todo el tiempo al ajedrez.

La viuda de Geller dice que su esposo, por ejemplo, murmuraba jugadas de ajedrez mientras estaba durmiendo. El propio Karjakin hace esta revelación: A la pregunta expresa: ¿Cuánto ha durado el período más largo en el que Ud. no ha pensado en el ajedrez? La respuesta asombra: Tres días. Fue en enero, después del torneo en Wijk aan Zee. Después he participado en una sesión de entrenamiento que ha terminado hoy.

Así pues, que sean estas meras muestras de lo que hacen los ajedrecistas obsesivos. El ajedrez, lo decía Víctor Korchnoi, es la vida y no parece ser nada más una frase ingeniosa.

Saturday, March 16, 2013

Hasta los grandes se equivocan


La siguiente partida fue la última del match de 1985, entre Kasparov (negras) y Karpov. Con el triunfo de Garry, logró la puntuación necesaria para convertirse en Campeón del Mundo. La partida fue así

Karpov, Anatoly - Kasparov, Garry
Campeonato Mundial, Moscú 1985 (partida 24)
Defensa siciliana

1. e4 c5 2. Nf3 d6 3. d4 cxd4 4. Nxd4 Nf6 5. Nc3 a6 6. Be2 e6 7. O-O Be7 8. f4 O-O 9. Kh1 Qc7 10. a4 Nc6 11. Be3 Re8 12. Bf3 Rb8 13. Qd2 Bd7 14. Nb3 b6 15. g4 Bc8 16. g5 Nd7 17. Qf2 Bf8 18. Bg2 Bb7 19. Rad1 g6 20. Bc1 Rbc8 21. Rd3 Nb4 22. Rh3 Bg7 23. Be3 Re7 24. Kg1 Rce8 25. Rd1 f5 26. gxf6 Nxf6 27. Rg3 Rf7 28. Bxb6 Qb8 29. Be3 Nh5 30. Rg4 Nf6 31. Rh4 g5 32. fxg5 Ng4 33. Qd2 Nxe3 34. Qxe3 Nxc2 35. Qb6 Ba8 36. Rxd6 Rb7 37. Qxa6 


Karpov, Anatoly - Kasparov, Garry
Campeonato Mundial, Moscú 1985 (partida 24)
Juegan las negras
 
En este momento la partida entra al zeitnot, a la falta de tiempo. Ambos jugadores están con pocos minutos en el reloj. Kasparov se decide por 37. ... Rxb3 38. Rxe6 Rxb2 39. Qc4 Kh8 40. e5?? Karpov pierde la partida en esta jugada. Fue la última del control de tiempo. Después de eso no hay nada que hacer. Kasparov remató así: 40. ... Qa7+ 41. Kh1 Bxg2+ 42. Kxg2 Nd4+ 0-1

Sin embargo, en lugar de 37. ... Rxb3, Kasparov tenía una mejor jugada que hubiese ganado mucho más rápidamente. ¿Puede usted encontrarla? Dicha jugada la halló un aficionado de la ciudad de Bakú, donde nació Kasparov, una semana después, la cual pasó desapercibida por todos.

La jugada en cuestión es 37. ... Nb4! y la dama tiene que salir de la defensa de la torre, perdiendo inmediatamente.

Friday, March 15, 2013

Eficiencia en cómputo y resultados del reto Collatz


Actualmente tenemos programas que hacen un sinfín de tareas. Muchos de ellos -sino es que la mayoría- usan una interfaz gráfica para que los usuarios puedan tomar decisiones a través de botones, listas de opciones, etcétera. La interfaz gráfica se impuso por su facilidad de uso y el modo texto, o consola, fue desapareciendo poco a poco. Y aunque aún existe en los sistemas de cómputo, ya prácticamente todos los sistemas operativos utiliza una interfaz gráficaz, que se monta al arrancar el sistema y que ya está fusionado con la parte de interacción gráfica.

Pero ¿qué tanto influye la interfaz gráfica en el desempeño de un equipo de cómputo? ¿Cuántos recursos más requiere para correr un programa con relativa velocidad? Es una pregunta interesante y que a veces nos olvidamos de ello pues es claro que ahora las máquinas corren a unos 3 GHz y tienen 2, 4, 8 o más Gbytes de memoria. De hecho, cuando había computadoras de 8 bits y algunos intentos rudimentarios de interfaz gráfica (como el MousePaint de Apple //e), era claro que las limitaciones del hardware eran demasiadas.

Gracias a los avances en este rubro, parece que podemos tener una hermosa interfaz gráfica con el usuario y un desempeño fenomenal, pero aunque lo parezca, no es así. Hace unos días convoqué, vía este medio, a un reto de programación. Se trataba de hallar la secuencia más larga de números de Collatz. Hubo bastante aceptación de este "concurso" y he recibido una veintena de programas.

El reto en particular era hallar la secuencia más larga en un número del 1 al millón. Originalmente tomé mi código para calcular la secuencia de Collatz de un número y lo puse en forma de ciclo para que calculara todas las secuencias de 1 al millón. Como el programa trabajaba con una biblioteca para manejar números extremadamente grandes (más de 1000 cifras), el programa -al ejecutarse- tardaba más de diez minutos. Mi software desplegaba toda la secuencia para cada número y esto, evidentemente lo hacía muy lento.

Como en el reto sólo se pide hallar la secuencia más larga, no hay necesidad de desplegar cada cálculo que la máquina hace. Así, quitando el despliegue de esta información, el programa tardaba la mitad, es decir, unos 5 minutos. Aún así era lento. Vi programas de algunos de los participantes que tardaban menos de 15 segundos. ¿Cómo hacer para que mi programa corriera más rápido? Quité entonces la biblioteca de números grandes y usé el tipo predefinido LongInt. El programa, sin embargo, se atoraba en el número 999216. Vi la referencia y hallé que los LongInt aceptan números entre -2147483648 y 2147483647. Como algo estaba pasando, cambié las definiciones de los números a usar a LongWord, que aceptan valores entre 0 y 4294967295 y entonces mi programa corrió. Tardaba ahora alrededor de un minuto para hallar la secuencia pedida.

Pero ¿se podía ir más allá? La solución era hacer un programa que corriera sin necesidad del "overhead" que le mete la interfaz gráfica. Delphi permite crear aplicaciones que corran en modo consola/terminal. Se quita pues la sobrecarga que le impone la interfaz gráfica a todos los programas. Escribir código para aplicaciones sin interfaz gráfica es equivalente a escribir código en TurboPascal realmente. Con esto en mente, pasé mi programa más rápido a uno que no usara la interfaz gráfica. Así entonces, el programa no muestra los cálculos que hace. Sólo informa el resultado final. ¿Tiempo para hallar la secuencia más larga de Collatz? ¡Menos de 1 segundo! Sorprendente.

Desde luego que estos resultados pueden variar de acuerdo a la computadora que se esté usando, pero en esencia se mantiene la misma relación de velocidades. En conclusión, es claro que la interfaz gráfica hace muy lento, demasiado lento, el procesamiento de información. No pensaba que fuese tan grande esta sobrecarga, pero los números así lo indican. He aquí mi código en Delphi 7 (ejecutable disponible pidiéndomelo a mi correo morsa@la-morsa.com):

program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
  MaxNum    : LongInt; // núm máximo
  Contador  : Integer;
  Numero    : LongWord; //núm con la secuencia más larga
  Num1      : LongWord;
  NuevoLong : LongWord;
  NuevoCont : integer;

// Números de Collatz: Encontrar la máxima secuencia usando
// LongInt en lugar de la biblioteca de números grandes
// el programa se escribió en modo consola para evitarse el
// overhead que le mete la interfaz gráfica

procedure Calcula;
begin
  write('dame número máximo a calcular ');
  Readln(Num1); //leo el máximo número a calcular
  MaxNum := Num1;
  NuevoLong := 0;
  Contador := 0;
  NuevoCont := 0;
  repeat
    repeat
      if Num1 mod 2 = 0 then Num1 := Num1 div 2
                        else Num1 := (Num1 * 3) + 1;
      inc(Contador);
    until Num1 = 1;
    if Contador > NuevoCont then
    begin
      NuevoLong := MaxNum;
      NuevoCont := Contador;
    end;
    Contador := 0;
    dec(MaxNum);
    Num1 := MaxNum;
  Until MaxNum = 1;
  Writeln('Número: '+inttostr(NuevoLong)+ ' iteraciones: ' + inttostr(NuevoCont));
  readln;
end;

begin //main
  Calcula
end.


  Cabe señalar que hubo diferentes lenguajes en uso: Delphi, C++, C#, Ruby, Javascript, Java y Python. A pesar de ser interpretados algunos de estos lenguajes, su desempeño es estupendo, aunque me parece, no pueden competir con el compilador que genere código nativo y que además tiene, muchas veces, directivas para optimización. En este reto en particular, la velocidad para hallar la solución era el factor ganador. Sin embargo, en cualquier caso, es interesante ver el desempeño de varios de los lenguajes en boga. Una vez dicho esto, van los resultados del reto de la secuencia más larga en los números de Collatz, de 1 a un millón:  

  • Juan Claudio Toledo 00.029 segundos (primer lugar)  
  • Nayely Riverón Domínguez 00.047 segundos (segundo lugar) 
  • José Raúl Escobedo Arreola 00.053 segundos 
  • Darío Alvarez Aranda 00.164 segundos 
  • Fabían Vargas Quijano (*) 00.200 segundos
  • Carlos Torres Almonte 00.310 segundos 
  • Kevin Reyes 00.320 segundos  
  • Manuel López Michelone 00.420 segundos (fuera de concurso) 
  • Luis Alfredo Juárez Blanco 00.640 segundos 
  • Carlos Morales 00.699 segundos 
  • Cyb3rxPuNk . 01.010 segundos 
  • Eleazar Prieto 01.130 segundos 
  • Ricardo Padilla Amezcua 02.324 segundos 
  • Gerardo Robledo 03.300 segundos 
  • Luis Rivera 05.638 segundos 
  • Rafael Mendoza 06.540 segundos 
  • Francisco Pérez 06.790 segundos 
  • lugo tache 07.320 segundos 
  • Eduardo Ruíz 07.490 segundos 
  • David Garza 09.000 segundos 
  • Ernesto Valderrama Blum 36.070 segundos 
  • Roberto López Bedolla 36.350 segundos 
  • Gabriel Romero 41.200 segundos 
  • Rockodev 110.720 segundos 
  • Juan Rafael Corrales más de 5 minutos 
  • Cristian Castro Cienfuegos N/A (**)  
(*) Vargas Quijano incluyó en el envío de su programa, un estudio sobre una forma de optimizar el problema para que busque de manera más inteligente. Muy interesante enfoque, sin duda.

(**) Nunca pude correr su programa. Mi sistema decía que faltaba un archivo dll que busqué, descargué y puse en mi sistema, pero jamás lo reconoció o algo extraño pasó.

Juan Claudio Toledo, ganador del reto de Collatz

Me dice Juan Claudio Toledo, que está terminando su doctorado en la UNAM, (el ganador de este reto), en el correo en donde me mandó el programa, los siguiente:  

Me di cuenta que la respuesta al problema debe ser siempre > N/2. Es decir, el entero entre 1 y N con mayor ciclo debe estar en la segunda mitad del intervalo [1,N]. ¿Por qué? Acá lo demuestro, por reducción al absurdo.  

Sea x el entero entre 1 y N con mayor ciclo. Supongamos que x <= N/2. Puedo definir y = 2*x; como x <= N/2, tenemos que y <= N, por lo que y es también un candidato. Pero como y es par, la primera iteración del algoritmo empezando en y nos daría y/2 = x, y llegamos a x. De ahí la secuencia iría igual que si se empezara en x. Debido a esto, el ciclo de y es un paso más largo que el de x. Entonces x no es el entero de mayor ciclo, y se llega a una contradicción. Por lo tanto, x debe ser mayor que N/2.  

Modifiqué el programa para que buscara a partir de N/2+1, pero me salió un tiempo más grande. La razón: estoy usando un cache para recordar los valores ya calculados, pero en este caso nunca se calculan los ciclos de números menores que N/2. Y pues esos valores se usan bastante. Empezando desde cualquier número, la secuencia debe pasar *al menos* log_2(N/2)~18 veces por números en la primera mitad. De forma que al hacer este cambio, aunque calculo sólo la mitad de los casos, me cuesta más pues no aprovecho tanto el cache.

Así entonces, como podrán ver, esta conjetura de Collatz tiene mucha tela de donde cortar. Con respecto al reto me gustaría hacer algunas aclaraciones:
  • Los tiempos los medí en mi computadora, con un procesador AMD de seis núcleos y sistema operativo Windows 7 de 64 bits. Puede haber máquinas en donde los concursantes probaron y sus programas corrieron más rápido que lo que mi máquina reporta. Los tiempos para el reto se miden desde mi máquina.
  • El fallo es inapelable. Este es un concurso hecho de buena fe, tanto por quienes participan en él como yo, quien evalúa los resultados de la manera más legal y justa posible. Aún así y para que no quede duda: los resultados son inapelables y definitivos.
  • Los premios tienen como objetivo motivar a quienes quieren concursar, pero desde luego, solamente es una motivación extra. Lo importante aquí es mostrarse como un programador que puede ser mejor que los demás en eficiencia, en maneras de resolver un problema de programación.
  • Cuando quise probar algunos de los programas hubo errores. Por ejemplo, no hacían correctamente el cálculo. En su momento les indiqué a los concursantes con estas dificultades sobre los problemas de su software y les pedí que me mandaran las versiones corregidas. Quienes por alguna razón no me las mandaron, simplemente quedaron fuera del reto.
  • Sobre los ganadores: El primer lugar, tiene derecho a elegir el premio: la taza con el logo de La_Morsa o la tarjeta SD de 4 GB. Me pondré en contacto por correo electrónico con los ganadores para darles su premio y que me den una foto para ponerlos en la galería virtual de honor. Felicidades. La verdad me satisface mucho ver que hay tanto empuje y tan buenos programadores en este país. Me tiene muy contento eso. Agradezco la entusiasta participación y prepárense para el siguiente reto.
Los programas ganadores (el código fuente), son los siguientes:

Programa de Juan Claudio Toledo:

/************************************************************\
* collatz.cpp                                                *
*                                                            *
* Autor: Juan C. Toledo                                      *
* Fecha: 13 de marzo de 2013                                 *
*                                                            *
* Encuentra el entero entre 1 y N con el ciclo mas largo,    *
* bajo el algoritmo de la conjetura de Collatz. Emplea       *
* memoization para optimizar la busqueda.                    *
*                                                            *
* Copyright 2013 Juan C. Toledo                              *
*                                                            *
* Este archivo es parte de collatz.                          *
*                                                            *
* collatz es software libre: usted puede redistribuirlo y/o  *
* modificarlo bajo los términos de la GNU General Public     *
* License, publicada por la Free Software Foundation, ya sea *
* la versión 3 de la licencia, o (a su opción) cualquier     *
* versión posterior.                                         *
*                                                            *
* collatz se distribuye con la esperanza de que sea útil,    *
* pero sin ninguna garantía; ni siquiera la garantía         *
* implícita de comerciabilidad o idoneidad para un propósito *
* PARTICULAR. Consulte la GNU General Public License para    *
* más detalles.                                              *
*                                                            *
* Usted debe haber recibido una copia de la GNU General      *
* Public License junto con Foobar.                           *
* Si no, véase http://www.gnu.org/licenses/                  *
\************************************************************/

#include < stdio .h >;

int main () {

  // ======================
  // Configuracion
  // fijar verbose a false para mejorar el tiempo de ejecucion
  
  const int N = 1000000;
  bool verbose = false; 

  // ======================

  int ciclos[N+1];
  int i, pasos, maxpasos, maxnum;
  long int x;

  // Calculamos para todos los enteros desde 1 hasta N
  maxpasos = 0;
  maxnum = 0;
  for (i=1; i<=N; i++) {

    // Bucle que simula el juego
    x = i;
    pasos = 0;
    while (x!=1){
      // Si x es menor a i, ya hemos calculado su ciclo
      if (xmaxpasos) {
      maxpasos = pasos;
      maxnum = i;
      if (verbose) printf(" Nuevo record!");
    }
    if (verbose) printf("\n"); 
  }

  printf("Ciclo mas largo (n<=%i): ",N);
  printf("%i con %i pasos\n",maxnum,maxpasos);
  
  return 0;
}

Nayely Riverón Domínguez, segundo lugar en el reto de Coillatz

El código de Nayely:
    
#include < stdio .h >;
    #include < stdlib .h >;
    #include < time .h >;

    int main(void){
         unsigned long tope=1000000, iteraciones=0, i=0, num=0, iteracion_mayor=0, numero_mayor=0;
         int *iteraciones_totales;
         
         printf("Ingrese tope: ");
         scanf("%lu",&tope);

         clock_t t_ini, t_fin;
         double secs;
         t_ini = clock();
         
         size_t tamanyo=tope;
         iteraciones_totales = (int *)malloc( tamanyo*sizeof(int) );
         
         for(i=1;i<=tope;i++){  
            iteraciones=0;            
            num=i;
            while (num > 1) {
                    if(numiteracion_mayor){
                     iteracion_mayor=iteraciones;
                     numero_mayor=i;
            }
            
         }
         
         printf("DEL 1 AL %lu\n\nNumero: %lu\nIteraciones: %lu\n\n",tope,numero_mayor,iteracion_mayor);
         
         t_fin = clock();
         secs = (double)(t_fin - t_ini) / CLOCKS_PER_SEC;
         printf("El tiempo de calculo fue: %.16g milisegundos\n", secs * 1000.0);

         
         getche();
         free(iteraciones_totales);    
         
         return 0;
    }

Wednesday, March 13, 2013

Nicolás Maduro y la inteligencia


Maduro, el candidato favorito para ganar las elecciones en Venezuela ya dice francamente necedades y estupideces. Pero no es sólo la cantidad de tonterías que salen del cerebro de este señor, sino de los que lo escuchan, que le aplauden. Es claro que Maduro no quiere que el mito Chávez muera, porque está casi obligado a mantener al recién fallecido Hugo Chávez, con toda su mística, para vencer en las elecciones.

La realidad es que cuando el poder está en juego, se vale todo, hasta decir todas estas sandeces, porque además se las aplauden. Pero no me crean. Véanlo por ustedes mismos:


De colofón, lo que dice Pacasso en su Unidad de Quemados, esta vez con Nicolás maduro:


En m opinión, Maduro ya se "deschavetó", literalmente.

Monday, March 11, 2013

Confesión insólita (*)



Corría el año 1927. Capablanca y Alekhine se enfrentaban en Buenos Aires, Argentina, por el título mundial El match había generado una gran expectativa. El encuentro era sin límite de partidas. Los empates no contaban. Ganaría quien llegara primero a seis triunfos. Antes del encuentro por el título mundial, el resultado entre ambos jugadores era claramente favorable a Capablanca por cinco triunfos, siete empates y ninguna derrota. De hecho, la última victoria de Capablanca sobre Alekhine había sido unos pocos meses antes en el Torneo de Nueva York. En ese torneo sextangular, Capablanca había tenido una actuación brillante y lo había ganado con 2.5 puntos de ventaja sobre Alekhine, que terminó segundo. Las cosas no sonaban fáciles para el retador, Alexander Alekhine, sin embargo, afirmaba alegremente a los medios: "no sé cómo le voy a ganar seis partidas a Capablanca... ¡pero tampoco sé cómo él me las va a ganar!".

Comenzó el encuentro con una sorprendente victoria del retador, después de una dudosa apertura del genial cubano. La segunda partida fue un empate y en la tercera Capablanca venció, para emparejar los cartones. Hubo otros tres empates y de nuevo el campeón defensor, en la séptima partida volvió a ganar. Otra retahíla de tres empates y el retador le daba la voltereta al encuentro ganando las partidas diez y once.

Sin duda el climax del match parecía acercarse, pero hubo que esperar porque el equilibrio se mantuvo por ocho partidas y de nuevo, Alekhine, triunfaba, alejándose en el marcador por tres puntos de ventaja. Parecía que todo estaba dicho pero el cubano no cedería sin luchar su título. Otros siete empates y Capablanca retomaba el triunfo. Ahora estaba a dos puntos del retador, pero claro, sin contar los empates, el match estaba lejos de estar decidido.

Y entonces ocurrió algo notable esa noche. Después de la victoria del cubano en la partida número 29. Ambos jugadores ya notaban en su rostro las huellas de tantas y difíciles partidas. Capablanca cenó frugalmente y se fue a dormir. Se aprestaba a ello cuando tocaron la puerta de su habitación en el hotel más elegante de Buenos Aires. Abrió la puerta y un hombre, con un largo abrigo y barba le extendió la mano diciéndole: “Buenas noches, Señor Capablanca, le molesto porque he hecho un descubrimiento impresionante”. El cubano hizo un amago de cerrar la puerta, pero el hombre le detuvo mientras le decía: “le ruego 20 minutos de su tiempo”… y después de una larga pausa continuó: “por favor…”

Ante esto, el gran campeón le dejó entrar y el hombre se quitó el largo abrigo, sacando una bolsa que contenía un ajedrez el cual rápidamente dispuso en una mesita. Era un hombre corpulento y alto. Se sentó en la primera silla que halló y habló: “Mire, maestro”, le dijo el bizarro personaje, “he encontrado la manera de ganar en ajedrez en 26 jugadas, haga lo que usted haga”. Capablanca sonrió. No era la primera vez que alguien afirmaba semejante locura. Hizo un ademán de fastidio pero el sombrío hombre continuó: “Juguemos una partida. Si no le gano en 26 jugadas me excuso y no le molesto más”.

Capablanca, para terminar con el episodio decidió jugar con el extraño personaje… “¿Quiere jugar blancas o negras?”  le preguntó irónicamente Capablanca a su eventual rival. “No importa qué piezas elija, le ganaré en 26 jugadas o menos, dijo aquel hombre con una seguridad aplastante que acaso infundía cierto temor. Comenzaron la partida y a las pocas jugadas el cubano estaba en graves problemas. El hombre aquel le ganó en menos de 26 jugadas con un mate que dejó frío al campeón. No lo podía creer. Reacomodó las piezas pensando que todo era una mala pasada, pero en la siguiente partida el campeón volvió hallarse en dificultades. El extraño rival parecía jugar con una seguridad impresionante. No meditaba mucho cada movimiento, pero sus ojos reptaban por todo el tablero. Hacía sus jugadas con firmeza. Las manos del rival de Capablanca dibujaban un pasado complejo. Eran unas manos rudas, llenas de callosidades. Parecían tener cientos de arrugas… El campeón del mundo, pocas jugadas después, tuvo que inclinar su rey. Recibía otro trepidante jaque mate en menos de 26 jugadas de nuevo.

Capablanca le vio a los ojos y se quedó suspenso… No halló brillo ni emoción en los de su antagonista. Hubo un silencio incómodo… Antes de que Capablanca le preguntara cómo hacía para ganar una y otra vez, el hombre aquel recogió sus trebejos y los metió metódicamente en la bolsa. Se puso su abrigo y le dio las buenas noches al campeón, indicándole que lo vería en otra ocasión. Capablanca solamente acertó a decir: “Enséñele esto al Sr. Alekhine, a ver qué piensa…”, mientras el hombre aquel se iba por el pasillo del hotel sin siquiera voltear a mirarlo.

Dos empates más pasarían en el encuentro por el Campeonato del Mundo y Alekhine volvía a derrotar en el match a Capablanca. Le faltaba una partida más para hacerse campeón. Al término de la misma, cuando Capablanca felicitaba a su rival por la manera en como le había ganado, le preguntó a Alekhine si un extraño hombre no había tocado la puerta de su cuarto un par de días antes. El retador entonces le contó lo siguiente: “Sí, alguien tocó la puerta de mi habitación y me dijo que había encontrado una manera de ganar siempre en ajedrez en menos de 26 jugadas”… y agregó: “parecía un lunático… Me reí un poco de él… Pero ante su insistencia lo dejé pasar y jugamos no una, ni dos, sino decenas de partidas esa noche. ¡Le confieso que perdí todas! Y en menos de 26 jugadas. Era asombroso. Aún no lo puedo creer… Pero ya a punto de amanecer, con ese hombre ahí, que no reflejaba emoción alguna, que casi no parpadeaba, decidí que solamente había una cosa por hacer…¡Tuve que matarlo!”.

___
(*) He aquí el cuento que mandé al concurso que promovió la UNAM en ese sentido, en la segunda Feria del Ajedrez 2012.

Friday, March 08, 2013

Otro reto con la conjetura de Collatz


La conjetura de Collatz es muy sencilla y cualquiera puede entenderla: elíjase un número entero positivo. Si es par, divídalo entre dos; si es impar, multiplíquelo por 3 y súmele uno. A ese resultado proceda de la misma manera. Así, si tomamos, por ejemplo, el número 10, tendremos que es par, entonces dividiremos entre 2, lo cual nos da 5. A ese resultado, multipliquemos por 3 y sumémosle 1. Tendremos como resultado 16. Como es par, entonces tendremos 8, siendo par este dividimos de nuevo entre dos y obtendremos 4. Hacemos de nuevo la división y hallamos 2. Dividamos de nuevo y obtendremos 1. Decimos entonces que 10 es un número maravilloso o de Collatz.

Llegar a probar que 10 es maravilloso lleva 6 pasos: 10 –> 5 –> 16 –> 8 –> 4 –> 2 –> 1. El número 27, por ejemplo, requiere de 111 iteraciones antes de llegar a 1 y es el número de más iteraciones menor de 50. Cuando John Conway (el creador del juego de la vida) explica la conjetura pasa al pizarrón y dice: "veamos qué pasa si usamos un número al azar… digamos 27"…

Se me ha ocurrido un reto de programación, el cual es hacer un programa que nos diga cuál es la secuencia más larga para llegar a 1 -en la conjetura de Collatz, desde luego- que tienen los números del 1 a un millón. El resultado que el programa debe otorgar es cuál número, en el intervalo [1 .. 1,000,000] tiene la secuencia más larga. Cabe decir que hay dos premios fastuosos: una tarjeta SD de 4 GBytes y una taza con el logotipo de La_Morsa. El programa que llegue al número con la secuencia más larga en el menor tiempo posible, se llevará uno de esos premios (eso lo decide el ganador). El segundo lugar, es decir, el segundo mejor tiempo que llegue a la respuesta correcta, se llevará el premio sobrante. Cabe señalar que los programas que se remitan a mi cuenta de correo deben tener el código fuente y las instrucciones precisas para que los pueda probar. Habiendo tantos compiladores y diferentes sistemas, deben decirme qué hacer para compilar y correr el código a concurso (añadiendo una copia del ejecutable).

Así que a afilar sus armas. A programar y a optimizar. Veamos qué dicen nuestros programadores. Yo ya escribí mi propia versión para resolver este problema. A quien le interese el software, puede pedírmelo a morsa@la-morsa.com y a vuelta de correo tendrá el enlace para descargarlo.

Friday, March 01, 2013

Software del pasado, ¿por qué no hacerlo de código abierto?


El cómputo moderno avanza a pasos agigantados. Consideremos, por ejemplo, las computadoras que teníamos en los años noventa y a principios del nuevo siglo, con las que ahora usamos. Los avances en hardware, velocidad, componentes, etcétera, aunado a los avancen en software, hacen que programas con veinte, quince, diez o cinco años, nos parezcan francamente obsoletos. Y lo son, pero no por ello son inútiles. En su momento era lo que había y eso era lo mejor.

Considérese el juego Karateka, el cual jugué en su momento en una Apple II. Véanse las gráficas del programa original y compárense contra la versión que ahora incluso puede jugarse en el iPhone, que de hecho, es al menos cientos de veces más poderoso que la propia Apple II. El avance es francamente notable. Pero no quiere decir esto que jugar el Karateka original sea aburrido. Para nada. Sigue siendo igual de divertido que antes e incluso, es admirable lo que lograban en computadoras que decididamente no tienen ni remotamente los recursos con los que ahora contamos.

Por ello, particularmente en lo que se refiere a software, ¿por qué no poner el código fuente de muchos programas del pasado en la modalidad de código abierto? Sería quizás una manera de que estos, por ejemplo, pudiesen ser útiles en la enseñanza de la programación en las escuelas. Photoshop 1.0 ya está en esta modalidad. El código fuente puede obtenerse de este enlace. En este caso, es claro que las versiones actuales de Photoshop hacen maravillas frente a la 1.0, pero muchos algoritmos bien podrían ser utilizados para enseñar cómo se programan interfaces gráficas, cómo se hacen filtros para procesar imágenes, etcétera. Algo así como un meter las manos y ensuciarse, lo que los norteamericanos llaman "a hands on approach".

Pensemos en los lenguajes de programación como las primeras versiones de turbo Pascal. Si Borland (o quien sea el dueño de esos programas), los pusiese en la modalidad de código abierto, probablemente aprenderíamos de cómo generar código de máquina a velocidades que solamente unos cuantos saben hacer -a la fecha.

Porque muchas compañías matan literalmente líneas de productos que no son comercialmente víables, pero al final del día ¿a dónde se fue todo ese conocimiento? ¿se tira y ya? No sería mala idea pedir -hasta exigir- a estas empresas, que hagan un bien a la humanidad donando el código fuente de productos a los cuales ni siquiera le sacan dinero ya?

Hay ejemplos curiosos. Nokia prometió el código fuente de Symbian (actualmente en desuso) y ponerlo en la modalidad de código abierto. Pero se arrepintieron y rápidamente bloquearon esta posibilidad totalmente. ¿De verdad creen que ese producto tiene aún víabilidad comercial? ¿ya vieron lo que hay en el mercado actualmente? En mi opinión hay ceguera o peor aún, egoísmo ¿o no?