Sunday, July 27, 2014

¿Cuáles son las palabras diferentes en el Quijote?


Hace unos días se convocó al reto de hallar cuántas palabras diferentes tenía el Quijote, la obra de Cervantes, además de hallar la frecuencia de cada una de estas palabras. El reto, para un programador novicio puede parecer muy complicado, porque además se pide realizarlo en el menor tiempo posible. ¿Cómo se programa pues algo así?

Aquí la problemática se centra en la estructura de datos a usar. Por ejemplo, imaginemos que queremos usar un arreglo de palabras para irlas acomodando en la medida que las voy leyendo. El primero problema con esto es que no sabemos el total de palabras que hay por lo cual ¿De qué tamaño voy a hacer mi arreglo? Bueno, si el Quijote (como esá en el Proyecto Gutenberg) tiene unas 2 millones de letras, es razonable pensar que un 20% máximo serán palabras, más o menos 400 mil palabras.

Podemos crear un arreglo de 400,000 palabras y esperemos que esto sea suficiente, aunque en principio, sino sabemos cuantas palabras hay, estamos "adivinando" considerando que el promedio de letras de las palabras del español es menos de 10 letras por palabra. Pero esto último es una grosera aproximación a la cual estamos obligados si queremos usar la estructura de datos llamada arreglo.

Pero hay otra opción: usar estructuras de datos dinámicas. En este tipo de estructuras, lo que intentamos hacer es ir creando, en la medida de las necesidades, las estructuras necesarias, las cuales pueden crecer en la medida que lo vamos requiriendo. Dicho de otra manera, si necesitamos una nueva variable para alojar un dato, creamos esa variable en tiempo de ejecución, en el momento, de forma dinámica pues.

Una estructura de datos dinámica, muy poderosa, es la de los áerboles binarios. En una estructura de esta naturaleza tenemos un nodo y dos ramas. En el nodo tenemos la información y en las ramas tenemos apuntadores a otros nodos o bien a NIL, el vacío (es una manera en cómputo de no apuntar hacia la nada).

La técnica para ir creando un árbol binario es así: Consideremos que tenemos una lista de números desordenada: 60, 41, 74, 16, 53, 65, 25, 46, 55, 63, 70, etcétera. Tomemos el valor y pongámoslo en el nodo raíz. Ahora tomemos el siguiente valor, en este caso el 41. Si el valor es menor al que está en el nodo raíz, entonces lo colocamos en la rama izquierda, si es mayor, lo colocamos en la rama derecha., Así, ponemos el 41 en la rama izquierda. Acto seguido tenemos el 74. ¿Dónde lo pondremos? En la rama derecha del nodo raíz. Muy bien hasta aquí, pero de pronto tenemos un número más, el 16. ¿Dónde habremos de ponerlo? Tomamos el nodo raíz y vemos que es 60, así que debe ir en la rama izquierda, pero ésta ya tiene el nodo 41. De nuevo entonces vemos que el 16 es menor que el 41 y lo colocamos en la rama izquierda de éste. Con este procedimiento podemos llegar a llenar el árbol binario (porque solamente tiene dos ramas en cada nodo).



Nótese que un árbol de esta naturaleza además nos da una manera intrínseca de ordenar información. Si queremos desplegar los números que están en este árbol de manera que queden ordenados de menor a mayor, lo que hacemos es muy simple: Partimos del nodo raíz y nos movemos hasta la última rama izquierda posible. Esto nos dará, de acuerdo a la imagen que hemos puesto, en el número 16. Entonces vemos si este nodo tiene rama derecha. Sí, la tiene, y es el 25. Entonces ponemos como primer nímero el 16 y después el 25. Nos hacemos un nodo atrás y hallamos el 41. Lo ponemos. vemos si tiene rama derecha. Sí, la tiene, es el 53, pero éste tiene una rama izquierda, que es el 46 y este nodo a su vez tiene la rama izquierda cone l valor 42. Entonces ponemos el 42, 46, 53 y ahora revisamos la rama derecha y hallamos que hay un 55. Por lo tanto la lista va quedando así: 16, 25, 41, 42, 46, 53, 55... Y ahora ya no hay más ramas izquierdas que revisar. Pasamos a la rama derecha del nodo raíz y hallamos que hay un 74. Pero éste tiene un nodo izquierdo, el 65, que a su vez tiene otro, el 63, que a su vez tiene otro más, el 62, por lo que pondremos, 62, 63 y ahora vemos si hay nodo derecho. Y sí, lo hay, el 64. Ponemos ahora el 65 y como tiene rama derecha, ponemos el 70 y finalmente el 74.

Si queremos ordenar el árbol de los números mayores a los menores, lo que tenemos que hacer es recorrer el árbol al revés, primero empezar por la rama derecha. Esto es increíble. La misma estructura nos permite ya dejar ordenados literalmente los datos sin necesidad de otras estructuras.

Pues bien, una vez que tenemos esto aclarado, podemos crear un árbol binario con las palabras del Quijote. Si es una nueva palabra, creamos el primer nodo. Si es una palabra que es menor que la palabra que está en el nodo raíz, la ponemos en un nuevo nodo, que cuelga de la rama de la izquierda, en caso contrario, de la rama derecha.

