Showing posts with label programadores. Show all posts
Showing posts with label programadores. Show all posts

Saturday, June 28, 2014

Reto de la programación lúdica: silabeo de un texto


Cuando fuimos a la primaria, quiero suponer que fue ahí, se nos enseñó a silabear un texto, es decir, separar en sílabas las palabras. Esto se hacía con mucha frecuencia en las publicaciones pero cuando la computadora llegó finalmente a la cotidianidad, nos encontramos con que los procesadores de palabras, la mayoría de origen estadounidense, no silabeaban, vamos, no separaban una palabra en sílabas por si no cabía en una línea, sino que en ese caso, toda la palabra se bajaba a la siguiente línea.  Programas como InDesign -de Adobe- tiene la opción de silabeo para no ajustar las líneas con espacios de más o separando las letras unos puntitos aquí y otros allá para poder justificar una línea completa.

El silabeo es pues quizás una especie de arte perdido. ¿Cómo se silabea una palabra? He aquí las reglas elementales:

1. Cuando una consonante está entre vocales se une a la vocal que la sigue.
* Ejemplo: a-ni-llo, mo-ne-da
2. Cuando hay dos consonantes entre vocales, la primera se une a la vocal precedente y la segunda, a la siguiente.
* Ejemplos: al-to, ar-tis-ta
3. De tres consonantes entre vocales, las dos primeras se unen a la vocal que las antecede y l aotra, a la que sigue.
* Ejemplos: ins-tar, abs-ten-ción, pers-pi-caz
* Excepciones: cuando hay grupos inseparables de consonantes: in-glés, am-pliar
4. Cuando hay cuatro consonantes entre vocales, entonces, las dos primeras se unen a la vocal anterior y las otras dos a la que sigue.
* Ejemplos: ins-truir, trans-gre-sión
5. Las consonantes forman grupos inseparables cuando se encuentran las letras “l” o “r” junto con alguna de las letras “b”, “c”, “d”, “f”, “g”, “p” o “t”.
* Ejemplos: a-brir, a-gra-da-ble, de-plo-ra-ble
6. Cuando dos vocales forman un diptongo, éstas no se separan al silabear.
* Ejemplos: ai (baile); au (pausa); ei (peine, ley); eu (feudo); ia (viaje); ie (pieza); io (odio); iu (ciudad); oi (oigo, hoy); ou (bou), ua(agua); ue (vuelta); ui (juicio); uo (arduo).
* La h colocada entre dos vocales que pueden formar diptongo no impide su formación: ahi-ja-do, ahu-yen-tar, prohi-bi-do, rehu-sar
7. Cuando dos vocales forman un adiptongo (hiato), éstas se separan al silabear.
* Ejemplos: po-e-ta, ma-re-o, a-ho-go, o-ír, ra-íz, ju-dí-o

Pues bien, el reto de esta semana de la programación lúdica  es silabear el siguiente texto (Prólogo “El Principito” de Saint Exupery), haciendo que el texto entre en una caja que contiene N líneas, con líneas de 40, 60 ó 75 caracteres por línea.

Prólogo “El Principito” de Saint Exupery

Pido perdón a los niños por haber dedicado este libro a una persona mayor.
Tengo una seria excusa: esta persona mayor es el mejor amigo que tengo en el mundo. Pero tengo otra excusa: esta persona mayor es capaz de comprenderlo todo, incluso los libros para niños.

Tengo una tercera excusa todavía: esta persona mayor vive en Francia, donde pasa hambre y frío. Tiene, por consiguiente, una gran necesidad de ser consolada. Si no fueran suficientes todas esas razones, quiero entonces dedicar este libro al niño que fue hace tiempo esta persona mayor. Todas las personas mayores antes han sido niños. (Pero pocas de ellas lo recuerdan).

Corrijo, por consiguiente, mi dedicatoria:

A LEÓN WERTH, cuando era un niño.

Por ejemplo, si tuviese una caja de 20 caracteres pondría:

Pido perdón a los ni-
ños por haber dedica-
do este libro a una 
persona mayor.
Tengo una seria excu-
sa: esta persona ma-
yor es el mejor ami-
go que tengo en el 
mundo. 
 
etcétera...

Así, el programa debe poderse generalizar a cualquier cantidad de columnas que se me ocurra (digamos de 10 a 80).

