Mexicano Gana Concurso Internacional de Software

NFT. 20 de marzo del 2006


Toledo.c (18º IOCCC Best Game)
Listado del código fuente
#define    F getchar())
 #define H(z)*n++=z;
       #include        <setjmp.h>
    #define v main(0,0,0
           #define Z while(
                                                 #define _ if(
#define o(d)(S=63,u[l]=0,l[d]=6^e,q=1e4>v,0),l[d]=0,u[l]=e^6,S=b,q)
#define I(H,n) { _ r=l[x=H],!r|(r^e)<-1){ _ j=u[l],-7==r|6==r\
){ n; e=~e; return 1e5-443*f; } u[l]=0,t=j+1,i=j-1; _!i&89<\
x)i=j,t=6; _-1==t&30>x)t=j,i=-7; Z++i<t){ d =0; S&= 63; \
a=((j^e)!=1?6!=(j^e)?O[32+x/10]-O[u/10+32]-q:(S|=6!=j?8\
:1,2==u-x)*9+9*(x-u==2):(d=1==j?x-u:u-x)/8+!(!((x-u)%\
10)|r)*99+(j==1?90<x:29>x)*(9*O[28+i]-288))+O[r+28\
]*9-288+O[x%10+33]-f-O[33+u%10]; x[l]=i; S|=(21=\
=u|21==x)*2+(u==28|28==x)*4+(91==u|x==91)*16+32\
*(u==98|x==98)+(20==d)*64*x; a-=k>f?main(a,f+1\
,M,k):0; _ i==c&u==h&!f&N&a>-1e4&x==y)longjm\
p(z,1); S=b; _!N|f&&(a>M||!f&a==M&&1&rand()\
)){ _!f){ _ k){ c=i; h=u; y=x; } } else _ \
L-a<N){ n; e=~e; u[l]=j; x[l]=r; return\
 a; } M=a; } } x[l]=r; u[l]=j; n; } }
typedef int G; char J [ 78 ], O [ ]
=   "HRQAMS#-smaqrh[UTZYTU[|TBA("
"$#(ABT|ba`gg`ab8>GK[_`fFDZXEYR"         "L\t####"
"##B#A#@#G#F#E#D#K\t\3Zlv#tjm"         "\3J#tjm\3Pwb"
"ofnbwf\3Joofdbo\3)&`&`.&`&`"         "#+&g*\t"; G y,
c,h,e,S,*s,l[149]; jmp_buf z         ; G main(G L,G f,
G N,G k){ G u=99,p,q,r,j,i,x         ,t,a,b=S,d,M=-1e9
; char *n; if( *l){ e=~e; Z       u >21){ q= l[--u]^e;
_!-- q){ _!l[p=e?u-10:u+10]){   I(p,)_ e?u>80   & !l[p
-=10]:u<39&!l[p+=10])I(p,)} _ l[p=e?u-11:9+u]   )I(p,)
else _ u-1==S>>6){ l[u-1]=0; I(p,l[u-1]=-2^e);  } _ l[
p=e?u-9:11+u])I(p,)else _ S>>6==1+u){ l[1+u]=0; I(p,l
[1+u]=e^-2); } } _!--q){ n=O+41; Z++n<50+O)I(u+80-*n,
)} _ 0<q&4>q){  n=q==2?53+O:O+49; Z++n<O+(q!=1)*4+54
){ p=u; do I(p-=*n-80,)Z!p[l]); } } _ 4==q){ n=49+O
 ; Z++n<O+58)I(u-*n+80,)_ e&!(S&24)|!e&!(S&3)   &&
 !l[u-2]&!l[u-1]&!l[u-3]&&o(u)&&o(u-1)){ l[u-1]=4
  ^e; l[u-4]=0; I(u-2,l[u-1]=0; l[u-4]=e^4); } _
  e&!(S&40)|!e&!(S&5)  &&!l[u+1]&!l[2+u]&&o(u)&&
   o(1+u)){ l[u+1]=e^4; l[3+u]=0;   I(u+2,l[1+u
   ]=0; l[u+3]=4^e); } } } e=~e;   return M; }
    Z h<130){l[h]=-(21>h|98<h|2       >(h+1 )%
    10); O[h++]^=3; } n=O +14;       s=20+l; Z
     ++s<29+l){ 10[s]=1; 70[s]=~    ( * s = *
      n++ -+84); 60 [ s] =-2; } Z  n=J){ puts
       (58+O); u=19; Z++u<100){ H(32)_!( u%10
       ))H(32)H(O[7+l[u]])_(9+u)%10>7){ H(58
        -u/10)H(32)_ u&1)puts(n=J); } } puts
         (O+58); _-1e4 >v , 1)){ e=~e; puts
          (O+(v,0)> 1e4?e?90:82:96)); break
           ; } _ 1<L&e) { d=v,2+L); printf
            (O+114,h%10+64,58-h/10,y%10+64
             ,58 -y/10,d); } else{ putchar
              (62+e); h= (95 & F-44; c=l[h
                +=(56-F *10]; y=(95&F-44; y
                   +=(56-F*10; Z 10!=(u=(95
                    &F)){ c=5; Z--c>1&&u!=c
                      [O]); c=e^c-7; } } _!
                         setjmp(z)){ v+1,1);
                               puts(   106+
                                O); }   } Z
                                 10!=
                                  F; }