Pero ¿cómo puedo crear una estuctura de un árbol binario? La manera más simple es crear una estructura dinámica, que crece en la medida que lo necesitamos. Por ejemplo, en Delphi, (Pascal) primero definiremos la estructura arbórea:


 nodoptr = ^nodo;  //el apuntador del nodo apunta a un nodo
       nodo = record  //esta es la definición del nodo
                algúndato: string; //palabra a guardar
                izquierda, derecha: nodoptr;
              end;


 Esta definición siempre parece costar trabajo leerla, y la razón es que es la única vez que Pascal permite usar algo que aún no hemos definido. Así, nodoptr = ^nodo; pero nodo no ha sido aún definido. De hecho, se define inmediatamente después.

Una vez teniendo la estructura dinámica, Delphi (Pascal), nos permite crear una nueva instancia de la misma si la necesitamos.

Por ejemplo, definamos

var
       arbol     : nodoptr;

Esto es precisamente el árbol en donde iremos colocando las palabras que vayamos leyendo del Quijote. Necesitamos para ello, un procedimiento para insertar nuevos nodos y poner los valores en los mismos. Esto lo podemos hacer así:

procedure insertaarbol(astr: string; var tree: nodoptr);
     { este procedimiento crea el árbol binario en memoria, 

        insertando un nodo en la posición correcta }

    begin
      if tree = nil then  //si el árbol esta vacío...
        begin
          new(tree);
          tree^.algundato := astr;
          tree^.left := nil;
          tree^.right := nil;
        end
      else
        begin
          if astr > tree^.algundato then
            insertaarbol(astr, tree^.right);


          if astr < tree^.algundato then
            insertaarbol(astr, tree^.left);
        end;
    end;


Con esto ya tenemos con qué trabajar. Es la rutina imprescindible para ir creando loas nodos (con sus respectivas ramas izquierda y derecha). Ahora hagamos la tarea: leamos el archivo del quijote, que está separado por líneas. Cada línea puede contener un número finito de palabras. He aquí el código (que se echa a andar cuando damos click al botón):

 procedure TForm1.Button1Click(Sender: TObject);
  var
    Linea   : ansistring;
    Palabra : ansistring;
    j       : integer;

   begin
   arbol := nil;
  
    assignfile(afile, Path+'palabras.txt'); 

//donde vamos a guardar las palabras halladas
    rewrite(afile);
    assignfile(infile, Path+'quijote-sin.txt'); 

//que archivo vamos a leer
    reset(infile);
    j := 0;

    repeat
      Readln(infile,Linea); //leo línea del texto
      for i := 1 to WordCnt(Linea) do
      begin
        Palabra := ExtractWords(i,1,Linea);
        Palabra := Lower(Palabra);
        inc(j);
        insertararbol(Palabra, arbol);
      end;
    until eof(infile); //hasta que leamos todo el texto

    writeouttree(tree);  //escribimos a disco el árbol
      //writeln;
      closefile(afile);
      closefile(infile);
      deletetree(tree); //borramos la estructufra binaria
      ShowMessage('Hay' + inttostr(j)+ ' palabras diferentes en el Quijote');
end;



Esto nos indica que el Quijote tiene 384,123 palabras en total (¿diferentes? unas 30 mil). El programa crea un archivo con todas las palabras (una por línea) y las despliega en orden alfabético, de menor a mayor, de la A a la Z, pues.

La rutina que crea este archivo es la siguiente:

procedure writeouttree(tree: nodoptr);
    {Copia a disco el árbol binario ya ordenado }
    begin
      if tree <> nil then
        begin
          writeouttree(tree^.left);
          writeln(afile, tree^.algundato) //escribe en archivo

          writeouttree(tree^.right);
        end;
    end;


Nótese que esta es una rutina recursiva (se llama a sí misma), que permite imprimir todas las palabras diferentes del Quijote en un archivo.

¿Cuánto creen que tarda en esta labor? ¡Alrededor de un segundo!

El reto propuesto es más interesante. No basta con saber cuáles son las palabras diferentes en total que tiene el Quijote, sino también su frencuencia. Aquí necesitamos entonces hacer dos cosas. La primera es que el nodo contenga no sólo la palabra del texto, sino las veces que la vamos encontrando, algo así como una variable que vaya incrementándose cada vez que encontremos dicha palabra. Por ello, requerimos de un procedimiento más: uno que busque un nodo y pueda modificar los valores del mismo.

No lo voy a hacer aquí. Si el amable lector me ha seguido hasta este punto, seguro puede hacer fácilmente esta rutina ¿verdad?

Friday, July 25, 2014

El inevitable pirateo


Hoy en día pareciese que el problema del pirateo de música es tan común que ya nadie dice nada. Si nos subimos al Metro, por ejemplo, nos hará encontrar casi por definición a algún “vagonero” que vende todos los “exitos de José José” (o Luis Miguel), por la irrisoria cantidad de diez pesos. Si uno decide comprar el disco en cuestión, el vendedor incluso lo garantizará. Y yo entiendo que la industria del disco debe estar haciendo berrinches incontables por esto, pero evidentemente no hay nada que hacer. Controlar que la gente no se copie la música parece ser tan complicado como evitar que se copien películas en DVD o incluso Blu-ray.

Pero aparte de esto, otro componente de la piratería es el que se refiere a los libros. Con la llegada de los formatos electrónicos, ePub y PDF, por ejemplo, muchas obras ya han sido pasadas a este tipo de archivos electrónicos. Ahora mandar un libro por correo electrónico o usando los servicios de mensajería que ofrecen sistemas como HighTail, por ejemplo, resulta algo fácil de hacer.