Este programa, probablemente puedan encontrarlo en la red. No se trata pues de copiarlo de algún sitio. Si descubro una copia o si tengo dudas, me tomo la libertad de preguntarle al autor directamente cómo hizo, para garantizar así que la solución fue escrita y no copiada por el autor del programa. Juguemos pues limpiamente y aprendamos todos de estos retos.

¿El premio? Una taza con el logotipo de la Morsa a la mejor solución. Esto solamente aplica a los programadores que vivan en el DF (mandar a provincia o a otros países una taza es estúpidamente costoso). En caso de que los concursantes sean de otros países o de la provincia mexicana, el premio será una memoria USB de 8 GBytes y se les enviará por correo certificado. Y sí, sé que no son los grandes premios pero mientras no tengamos patrocinadores, esto es lo que hay.

Evidentemente quien gane será anunciado aquí y hasta tendrá sus quince minutos de fama. Sus programas me los pueden mandar a morsa@la-morsa.com y pueden escribirse en cualquier lenguaje. Es importante señalar que hay que mandar el código fuente, el ejecutable (si procede) y el archivo de resultados pedido. Igualmente, se pide una explicación breve de la estrategia usada. Código documentado tiene más posibilidades de ser considerado el ganador.

Cabe señalar que este concurso busca simplemente alentar el trabajo de la programación y mostrar que puede ser lúdica. Es un concurso de buena fe. Si hay, por ejemplo, dos o más respuestas satisfactorias, ganará quien la haya mandado primero. El ganador cede su código fuente a la comunidad. Es decir, se promueve el código abierto.

Referencias:

Buenas Tareas
Reglas silabeo

Tuesday, May 14, 2013

De ética y virus


Hace mucho tiempo me entró un virus. No me acuerdo cómo es que se infiltró en mi sistema (tengo el AVG antivirus), pero el caso es que empezó a aparecer una ventana, que ocupaba un cuarto de la pantalla en donde se me informaba que estaba infectado. para quitarlo, me remitían a un sitio web, el cual me cobraba unos 50 dólares por darme el antídoto a este mal. El virus y su correspondiente vacuna  aparentemente estaban hechos por el mismo autor o autores, es decir, los infelices -si lograban infectar una máquina- pedían "rescate" por desinfectarla. En ese entonces decidí que no me iba a dejar chantajear y finalmente, a eso de las 3 am, hallé un oscuro programa (que funcionaba en modo consola) y que funcionó, quitándome el virus aquel.

Ayer me pasó algo parecido. De pronto aparece una ventana de un supuesto antivirus llamado System Care Antivirus. Revisó mi disco y halló un sinfín de virus. Esto sonaba sospechoso, porque en general mi sistema está libre de tanto parásito y malviviviente cibernético. Decidí quitar ese programa, el cual no recordaba haber instalado (pero ahí había un icono para ejecutarlo) pero el sistema se negó. Quise entonces entrar a la lista de procesos y el sistema me avisó que el taskmanager estaba infectado. Intenté entrar a Internet, pero de nuevo se me indicó que Chrome estaba infectado. Eso no podía ser. Evidentemente aquí había una trampa.

No me llevó mucho tiempo hallar que ese System Care Virus es un programa que simula revisar la máquina, pero como el primer programa que mencioné al inicio de este artículo, era falso y de nuevo, me pedían unos 99 dólares por registrar mi producto y librarme de toda esa problemática que -literalmente- había imposibilitado cualquier función de mi sistema.

Entré a Internet (desde otra computadora) y al poner en Google "System Care Antivirus", hallé lo que sospechaba: un programa disfrazado de antivirus cuya función es asustar al usuario diciéndole que tiene N bichos en su máquina y que por unos dólares me podían mandar la vacuna universal y mantener mi máquina libre de todo mal. Entre las posibles soluciones (porque cualquier programa tiene una cantidad limitada de maneras de instalarse en el sistema), lo primero que e me pedía era entrar a Windows pero en modo protegido con funciones de red. Ahí, me decían que bajara un par de programas para quitar el virus, cosa que hice, pero antes me fijé en donde estaba instalado el System Care Antivirus. Lo hallé en c:\ProgramData\, el cual estaba en una de esas carpetas que tienen montones de números y letras. Ahí había 3 archivos: uno con terminación "exe", otro con terminación "ico" y uno más con terminación "dat". Los borré los tres, borré esa carpeta y reinicié... Y listo, desapareció el problema.

El punto es que este infame programa, que de verdad, no sé cómo se coló en mi sistema, me quitó una hora de mi vida. Estaba intentando escribir un programa para procesar una serie de imágenes (ya hablaré de ello próximamente), y tuve que abandonar la tarea ante la imposibilidad de poder usar mi máquina por esta tonta infección.

