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?
Sin comentarios Facebook Twitter Flipboard E-mail

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...

120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
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?

Comentarios cerrados
Inicio
×

Utilizamos cookies de terceros para generar estadísticas de audiencia y mostrar publicidad personalizada analizando tu navegación. Si sigues navegando estarás aceptando su uso. Más información