El inicio del pirateo de libros se basa en la capacidad de las cámaras digitales para fotografiar página por página, o bien, a los “scanners”, que son como fotocopiadoras personales. Pero para ello había que hacer dos cosas: una era tener una buena cámara digital o un dispositivo que escaneara los libros hoja por hoja. Esta última labor resultaba bastante fastidiosa, pero si se quería escanear un libro completo, se podía hacer. De hecho, con esta tecnología “casera”, surgieron programas que permitían poner todas las fotos automáticamente en un archivo PDF y listo, teníamos un nuevo libro digitalizado.

Es fácil y económico hacerse de un dispositivo para escanear libros. La mejor opción es sin duda el usar una buena cámara digital. Sin embargo, tenemos el caso de Amazon, que con su Kindle, vende versiones electrónicas de muchos libros y estas parecen estar a buen resguardo de los piratas, porque aparentemente, no se pueden copiar a otros dispositivos. Corrijo: bueno, sí se pueden copiar a otros dispositivos, pero sólo funcionarán con el Kindle (o la versión de software para PC), del que los haya comprado. Si se dañan o si el disco duro que los contiene se echa a perder, Amazon los tiene en su nube y de nuevo podría uno descargarlos pero de nuevo, no se pueden compartir estos libros electrónicos con otros dispositivos.

Hay torrents en donde se supone, hay muchos libros a los cuales se les ha quitado los trucos que Amazon ha puesto para que solamente el dueño legal de un libro pueda leerlos. No sé si existan todos esos libros o sea simplemente un anzuelo para caer en algún desagradable virus o en el infame “adware”. Ahí cada quien tomará sus riesgos y sus decisiones. Sin embargo, es evidente que aparte de los libros, las películas, el software y los programas de televisión, ahora los libros se incorporan a la piratería.

¿Qué se puede hacer? Probablemente nada realmente. La piratería siempre existirá y quien no haya pirateado un contenido de otro, que lance el primer CD. Tal vez el único remedio sea cambiar el modelo de negocios. Apple, cuando sacó su tienda de músicas vendió el primer día un millón de dólares (dicen), a un dólar por canción. Este modelo hace que ya la gente no compre un disco por 15 dólares donde al consumidor lo único que le interesa es una o dos canciones de ese disco en particular. Pero es claro que la gente estaría dispuesta a comprar música si se le da una buena opción en costo.  Con este mismo criterio, con los libros podría hacerse algo parecido. Hoy en día en Amazon un libro en papel puede costar -digamos- 15 dólares, pero el mismo libro en formato electrónico cuesta 14.50 o mínimo 13.50 dólares. Esa diferencia entre formatos no es suficiente para pensar en comprarlo en el formato electrónico. Si un libro en papel cuesta 15 dólares, la versión electrónica quizás podría  costar 4 o 5 dólares. Ya aquí las diferencias parecen significativas y quizás sea la solución al problema de la piratería. A la gente, si se le da un precio razonable, comprará los productos.

Amazon se tomó el camino complicado, el de los derechos digitales, el de las codificaciones de cada libro para personalizarlo con el autor. Es una brecha llena de dificultades técnicas, amén de que incluso los lectores que compren libros así pueden hallar problemas. Puedo entender que no será fácil convencer a las editoriales de cambiar el modelo de negocios, pero como con la música, o cambian el modelo de ventas o serán pirateados sin misericordia. y se acabará el negocio.

Wednesday, July 23, 2014

Murió Joaquín Araiza


El Maestro Nacional y parte de una familia de grandes y entusiastas ajedrecistas, murió el 14 de julio. Tenía -me dicen- 75 años y aparentemente en los últimos meses ya padecía de algunos problemas de salud xe cuidado. Su padre, el Coronel José Joaquín Araiza fue, en su momento, uno de los mejores jugadores mexicanos. Participó en torneos como el de San Remo, 1930, en donde quedó en décimo primer lugar. Esta competencia la ganó Alexander Alekhine, ni más ni menos.

Tengo buenos recuerdos de José Joaquín Araiza y creo que solamente jugamos una partida en todos los años que competimos. He aquí el desarrollo de la misma.

López, Manuel - Araiza, José Joaquín
Campeonato del Club Pomona, 1980
(3 de octubre de 1980)

1. e4 c5 2. Nf3 Nc6 3. d4 cxd4 4. Nxd4 Nf6 5. Nc3 e5 entrando en la polémica variante Svesnikov, la cual genera juegos de gran desequilibrio. 6. Ndb5 d6 7. Bg5 a6 8. Bxf6 (es más flexible 8. Na3) 8... gxf6 9. Na3 f5 (9... b5 es más popular, pero claramente con la jugada de Araiza, se busca iniciar el conflicto central, amén de deshacerse de su peón doblado.) 10. Bd3 fxe4 (no es la mejor elección. De nuevo parece más elástica primero 10... b5) 11. Bxe4 d5?!

  
Juegan las blancas

Extraño sacrificio para abrir líneas, pero no queda claro por qué entregar un peón central. La teoría no consigna esta jugada y probablemente la razón es que sea mala. En el mejor de los casos el sacrificio es dudoso. 12. Qxd5 (Parece preferible 12. Bxd5 o incluso 12. Nxd5) 12... Be6 increíble, Komodo 6 indica igualdad completa (0.00) 13. Qxd8+ Rxd8 14. Rd1 Bxa3 con esta jugada parece ser que la posición llevará a unas tablas poco interesantes. Esto es lo que después me dijo Araiza que tenía en mente cuando jugó 11. ... d5. 15. Bxc6+ bxc6 16. Rxd8+ Kxd8 17. bxa3 Rg8 18. g3 Rg4 19. Kd2 Rc4 20. Re1 Rc5 21. Re4 Bf5 En esta posición ofrecí el empate, aunque ya Komodo 6 da 0.75 de ventaja al blanco. Dicho de otra manera, debí continuar jugando. 0.5 - 0.5