Ajedrez textual, gráfico 2-D y 3-D
Desde una planificación racional hasta una ejecución
lograda como el ajedrez Familia Toledo, hay un largo
trecho de tiempo y esfuerzo, llamado know-how.

Por primera vez un hispanoamericano gana el concurso internacional del IOCCC, en la categoría Best Game, y es uno de los programadores de la Familia Toledo, que coloca a México en la palestra mundial de las ciencias de la computación.

Uno de los programadores de la Familia Toledo, Óscar Toledo Gutiérrez, ganó la 18ª edición del concurso IOCCC (International Obfuscated C Code Contest), en la categoría Best Game, con un juego de ajedrez escrito en lenguaje C. Celebrado en el año 2005, las otras catorce categorías fueron ocupadas por participantes de E.U.A, Canadá, Reino Unido, Finlandia, Israel y Singapur. De esta forma Toledo puso en alto el nombre de México, y se convirtió en el primer hispanoamericano en ganar este concurso, donde compiten programadores de primer nivel de compañías prestigiadas, como: Pixar, HP, Cray, AT&T, el MIT y la Universidad de Oxford, así como los ingenieros ligados a la red de alta tecnología de Silicon Valley, Taiwan, Cambridge y Helsinki, entre otros.

El IOCCC (www.ioccc.org) con sede en San Francisco, California, fue fundado en 1984 por Landon Curt Noll y Larry Bassel, desde entonces organizan un concurso anual de programación, donde cada participante debe escribir un programa ingenioso en menos de 2048 caracteres, con lenguaje C compactado en forma de código ofuscado, lo más complejo posible y difícil de descifrar, Sólo profesionales con mucha experiencia en el lenguaje C son capaces de ganar este concurso creativo, que atrae a la crema y nata de los mejores programadores del mundo.

Las reglas del concurso establecen que cualquier programador puede participar, pero solo se da a conocer la lista de los ganadores. El premio es el reconocimiento a la habilidad de los ganadores por parte de la comunidad de programadores.

El programa en lenguaje C que se ilustra, es el núcleo inteligente de un ajedrez informático, cuyo tablero se visualiza en forma de texto, y de acuerdo a las habilidades de un programador, puede evolucionar para que ilustre un tablero gráfico de 2 o 3 dimensiones, o con figuras animadas, aunque el núcleo de este programa nunca cambiará; algo similar sucede actualmente con los juegos interactivos inmersos en imagenes 3-D, que no son más que una evolución del juego clásico de los robots en un campo minado, que data de la década de 1970.

Dentro del campo de la inteligencia sintética, también llamada inteligencia artificial, el juego del ajedrez es conocido como un sistema formal autocontenido, y no determinístico:

Un algoritmo es una fórmula paso a paso, para obtener un resultado especificado de antemano, en un número finito de pasos. Por supuesto que esta secuencia de pasos no se elige descuidadamente o al azar, debe plantearse correctamente para llegar al objetivo lo más directo posible.

En el ajedrez, el objetivo principal es eliminar las piezas del oponente en un esfuerzo por capturar a su rey, momento en que ocurre el jaquemate, palabra que viene del persa «shah mat», cuyo significado es «el rey ha muerto». Similar a una batalla medieval, al inicio del juego el tablero de ajedrez está ocupado por todas las piezas, y al final un rey vencido y el tablero casi vacío, excepto por los pocos «soldados» que quedaron en pie.

Hasta el momento no se conoce un algoritmo perfecto para decidir la mejor jugada, se podría escoger una jugada al azar, pero el resultado sería caótico y risible. Para los efectos de un juego computarizado, una búsqueda heurística proporciona la mayoría de las veces una jugada razonablemente buena.

