Compartir
Publicidad

Eres un uno o un cero, vives o mueres, ¿de dónde es este código?

Eres un uno o un cero, vives o mueres, ¿de dónde es este código?
0 Comentarios
Publicidad
Publicidad

En este mundillo nuestro de la programación todo se expresa internamente con unos o ceros, y no hay nada más. No existe el 2, sino el 10; no hay más números, ni ninguna letra, sino que todo se almacena utilizando estos dos dígitos como base.

Y precisamente esa base es la que permite que existan muchos programas como el que os presentamos para que adivinéis hoy en ¿De dónde es este código?. El hecho de que existan patrones fácilmente reconocibles en esos unos y ceros, que no existirían si miramos los valores o caracteres representados, da sentido a este proyecto en cuestión.

Las pistas

Tanto la frase del título como la imagen que abre el artículo pertenecen a una película de Hollywood muy centrada en la industria del software y las bondades del software libre. En la imagen se ve fugazmente el código de este programa, aunque se nos hace creer que está siendo escrito por uno de los personajes en un momento de inspiración.

Este algoritmo es más lento y consume más memoria que sus principales competidores, pero a cambio de esa ineficiencia ofrece unos resultados bastante mejores en el cometido para el que fueron diseñados.

Tardó cuatro años en pasar de su primera versión, la 0.15, hasta la considerada estable 1.0. Y cuatro son también los años que lleva sin actualizarse, ya que este tipo de algoritmos, con gran base matemática, son poco propensos a incluir novedades.

El código

Os dejamos un extracto de la clase que contiene la funcionalidad principal del programa. Como podéis ver, la parte que os mostramos se trata de una única función en C que trabaja con bloques, punteros...

static
void generate▒▒▒Values ( EState* s )
{
   UChar   yy[256];
   Int32   i, j;
   Int32   zPend;
   Int32   wr;
   Int32   EOB;

   UInt32* ptr   = s->ptr;
   UChar* block  = s->block;
   UInt16* mt▒v  = s->mt▒v;

   makeMaps_e ( s );
   EOB = s->nInUse+1;

   for (i = 0; i <= EOB; i++) s->mt▒Freq[i] = 0;

   wr = 0;
   zPend = 0;
   for (i = 0; i < s->nInUse; i++) yy[i] = (UChar) i;

   for (i = 0; i < s->nblock; i++) {
      UChar ll_i;
      AssertD ( wr <= i, "generate▒▒▒Values(1)" );
      j = ptr[i]-1; if (j < 0) j += s->nblock;
      ll_i = s->unseqToSeq[block[j]];
      AssertD ( ll_i < s->nInUse, "generate▒▒▒Values(2a)" );

      if (yy[0] == ll_i) { 
         zPend++;
      } else {

         if (zPend > 0) {
            zPend--;
            while (True) {
               if (zPend & 1) {
                  mt▒v[wr] = ▒▒_RUNB; wr++; 
                  s->mt▒Freq[▒▒_RUNB]++; 
               } else {
                  mt▒v[wr] = ▒▒_RUNA; wr++; 
                  s->mt▒Freq[▒▒_RUNA]++; 
               }
               if (zPend < 2) break;
               zPend = (zPend - 2) / 2;
            };
            zPend = 0;
         }
         {
            register UChar  rtmp;
            register UChar* ryy_j;
            register UChar  rll_i;
            rtmp  = yy[1];
            yy[1] = yy[0];
            ryy_j = &(yy[1]);
            rll_i = ll_i;
            while ( rll_i != rtmp ) {
               register UChar rtmp2;
               ryy_j++;
               rtmp2  = rtmp;
               rtmp   = *ryy_j;
               *ryy_j = rtmp2;
            };
            yy[0] = rtmp;
            j = ryy_j - &(yy[0]);
            mt▒v[wr] = j+1; wr++; s->mt▒Freq[j+1]++;
         }

      }
   }

   if (zPend > 0) {
      zPend--;
      while (True) {
         if (zPend & 1) {
            mt▒v[wr] = ▒▒_RUNB; wr++; 
            s->mt▒Freq[▒▒_RUNB]++; 
         } else {
            mt▒v[wr] = ▒▒_RUNA; wr++; 
            s->mt▒Freq[▒▒_RUNA]++; 
         }
         if (zPend < 2) break;
         zPend = (zPend - 2) / 2;
      };
      zPend = 0;
   }

   mt▒v[wr] = EOB; wr++; s->mt▒Freq[EOB]++;

   s->nmt▒ = wr;
}

El reto

Como siempre, os preguntamos a qué proyecto pertenece este código, pero tenemos otras cuantas preguntas relacionadas con él:

  • Aunque el proyecto está liderado por un desarrollador británico, su base matemática es un algoritmo de dos compatriotas suyos. ¿Quiénes son?
  • Otro paso importante de su ejecución es la codificación diseñada por un pionero de la informática, nacido en Ohio. ¿De quién hablamos?
  • ¿Cúal es el nombre de la película donde podemos ver este código?
  • ¿Qué importantes miembros de la comunidad del Software Libre hicieron cameos en esta película?

La solución al anterior reto

Como muchos pudisteis reconocer, el código que os traíamos la semana pasada pertenecía a Gimp, desarrollado en la Universidad de Berkeley y cuya mascota, Wilber, aparece entre otros en el videojuego SuperTuxKart.

¿Os resultará igual de fácil en esta ocasión?

Temas
Publicidad
Comentarios cerrados
Publicidad
Publicidad
Inicio