Descanse en paz el Maestro José Joaquín Araiza

Tuesday, July 22, 2014

¿Cuánto sabemos de la Naturaleza?


La física que conocemos parece admirablemente poderosa. Hemos llegado a entender muchísimos fenómenos. Eisntein nos demostró que el espacio-tiempo se curva y nos hizo ver resultados que al principio para todos fueron prácticamente paradojas. El modelo de la mecánica cuántica, por ejemplo, que creo sigue la interpretación de Copenhagen, parece ser bastante adecuado y es capaz de predecir un sinfín de eventos. Quizás es la teoría más elaborada del ser humano.

Y si hablo de esto es que a la luz del artículo sobre la cuantización del tiempo, me surge una nueva reflexión que ahora comparto. Si es cierto que el tiempo de Planck, el cual es 5.39106 x10-44 segundos, y esto es, de acuerdo a la Wikipedia: "representa el tiempo que tarda un fotón viajando a la velocidad de la luz en atravesar una distancia igual a la longitud de Planck". Podemos pues pensar que el tiempo está cuantizado y se mueve en intervalos de 5.39 x 10-44 segundos. Más allá de eso no tiene sentido el tiempo y tampoco hablar de fenómenos físicos.

Pero lo que me interesa es la persistencia de las leyes de la física. Métanse a la regadera y abran la llave... ¿Cuánto tarda el agua en darse cuenta que está en presencia de un campo gravitacional (que hace caer el agua hacia abajo)? Porque debe haber una interacción entre el campo gravitacional y el agua, ¿no? Vamos, que no estamos hablando de una interacción instantánea. Son dos componentes de un sistema que interactúan entre sí y por lo tanto, debe pasar cierto tiempo para que el campo gravitacional ejerza su acción sobre el agua.

Desde luego que para los tiempos de los seres humanos, el agua se da cuenta "instantáneamente" del campo gravitacional terrestre y nos parece natural que caiga el agua, pero ¿qué hay de esa interacción? ¿cómo surge? ¿cómo se da cuenta uno del otro? ¿Ocurre en el tiempo mínimo de Planck o bien, pasan una cantidad n de unidades de tiempo de Planck, cronones, para que el campo tome la acción correspondiente. ¿Cuántos cronones se requieren para que la interacción se dé?

Eso me parece que ni siquiera lo contempla la física que conocemos. Por ejemplo, entendemos los mecanismos y hemos los seres humanos creados leyes que modelan este universo en el que nos ha tocado vivir, que tiene unas reglas inamovibles aparentemente y además, que persisten en su actuar pase lo que pase.

La pregunta, que ya se han hecho muchos otros antes que yo es: ¿Cómo sería el Universo si las leyes fuesen otras? Por ejemplo, sabemos que la Ley de la Gravitación Universal, en el denominador, r2, ese es un dos. No es 1.99999 o 2.00000001, por decir algo, es un 2 seco, certero. ¿Por qué? Y voy más allá, ¿estamos por el camino correcto para hacer un modelo de este universo en el que vivimos? porque... ¿cómo puede ser que la interacción de campos con otros componentes requiera de tanta herramienta matemática para modelarlo? ¿estamos haciendo algo mal? ¿o quizás nuestras matemáticas son muy rudimentarias para explicar las cosas?

Por el momento al menos, creo que la fisica sólo describe el Universo, pero en realidad, estamos lejos de poder explicar por qué es así.

____
(*) La fantástica foto que ilustra este artículo es de 1931. Aparecen: Nernst, Einstein, Planck, Millikan y Laue.

Monday, July 21, 2014

La moda de los vloggers


Hoy en México hay dos temas que parecen acaparar la atención de los Internautas: las redes sociales y los vloggers. De lo primero ya se ha dicho mucho, pero sobre el segundo tópico, los vloggers, parece que se han puesto de moda entre los usuarios de Internet, menores de 30 años, logrando millones de visitas por semana. Esto significa -finalmente- que estos personajes que han nacido gracias a la plataforma que es YouTube, pueden incluso de vivir de hacer videos (pues hay patrocinadores, anunciantes, etcétera), en donde narran sus experiencias, hacen bromas, insultan, o demuestran que casi cualquiera puede volverse una "estrella" en Internet.

La idea de los vloggeros se parece en cierta medida a lo que Adal Ramones hacía en su programa de televisión, en donde tenía una sección llamada "el monólogo", en donde nos recetaba toda clase de supuesta sabiduría contemporánea, reflexionando, supuestamente de forma graciosa, lo que ocurría en la vida cotidiana. Algo así como lo que hacía Seinfeld inteligentemente en su programa de televisión, nada más que en región 4.

La cosa es que empezaron a salir una serie de jóvenes, mujeres y hombres, los cuales -aprovechando que no hay censura- grabándose en video y platicando de cuanto tema supérfluo se puede hallar en la red. Tenemos por ejemplo al Werevertumorro, Gabriel Montiel, el cual tiene -asómbrense- más de 5 y medio millones de suscritos a su canal de youtube y unas 909 millones de vistas de sus videos en total. Dicen que es el vloguero más famoso y popular de este país.