Derivada de la teoría de juegos, la búsqueda heurística también es conocida como algoritmo mini-max, y trata de maximizar la ganancia de la computadora minimizando la ganancia del contrario. En su versión básica tiene que generar todo el árbol de variantes de las jugadas posibles, lo cual produce una explosión combinatoria, por ejemplo en un juego de este deporte ciencia, un análisis de 6 niveles de profundidad produce alrededor de mil millones de alternativas, esta técnica se conoce como estrategia tipo A o fuerza bruta.

Para que la computadora responda dentro de un tiempo razonable, se utiliza un algoritmo llamado corte o poda alfa-beta, que evade analizar detalladamente una posición si descubre que le resulta contraproducente, ya sea en el equilibrio material o posicional, limitando la exploración a un aproximado de 16 millones de posiciones.

La computadora estima una puntuación que guía su búsqueda, en base a una lista de criterios que diseñó el programador y que conforman su «conocimiento» ajedrecístico: puntuar por captura de piezas importantes, avance de los peones, dominio del centro, movilidad, etc. Esta función de evaluación, permite que el software de ajedrez simule inteligencia en máquinas y realice a veces jugadas admirables e imprevistas.

Afortunadamente esta «inteligencia» sintética no tiene ego, por lo tanto no se «preocupa» por su juego de ajedrez, no se decepcionará cuando le ganemos, y tampoco alardeará cuando nos derrote.

Proceso de compilación con lenguaje C

Cómo compilarlo

Si utiliza un IDE (Integrated Development Environment), es necesario crear un nuevo proyecto de tipo consola (lenguaje C, no C++), agregue el archivo fuente toledo.c al proyecto, compile y ejecute —entrará en modo de dos jugadores— y si quiere jugar contra la computadora, será necesario que dentro de su entorno modifique los argumentos de entrada para el programa.

En caso de utilizar un entorno de línea de órdenes, suponiendo que el archivo fuente toledo.c está en el directorio actual, teclee esto:

     cc toledo.c -o toledo

Se requiere un compilador C moderno de 32 bits, este programa no funcionará con compiladores antiguos de 16 bits como Turbo C o Zortech C.

Como funciona

El juego de ajedrez es para dos jugadores, o un jugador —siempre blancas— contra la máquina. Para el primer modo, ejecute el programa sin argumentos:

     toledo

El otro modo es accesible ejecutando el programa con un argumento (análisis a profundidad 5):

     toledo a

Dos argumentos (análisis a profundidad 6):

     toledo a b

Y cada argumento sucesivo analizará un nivel más. No se recomienda más allá del nivel 7, de lo contrario resultará muy lenta la respuesta de la computadora.

Las piezas son representadas por su inicial en inglés: Pawn (peón), Rook (torre), kNight (caballo), Bishop (alfil), Queen (reina o dama) y King (rey). Las letras mayúsculas son las blancas y las minúsculas son las negras.

El juego tiene la sencillez necesaria para permitir que el principiante domine el juego y se divierta, cuando sea su turno, usted puede introducir su movimiento, por ejemplo teclee D2D4 y oprima la tecla Enter, la computadora aceptará la jugada solo si es un movimiento legal del ajedrez.

Un caso especial es cuando se corona un peón, se debe introducir el movimiento junto con una letra extra indicando la pieza deseada. Por ejemplo, al teclear el movimiento F7F8N, suponiendo que existe un peón en F7, lo coronará a un caballo, substituya N por la pieza deseada (N/Q/R/B).

La computadora detecta jaquemate y mate ahogado, y por cada jugada de la máquina, muestra la puntuación de la posición, un número positivo indica que la computadora tiene ventaja sobre el jugador, y un número negativo indica que el jugador tiene ventaja.

Poster conmemorativo

Poster conmemorativo

Se ha diseñado un poster conmemorativo de 53.0 x 76.2 cm. que usted puede descargar desde aquí e imprimir en papelerías especializadas.

¿Puede distinguir una figura familiar? (pista: observelo de cabeza)

Compiladores probados con el ajedrez:

Fabricante Nombre y versión
Borland C Compiler v5.5
Digital Mars C Compiler v8.47
Fabrice Bellard Tiny C Compiler v0.9.23
Familia Toledo CCR v6.2.0
FSF GNU C Compiler v2.7.2.1, v3.2, v3.3.1, v3.4.2 y v4.0.2 (DJGPP, Dev C/C++ y MinGW)
LADSoft CC386 v3.8
Logiciels/Informatique lcc-win32 v3.8
Metrowerks Codewarrior v5 y v6
Microsoft Visual C++ 2005
Pelles C Compiler v4
Sybase OpenWatcom v1.2

Ligas y artículos relacionados:



 

Artículo anterior Artículo anterior Lista de artículos Siguiente artículo Siguiente articulo