Pero más allá de eso, me resulta inconcebible que existan programadores que prácticamente con un chantaje tan burdo (o incluso muy sofisticado) busquen hacerse de dinero. Evidentemente los programadores de esta trampa cibernética no eran muy hábiles, pero es claro que usaron un par de trucos para hacer difícil desaparecer la "infección". En ese sentido son delincuentes, porque meten un programa avieso para sacar ventaja del mismo. Y eso está totalmente fuera de la más elemental ética. En fin, ya nada me sorprende del ser humano.

Wednesday, April 10, 2013

¡Ganadores del reto Óleo!


¡Tenemos ganadores! Este nuevo reto de la programación lúdica dio buenos programas, software de calidad, que demuestra que hay talento y neuronas para resolver los problemas de programación que surjan. Me queda claro que hay en este país mucha gente capaz en lo que se refiere a escribir código y es algo que debemos valorar. Después de ejecutar los programas de quienes participaron en el reto Óleo, se llegó a la siguiente tabla de resultados:

  • Fabián Vargas Quijano     0.336 segundos (ganador)
  • Rafael Mendoza                0.530 segundos (segundo lugar)
  • Juan Claudio                        0.630 segundos
  • Humberto Floriano               1.635 segundos
  • Sergio Avendaño                  1.840 segundos
  • Guillermo Canedo                2.421 segundos
  • Christian Israel                     2.963 segundos
  • Alex Zúñiga                         3.467 segundos
  • Manuel López Michelone    19.19 segundos (no participa)
  • Ernesto Valderrama             26.00 segundos (estimado)

En esta ocasión hubo menos participantes, pero asumimos que esto se debió a que el reto era más complicado. Sin duda que el ganador, Fabián Vargas, de Colombia, hizo un muy buen trabajo, pues la imagen de Lena la convirtió en una tercera parte de un segundo. Asombroso. El segundo lugar, Rafael Mendoza, logró un muy buen tiempo, aproximadamente medio segundo.

Fabián Vargas, ganador de este reto


Los archivos, con el código fuente y los respectivos ejecutables, pueden obtenerse aquí:

  •     Para el programa de Fabián Vargas, descargarlo de aquí.
  •     Para el programa de Rafael Mendoza, descargarlo de aquí.

No pongo el código fuente de los programas ganadores en este artículo porque tienen cierta complejidad y ocupan mucho espacio.

Rafael Mendoza, segundo lugar


Rafael Mendoza me mandó, en el transcurso del reto, varias versiones de su programa. En uno de sus mensajes me dice: Quizás no sea el más rápido, pero el haberlo hecho ya me hace ganador ya que primero me había rendido y después de investigar como tratar las imagenes con C#, empece y bueno, aquí está, tengo la idea de como mejorar el tiempo pero la verdad no he podido implementarlo.

Así pues, el esfuerzo tuvo más que recompensa.

El tercer lugar, Juan Claudio Toledo, (ganador del reto Collatz, a todo esto), me mandó un programa que por alguna razón en mi Ubuntu no corrió. No hacía nada. Le pedí me mandara información de la corrida en su máquina como las características de la misma y me da la impresión que por los datos que envió, en hardware es más o menos equivalente a mi máquina de pruebas. Tomo los tiempos que Juan Claudio me dio, con la promesa de que si puedo hacer correr su programa y además, corre más rápido que el primero o segundo lugar, le daré una taza de La_Morsa, aunque sea “post-mortem”.

Con respecto al programa de Ernesto Valderrama, lo escribió en Ruby, que es un intérprete (no es la mejor idea para competir contra otros sistemas que generan código nativo), usando una biblioteca para cargar imágenes llamada rmagick. Quise instalarlas y aún consultando con Ernesto e intercambio muchos mensajes, no lo logré. Entonces le pedí que corriera su software y me diera el tiempo estimado de procesamiento. Igualmente le pedí que me diera las características de su máquina y con esos datos saqué el tiempo estimado que habría tardado su programa en la máquina de pruebas. Desde luego que puedo estar equivocado pero el margen de error no representa “riesgo” para los que ganaron el reto, pues sus tiempos son demasiado cortos contra el que me envió Ernesto. Aún así, agradezco el interés por resolver la problemática.

¡Felicidades a ambos participantes! Y los esperamos en el siguiente reto, que promete ser complejo y emocionante. Gracias a todos por participar.