Están también algunas mujeres: CaeLIKE, que es una chavita que habla de los temas que les interesan a personas como de su edad: la escuela, las novias, la infidelidad del novio en turno, etcétera. Ella tiene más de 2.5 millones de suscriptores y unas 201 millones de vistas de sus video. Otra más es una jovencita, Yuya, que habla de maquillaje, de cómo vestirse para cada ocasión, etcétera. Han aparecido mujeres jóvenes menos tontas y más atractivas, haciendo algo parecido a las mencionadas, como Yosstop (una guapa mujer llamada Yosseline Hoffman) y Daniela Bos, las cuales hacen vlogs a veces muy cortos porque la verdad, hay tantos que quieren vivir de esto que empieza a saturarse el mercado y cada vez es más difícil ser original. Y aunque su belleza seguramente será argumento para tener muchos fans masculinos, me parece claro que tampoco hacen nada maravilloso u original.

Sin duda que la facilidad para grabarse, incluso hacer post-producción con herramientas de edición no lineal de video en casa, han sido parte del posible éxito de todos estos vlogueros. Un tema sin efectos especiales, sin manipulación de la imagen que presentan (poniendo letreros, modificando la voz, etcétera), suele empezar a aburrir a los que lo ven, por lo que si se quiere triunfar en este rubro no basta con salir a cuadro diciendo un sinfín de tonterías. Es importante también la post-producción.

Hay más vlogueros pero la verdad, ver uno solo de sus videos a veces es suficiente para no ver a esos personajes más. Entre ellos están Luisito Rey, Héctor Leal (un chavo de Reynosa, Tamaulipas), Benshortstuff, el cual es prescindible 100%, el Escorpión Dorado, hermano de Gabriel Montiel, que se pone una máscara de luchador y propina todo género de insultos vulgares, pretendiendo ser gracioso. Está otro tipo llamado Yayo Gutiérrez o Misael vlog (hermano de Caeli), Hola, soy Germán,  o Jacobo Wong, que su supuesto exito es contar chistes, en los cuales votan sus fans... Háganme el favor.

Y por supuesto no falta alguien, mayor de 30 años, -el Maicanal- que decide incursionar en esto. Un padre de familia, representante de la clase trabajadora, albañil, que cada semana sale vestido con la camiseta del Cruz Azul y muy a su estilo, comenta la problemática actual. Hay albures, mentadas de madre, etcétera. De nuevo totalmente prescindible.

Y seguro hay más, pero esto es sólo una prueba de que Internet puede ser un gran invento, pero es responsabilidad de cada quien filtrar los contenidos para que la basura no nos llegue, al menos no tan cerca. Hoy se habla de la "caja boba", refiriéndose a la televisión, que mucha gente dice no ver, pero lo más probable es que ahora su tiempo lo pierda con toda este catálogo de chavos dizque "cool" y graciosos,  en donde su gracia está en hablar con groserías y dizque hacernos reír de sus monólogos.

Saturday, July 19, 2014

De la ética médica


Yo siempre he pensado que el dinero gastado en la salud es dinero bien gastado, pero claramente en este país de tantas diferencias sociales, hay una línea divisoria entre la medicina de calidad y de no calidad. Es conocido que el gobierno tiene una infraestructura que deja mucho que desear en lo que se refiere al sistema de salud de México y que muchas veces los ciudadanos tenemos que irnos al sistema de medicina privado, con los subsecuentes costos, que muchas veces no son pocos.

Porque miren, un día tengo inflamado el colon y voy con un especialista en Médica Sur. Sin duda un estupendo médico al cual le tengo confianza sobre los diagnósticos que me da (que lo ha hecho en un número de ocasiones), y en lo que me receta. Sin embargo, en la práctica privada ocurren cosas interesantes de mencionar. Por ejemplo, cualquiera de nosotros podemos ir a un hospital privado, hacer una cita en la torre de consultorios de las diversas especialidades que ahí se manejan y un doctor con las calificaciones adecuadas nos atenderá. En muchas ocasiones ocurre que después de explicarle el problema por el cual acudimos con él, el médico nos pide que nos hagamos, por ejemplo, un estudio de laboratorio. Puede ser análisis de sangre, de orina, una tomografía quizás, una colonoscopía o un ultrasonido de vesícula, entre tantos estudios que hay. Y así termina la primera consulta. Sale uno y paga un promedio de 1200 pesos, aunque en ocasiones son 1500 por ser primera vez que nos atiende este galeno). El doctor espera entonces que cuando tengamos los resultados de los estudios, vayamos a una nueva consulta para entonces diagnosticar y recetarnos.

Primera pregunta: ¿Por qué me cobra esta primera consulta? O bien, ¿me cobrará la consulta que haré con él cuando tenga mis estudios? Lo más probable sino es que lo más seguro, es que la segunda consulta se cobre igual que la primera. Y yo me pregunto, ¿por qué? ¿Porque me dijo qué estudios tenía que hacerme? Vamos, que me pide unos estudios específicos para poder guiar su propio diagnóstico. ¿No debería cobrar simplemente la consulta en donde me diagnostica y me receta? ¿Por qué me puede cobrar la segunda vez, si en la primera ya me cobró y no me dijo nada, ni me diagnosticó, ni me recetó nada?

Y si a esto le añadimos que muchos doctores nos piden ir a una tercera consulta "para ver cómo vamos", es claro que la tendremos que pagar también. ¿Y por qué? Si lo que va a hacer el doctor es ver si el tratamiento que nos dio es funcional o no. Si no lo es, nos dará otro probablemente y nos cobrará (aunque nos haya dado un mal tratamiento). Si es el indicado nos dirá con satisfacción: "va muy bien" y nos cobrará esta tercera consulta.

Me pregunto entonces: ¿Se vale?

Porque miren, haré una comparación un poco burda: imaginen que alguien me contrata para hacerle un programa de computadora que haga algo específico. Digamos que es una base de datos en donde hay que hacer consultas, reportes, mandar por correo fragmentos de dicha base de información, etcétera. Puedo quizás yo quedar en un precio y trabajar en el sistema sobre al cual ya quedamos en las características que debe tener -muchas veces solamente de palabra. Al final, se lo entrego, el cliente lo prueba y si hacen falta cambios o añadir nuevas cosas, normalmente la mayoría de los programadores haremos un mohín y corregiremos el código para satisfacer las necesidades del cliente. No nos pagará más por ello. Digamos que es parte del trabajo pactado. ¿No debería un médico ver a un paciente que tiene X mal como un trabajo que debe hacer desde un inicio y hasta llegar a un final por un precio determinado? Porque eso de cobrar cada consulta me parece que raya un poco en el abuso.

Y hay desde luego más al respecto de la práctica privada de la medicina. Un galeno puso en su consultorio el siguiente letrero: "A partir de enero del 2014 el costo de la consulta es de 1200 pesos". Entiendo y valoro que los médicos saben muchas cosas y que hay algunos que son extraordinarios en su trabajo, pero ¿la cuota de 1000 pesos que cobraban antes les parece ya poco? Miren, sé de médicos en la práctica privada de su ciencia/arte que trabajan de lunes a viernes y digamos, sin exagerar, que ven a cinco pacientes por día. Eso equivale a 6 mil pesos en un día laboral. Multipliquen por 20 días (cuatro semanas), llegarán a 120,000 pesos por mes. ¿A poco no es suficiente dinero? Y sí, entiendo que hay que pagar consultorio, secretaria/recepcionista, luz, mantenimiento, etcétera. Y que conste que no estoy considerando que estos médicos operan un par de veces a la semana y que sacan entre 25 mil y 50 mil pesos por operación.  Supongamos que operan una vez por semana a unos 35 mil pesos por operación., Solamente de eso se obtienen 140,000 pesos en un mes, más lo de las consultas, nos lleva a nos 260,000 pesos, más de un cuarto de millón de pesos. ¿Es poco?

No conozco a muchos médicos (de hecho conozco sólo a uno), que en su práctica privada se le paga la primera cita y el galeno da seguimiento sobre el tratamiento que se nos da como pacientes. Este mismo médico da una tarde, un día a la semana, consultas gratuitas para quien no puede pagar. Al menos hay un soplo de actitud en pro de la sociedad es estos actos.

Ya más de uno me dirá que en lugar de quejarme por pagar, pues que me vaya a la medicina gubernamental, la pública. Ya sabemos que ésta adolece de muchísimas dificultades para poder dar la calidad que se da en la medicina privada y que se paga. Bastaría decirles que cuando mi padre enfermó del corazón, decidieron (en un hospital privado en donde mi papá estaba asegurado desde hacía muchos años), ponerle un marcapasos muy sofisticado, programable, que valía unos 70 mil pesos. Sí, sólo el marcapasos valía esa cantidad. Con esos costos un enfermo internado en un hospital simplemente desangra el capital de cualquier familia de clase media, o como dice un buen amigo, de "clase pobre alta". Una enfermedad larga deja en quiebra a muchas familias.

Mi solución -que está lejos de ser la ideal- es la de pagarme un seguro de gastos médicos mayores y ni modo. Esto de pagar este tipo de seguros es costoso en general, pero enfermarse de algo más grave puede ser demasiado oneroso para cualquier bolsillo y al menos es una especie de tranquilidad para que las familias no tengan que ver con qué pagar la enfermedad importante de alguno de sus miembros. Pero en el fondo, creo que los médicos, sobre todo aquellos que trabajan en el sector privado, deberían ver más por la sociedad en donde se han desarrollado y no solamente enfocarse a hacerse de miles y miles de pesos por día. En mi opinión, la ética médica se ha desvirtuado en este sentido.

Programación lúdica: ¿Cuántas palabras diferentes tiene “El Quijote”?



Una obra monumental de la literatura española es el Quijote, escrito por Miguel de Cervantes hace ya muchos años. Se tienen versiones impresas en rústica, en pasta dura, en ediciones de lujo, etcétera. Desde luego que en formato electrónico hace rato que está y el Quijote puede leerse en formatos PDF, ePub y en textos normal, sin formato especial, pues.

Después del reto pasado, el de contar palabras, en donde se usaron dos libros unidos (Los Miserables y el Quijote), para hacer un archivo relativamente grande (unos 5 MBytes), se me ocurre ahora plantear el siguiente problema: Tomemos el archivo del Quijote (el cual puede descargarse de este sitio), y la tarea a resolver, es la de hacer una lista de todas las palabras diferentes que tiene la obra de Cervantes y la frecuencia de las mismas (ordenado alfabéticamente). ¿Cuál será la palabra más veces escrita por el manco de Lepanto? ¿Cuál será la palabra que solamente se escribió una sola vez? Estas dudas no me dejan dormir.

Aquí tomaremos en cuenta dos criterios: el primero será el de la velocidad, es decir, qué programa llega a hacer esta lista (que se debe guardar en un archivo de texto) de manera más rápida y el segundo, que dé la frecuencia de cada palabra usada. El resultado debe entregarse mostrando por línea la palabra hallada y al lado, la frecuencia de la misma, es decir, las veces que ocurrió en el texto. Los criterios se toman en cuenta de forma indistinta. Por ejemplo, alguien puede entregar un programa que halla todas las palabras y sus frecuencias, y se tarda 2 minutos (por decir algo), mientras que otro entrega un programa que es muy veloz, pero que no entrega todas las palabras o que el conteo está mal. Evidentemente el ganador será aquí el que entregue el resultado más cercano al que debe ser.

Las restricciones usuales en el reto son: No se vale usar una biblioteca para hacer búsquedas, ordenar, o cualquier otra labor que sea parte del reto, es decir, solamente puede usarse el lenguaje tal cual viene definido con las bibliotecas de entrada/salida, por ejemplo.

Cabe señalar que el reto no es sencillo, porque antes de empezar hay que discurrir qué estructura de datos vamos a usar. De acuerdo a Word (e incluyendo los anuncios legales del Proyecto Gutenberg), el Quijote contiene unas 384,262 palabras. Pensemos, solamente para ilustrarlo, que todas ellas fuesen diferentes (que no es cierto), y que cada palabra ocupa unos 10 caracteres en promedio (suena razonable asumir eso), tendríamos que tener una estructura que conteniera  unos 4 MBytes, cosa que no es muy complicada. A eso hay que añadirle el conteo de las palabras, lo cual debe ponerse de alguna manera. Por favor, no se les ocurra hacer un arreglo de 4 MBytes para contener palabras y números. Eso, aunque s epueda hacer y el compilador no proteste, no es una técnica aceptable de programación. En mi opinión, hay que hacer un árbol de registros que contengan, las palabras y la frecuencia hallada. La ventaja de esta estructura es que el ordenamiento se puede hacer simplemente recorriendo el árbol de una manera en particular. No se requiere pues ordenarlo directamente. Pero estos son sólo tips, no tienen que seguirse si no se desea.

Quienes programan en Python, Ruby on Rails o cualquier lenguaje interpretado, la parte de procesar más rápido que los demás la tienen perdida. Esto no quiere decir que ya no puedan ganar el reto, pero claramente quedan en desventaja ante los programas compilados a código nativo x86.

¿El premio? Una taza con el logotipo de la Morsa a la mejor solución. Además hay una libretita y una gorra, cortesía de los buenos amigos de Qualcomm que se añade al premio. Pudiese ser que se incorporaran más premios pequeños (estamos trabajando en eso), como pudiesen ser camisetas, etcétera. 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 al menos 8 GBytes y se les enviará por correo certificado. Y sí, sé que no son los grandes premios pero esto es lo que hay por el momento. Evidentemente quien gane será anunciado aquí y hasta tendrá sus quince minutos de fama.

Los resultados finales son inapelables. 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. El ganador cede su código fuente a la comunidad. Es decir, se promueve el código abierto. Programas copiados de la web o que tengan ese sabor sospechoso de plagio podrán ser eliminados sin mayores consideraciones. El chiste de estos retos es que los programadores se animen a resolverlos, no que busquen la manera de hacer trampa. ¡Así que a afilar sus habilidades de programación y pasar un buen rato intentando resolver el problema propuesto!

Ganador del reto de contar palabras


Con una buena participación por parte de los programadores/lectores binarios del sitio unocero, damos por concluido el reto de la programación lúdica que trataba de contar letras, espacios y palabras de un texto. Cabe decir que enfrenté un problema. Los programas eran en su mayoría muy rápidos (un par de segundos en el caso de los ejecutables), mientras que los que usaron Python, por ser un intérprete, fueron extremadamente lentos. Por ende, como el rato originalmente era de velocidad, los intérpretes (a excepción de Java, que casi tiene un desempeño como el de un ejecutable nativo), palidecen frente a código compilado de máquina x86.

Debido a que las diferencias en tiempos entre algunos programas eran demasiado cortos, decidí tomar otro criterio: Qué tanto se acercaban a las cifras originales dada por Microsoft Word. De hecho, comparé el resultado contra el que dio OpenOffice 4.1.0 y fueron exactamente los mismos. Vamos ambos programas toman en cuenta las mismas consideraciones para contar palabras. Así, debido a que los programas corrían muy rápido y las diferencias eran a veces de centésimas de segundos, no era posible discriminar realmente quién había sido el más rápido. Además, se buscaba que el resultado fuese “correcto”.


Los valores que entrega Ms-Word y OpenOffice

Esto en algún sentido fue una sorpresa. La mayoría de los programas entregan resultados diferentes en sus conteos. Las razones son los criterios que cada uno de ellos estableció para definir lo que era una palabra. Por ejemplo, para Word “–Y” son dos palabras. Por eso hay divergencias.

Por otra parte, tuve que descalificar, valga la expresión, a José Gabriel Acosta, que usó una biblioteca de funciones para ayudarse en esta tarea. Le indiqué que eso no se valía, porque entonces todo se resume a que se haga la llamada adecuada sin haber programado realmente el reto. Les dije que podían reescribir su código y que me lo mandara. No recibí nada y tuve que descalificarlo.

El ganador fue Diego Iván García Leyva, (ver foto al lado), de 27 años, Culiacán, Sinaloa. Estudió ingeniería electrónica en el Tecnológico de Culiacán, actualmente desarrolla sistemas biométricos de Coppel. Maneja los proyectos de huella en línea y reconocimiento de rostro.


De acuerdo a la tabla que sigue (si quieren el archivo de Excel, pídanmelo), mostró que se acercó más a los demás en promedio -contra el estándar definido por Word y OpenOffice (que dan los mismos resultados). Sólo falló por 0.08. No me importó si se acercaban “por arriba o por abajo” del resultado correcto, sino el valor absoluto de la diferencia.


Desde luego que el código de todos los que concursaron pueden pedírmelo y les mandaré un enlace para que bajen el archivo comprimido. Escríbanme los interesados a morsa@la-morsa.com. El archivo de texto que se usó contiene unos 5 megabytes. Es la combinación del texto de los Miserables y del Quijote. Aún con 5 Megabytes, repito, algunos programas fueron muy rápidos.

Felicidades a Diego y ya le estaré mandando su premio.

Friday, July 18, 2014

¿Estará el tiempo cuantizado?



Hoy me desperté pensando en la mecánica cuántica, en la cual disto parsecs de ser un experto, pero sé que entiendo algunas cosillas. Por ejemplo, Max Planck, que nació el mismo día que yo, fue quien inventó (¿descubrió?) lo que se llama la constante de Planck y que él denominó cuanto de acción, pues este ocurre en una unidad de tiempo, que llamamos "segundo". El cuanto de acción es 6.62606896(33) ×10-34, Joules por segundo, la cual es una cantidad por demás minúscula, sin embargo, tiene consecuencias notables.

Antes de Planck, los físicos pensaban que el mundo era contínuo. Las señales de radio, por ejemplo, parecían contínuas. ¿Dónde estaban estos cuantos y de qué estamos hablando al mencionar la cuantización de la energía? Pues no es muy difícil. Ocurre que por ejemplo, si una partícula adquiere energía, no puede adquirir una cantidad X de la misma, sino que es un múltiplo del cuanto de acción. Vamos, es como si yo quisiera pasar de un sitio A a un sitio B sin necesidad de pasar por sitios intermedios entre A y B. A eso se refiere la cuantización y el mundo, desde que Planck salió con su cuanto de acción, ya no fue el mismo.

Max Planck

Otro ejemplo, imaginen que tengo dos números 1 y 3. Si los números estuviesen cuantizados, podría pasar del 1 al 2 y de ahí al 3 sin problemas, pero como esto no ocurre en las matemáticas, para pasar del 1 al 2, tengo que pasar por el 1.1, 1.2, 1.3, etcétera, pero más aún, tengo que pasar por el 1.01, 1.02, 1.03, etcétera, hasta llegar al 1.1. Pero podría ser peor, puedo ser más fino y pasar del 1.001 al 1.002, 1.003 etcétera. Si hubiese una cuantización numérica, por ejemplo considerando solamente los enteros, el paso de un valor al que sigue tendría que ser por "cuantos de valor numérico entero", lo que significaría que pasaría del 1 al 2 sin tener que considerar los valores entre ellos.

Si tomamos esto en cuenta, pensemos en el tiempo. ¿Cuál es la mínima cantidad de tiempo en la que podemos pensar? ¿Un segundo? Naah, porque podemos medir décimas de segundo, centésimas de segundo e incluso no es una locura pensar en medir milésimas de segundo. Vamos, que en las Olimpiadas, en algunos deportes (natación, 100 metros planos), se miden hasta centésimas de segundo con cotidianidad.


Los fisicos buscan cada vez medir con más precisión, y la siguiente tabla, nos muestra que -al menos en principio- podríamos pensar en el yoctosegundo, es decir, 10-24 segundo. O sea, 0.0000000000000000000000001 de segundo. ¿Se puede ir aún más allá? El valor del segundo es bastante cotidiano y humano, y el hombre es la medida de todas las cosas, pero cuando empezamos a dividir el segundo, ¿hasta dónde podemos llegar? No lo sé y no sé si se sepa. Yo creo que hoy en día no existe el cuanto temporal, al cual en uno de mis más brillantes ingenio le llamaría "tempus", digo, que es la palabra latina para el "tiempo".

Dicho de otra manera, supongamos que existe una cantidad mínima de tiempo, así como el cuanto de acción de Planck, esto querría decir que pasar de un momento a otro no sería un contínuo, sino un pasaje discreto de eventos temporales, del tempus 1 al tempus 2 sin pasar por el tempus 0.5, por ejemplo.

¿Qué implicaciones tendría? No lo sé, pero me queda claro que la parte del tiempo y su naturaleza es aún demasiado misteriosa para los seres humanos. Pienso que de saberse este cuanto temporal, podríamos saber, por ejemplo, el tiempo que tarda en darse cuenta un campo de la existencia de un objeto en el mismo. A todas luces, para la realidad y dimensiones humanas, esto parece ser instantáneo, pero quizás no lo es, bueno, si es que existe tempus como tal.

Por otra parte, sospecho que quien estudie estas cosas debe tomar la velocidad de la luz como un parámetro importante para dilucidar la cuestión. Por alguna razón (y es uno de los preceptos en la teoría de Einstein), la velocidad de la luz es constante y la máxima que hay en el Universo conocido. ¿Por qué es así? Misterio. ¿Cómo serían las cosas si no fuese cierto esto? Tampoco lo sé. Mi ignorancia es pues, enciclopédica.