Familia Toledo primer lugar en concurso internacional de software
NFT. 7 de junio del 2008.
Desarrollar software de última generación, requiere un
oceano de tiempo para obtener un conocimiento sofisticado, como Óscar Toledo
Gutiérrez, que conquistó las
primeras tres categorías
de la 19ª edición del
IOCCC (International Obfuscated
C Code Contest), la categoría Best of Show con un programa que simula una
computadora y sus interfaces, además las categorías Most Portable Chess Set
con un juego de ajedrez gráfico y Best Small Program que ilustra el periplo del
caballo. |
El joven Óscar — Prólogo a los programas — Lo mejor del concurso — El microprocesador 8080 — Ajedrez más portátil — Mejor programa diminuto — Semblanza — Enlaces relacionados
El IOCCC (International Obfuscated C Code Contest) fue fundado en 1984 en San Francisco, California, desde entonces organiza un concurso anual, donde los participantes deben escribir programas en lenguaje C, de menos de 2048 caracteres, que sean funcionales y cuyo código fuente este codificado de forma tan ingeniosa, que incluso los expertos tengan dificultades para comprenderlos, pero que sea capaz de funcionar en todas las computadoras. Las reglas del concurso establecen que cualquier programador del mundo puede participar, pero sólo se da a conocer a los ganadores. Solo los profesionales del software son capaces de ganar este concurso, que atrae a la crema y nata de los programadores de todo el mundo.
Las otras categorías del IOCCC de este año fueron ocupadas por participantes de E.U.A, Reino Unido, Italia, Finlandia y Noruega. México es el único país hispanoamericano que ha ganado el primer lugar de este concurso, donde participan programadores de empresas y universidades prestigiadas como: HP, AT&T, MIT, Cray, Pixar, Familia Toledo y la Universidad de Oxford y de Pisa, así como personas ligadas a la red de alta tecnología de Silicon Valley, Taiwan, Bangalore, Malasia, Hong Kong, Cambridge y Helsinki, entre otros.
El premio es el reconocimiento a la habilidad de los ganadores, por parte de la comunidad de programadores.
¿Porqué es importante este acontecimiento para los mexicanos?. Tomando en cuenta que México es un país del tercer mundo sin trayectoria tecnológica, son extraños esta clase de sucesos. La tecnología es un bien necesario en este mundo globalizado, donde el conocimiento se ha convertido en un artículo muy cotizado por las industrias, aunque a pesar de lo que muchos creen, este no se encuentra a la venta en la tienda de la esquina, se requieren años de esfuerzo para obtener personas capacitadas y entregadas a sus principios, autodisciplinadas y con conocimientos prácticos, que se adquieren solo con una gran dedicación.
La cultura mexicana coarta a los que pudieran ser futuros científicos, con excusas que arrastra desde la epoca de la conquista. México goza de maravillas naturales, nos vemos rodeados de recursos naturales amplios y variados, siendo un país de raíces principalmente agrícolas, la diversificación de las tecnologías ha creado una amplia brecha de conocimientos, donde la gran mayoría de los mexicanos no tienen una idea autónoma sobre el impacto de la tecnología en sus vidas, y son guiados solamente por las propagandas comerciales difundidas por la mayoría de los medios de comunicacion; nos vemos ajenos al mundo científico y creemos que se encuentra fuera de nuestra realidad, cuando toda la tecnología esta intimamente ligada a nuestra vida diaria e inexorablemente vinculada con el futuro de nosotros y nuestros hijos, es tiempo de participar en todos estos acontecimientos y valorar la importancia de estas nuevas tecnologías, para llevar al país a un futuro prometedor.
Al momento de realizarse la presentación de la 19ª edicion del IOCCC en el Museo de la Historia de la Computacion en Mountain View, California, donde se expusieron únicamente a los ganadores de dicho concurso, hay que mencionar que antes de estas dos últimas ediciones solo se escuchaban los nombres de países con trayectorias tecnológicas, como: Reino Unido, Finlandia, Noruega, E.U.A. y otros países adelantados. El 4 de noviembre del 2007 se escuchó por primera vez el nombre de México y no solo como un ganador más, sino que se encumbró en la categoría de lo mejor de todo el concurso (Best of Show), además para cerrar con broche de oro, Óscar Toledo Gutiérrez participó con tres programas diferentes y todos ganaron en sus respectivas categorías: Best of Show, Best Small Program y Most Portable Chess. Un claro ejemplo de lo que 24 años de dedicación y amor a su profesión pueden lograr.
Regresamos a la pregunta anterior, ¿Porqué es importante este acontecimiento para los mexicanos?, simplemente al ver que un compatriota gana, nos eleva la autoestima. El hecho de que un mexicano resulte seleccionado entre los mejores programadores del mundo, es un reconocimiento mundial para todos los que no obtienen credibilidad en áreas intelectuales por ser originarios de un país sin ciencia. La corta edad de Óscar al realizar estos programas y obtener el reconocimiento de mejor programador a nivel mundial, es una clara motivación para nuestra juventud, sedienta de valores y ejemplos de éxitos, lo que sin duda logrará que todos nuestros jóvenes se decidan a realizar sus sueños y luchar por un futuro mejor, con grandes esperanzas de triunfo, siempre y cuando exista la autodisciplina y un verdadero amor al conocimiento.
Empresas líderes en informática utilizan el lenguaje C para desarrollar sus programas. Se estima que dominar el lenguaje C toma cerca de diez años. De acuerdo a SOFTWARE 500, la nueva economía basada en el software ha generado ganancias en E.U.A. por $380 mil millones de dólares solo en el año 2006.
Prólogo a los programas ganadores
Estos programas fueron escritos para participar en un concurso donde es obligatorio que el código fuente del programa no exceda de 4096 bytes (4K), por lo tanto se han utilizado avanzadas técnicas de programación y criptografía que pueden hacerlos difíciles de entender.
El concurso es acerca de escribir código confuso, y se descalifica cualquier código que sea muy obvio, «claro» o «limpio». Estos programas pueden exceder la «frontera» mental de muchos programadores.
Desde luego, cualquier buen programador puede descifrar su funcionamiento si se esfuerza, y todos pueden disfrutar estos programas aunque no sean programadores.
Toledo2.c
(19º IOCCC Best of Show) Listado del código fuente. #include <stdio.h> #define n(o,p,e)=y=(z=a(e)%16 p x%16 p o,a(e)p x p o),h( #define s 6[o] #define p z=l[d(9)]|l[d(9)+1]<<8,1<(9[o]+=2)||++8[o] #define Q a(7) #define w 254>(9[o]-=2)||--8[o],l[d(9)]=z,l[1+d(9)]=z>>8 #define O )):(( #define b (y&1?~s:s)>>"\6\0\2\7"[y/2]&1?0:( #define S )?(z-= #define a(f)*((7&f)-6?&o[f&7]:&l[d(5)]) #define C S 5 S 3 #define D(E)x/8!=16+E&198+E*8!=x? #define B(C)fclose((C)) #define q (c+=2,0[c-2]|1[c-2]<<8) #define m x=64&x?*c++:a(x), #define A(F)=fopen((F),"rb+") unsigned char o[10],l[78114],*c=l,*k=l #define d(e)o[e]+256*o[e-1] #define h(l)s=l>>8&1|128&y|!(y&255)*64|16&z|2,y^=y>>4,y^=y<<2,y^=~y>>1,s|=y&4 +64506; e,V,v,u,x,y,z,Z; main(r,U)char**U;{ { { { } } } { { { } } } { { { } } } { { { } } } { { { } } } { { { } } } { { { } } } { { { } } } { { { } } } { { { } } } { { { } } } { { { } } } { { { } } } { { { } } } { { { } } } { { { } } } { { { } } } { { { } } } { { { } } } { { { } } } { { { } } } { { { } } } { { { } } } { { { } } } { { ; } } { { { } } } { { ; } } { { { } } } { { { } } } { { { } } } { { { } } } { { { } } } { { { } } } { { { } } } { { { } } } { { { } } } { { { } } } { { { } } } { { { } } } { { { } } } { { { } } } { { { } } } { { { } } } { { { } } } { { { } } } { { { } } } { { { } } } { { { } } } { { { } } } { { { } } } { { { } } } { { { } } } for(v A((u A((e A((r-2?0:(V A(1[U])),"C") ),system("stty raw -echo min 0"),fread(l,78114,1,e),B(e),"B")),"A")); 118-(x =*c++); (y=x/8%8,z=(x&199)-4 S 1 S 1 S 186 S 2 S 2 S 3 S 0,r=(y>5)*2+y,z=(x& 207)-1 S 2 S 6 S 2 S 182 S 4)?D(0)D(1)D(2)D(3)D(4)D(5)D(6)D(7)(z=x-2 C C C C C C C C+129 S 6 S 4 S 6 S 8 S 8 S 6 S 2 S 2 S 12)?x/64-1?((0 O a(y)=a(x) O 9 [o]=a(5),8[o]=a(4) O 237==*c++?((int (*)())(2-*c++?fwrite:fread))(l+*k+1[k]* 256,128,1,(fseek(y=5[k]-1?u:v,((3[k]|4[k]<<8)<<7|2[k])<<7,Q=0),y)):0 O y=a(5 ),z=a(4),a(5)=a(3),a(4)=a(2),a(3)=y,a(2)=z O c=l+d(5) O y=l[x=d(9)],z=l[++x] ,x[l]=a(4),l[--x]=a(5),a(5)=y,a(4)=z O 2-*c?Z||read(0,&Z,1),1&*c++?Q=Z,Z=0:( Q=!!Z):(c++,Q=r=V?fgetc(V):-1,s=s&~1|r<0) O++c,write(1,&7[o],1) O z=c+2-l,w, c=l+q O p,c=l+z O c=l+q O s^=1 O Q=q[l] O s|=1 O q[l]=Q O Q=~Q O a(5)=l[x=q] ,a(4)=l[++x] O s|=s&16|9<Q%16?Q+=6,16:0,z=s|=1&s|Q>159?Q+=96,1:0,y=Q,h(s<<8) O l[x=q]=a(5),l[++x]=a(4) O x=Q%2,Q=Q/2+s%2*128,s=s&~1|x O Q=l[d(3)]O x=Q / 128,Q=Q*2+s%2,s=s&~1|x O l[d(3)]=Q O s=s&~1|1&Q,Q=Q/2|Q<<7 O Q=l[d(1)]O s=~1 &s|Q>>7,Q=Q*2|Q>>7 O l[d(1)]=Q O m y n(0,-,7)y) O m z=0,y=Q|=x,h(y) O m z=0, y=Q^=x,h(y) O m z=Q*2|2*x,y=Q&=x,h(y) O m Q n(s%2,-,7)y) O m Q n(0,-,7)y) O m Q n(s%2,+,7)y) O m Q n(0,+,7)y) O z=r-8?d(r+1):s|Q<<8,w O p,r-8?o[r+1]=z,r [o]=z>>8:(s=~40&z|2,Q=z>>8) O r[o]--||--o[r-1]O a(5)=z=a(5)+r[o],a(4)=z=a(4) +o[r-1]+z/256,s=~1&s|z>>8 O ++o[r+1]||r[o]++O o[r+1]=*c++,r[o]=*c++O z=c-l,w ,c=y*8+l O x=q,b z=c-l,w,c=l+x) O x=q,b c=l+x) O b p,c=l+z) O a(y)=*c++O r=y ,x=0,a(r)n(1,-,y)s<<8) O r=y,x=0,a(r)n(1,+,y)s<<8)))); system("stty cooked echo"); B((B((V?B(V):0,u)),v)); } |
Lo Mejor del Concurso
Saturado de características, este programa simula una computadora basada en el venerable microprocesador Intel 8080, equipada con 64K de RAM (65536 octetos), pantalla, teclado y dos unidades de disco de 8 MB cada una, para ejecutar software de varios niveles.
El microprocesador 8080 permitió el inicio de la revolución de las computadoras a mediados de 1970, y posibilitó por primera vez que cada persona pudiera tener una computadora en casa.
Para su compilación se requiere de un entorno tipo UNIX —puede ser Linux o BSD— descargue el archivo toledo2.c, y realice:
cc toledo2.c -o toledo2
Una vez hecho esto, descargue la imagen de memoria inicial para el emulador (su ROM básica), por ejemplo, el archivo c_basic.bin y renombrelo como C (sin extensión). Ahora proceda a ejecutar el emulador:
./toledo2
A partir de este momento podrá usar como ejemplo el Palo Alto Tiny BASIC, creado por Li-Chen Wang en 1976, este lenguaje cooperó al éxito de las computadoras personales.
El BASIC (Beginners All purpose Symbolic Instruction Code) es un lenguaje de alto nivel inventado en 1964 por John Kemeny y Thomas Kurtz para la enseñanza de la programación, fue exitoso y creó una generación entera de programadores, varios de ellos son actualmente conocidos millonarios; se considera que es vital que un programador conozca y use BASIC para ser un buen programador.
Pruebe a introducir este programa para contar del 1 al 10, utilice mayúsculas y oprima Enter después de cada línea:
Programa de ejemplo 1: Contador
10 FOR A=1 TO 10 20 PRINT A 30 NEXT A RUN
Oprima Ctrl+Z para salir del programa. Este BASIC admite 26 variables nombradas como A-Z, una matriz @(indice), operaciones /, *, -, +, >, <, =, #, >=, <=, ABS(expr) devuelve valor absoluto, RND(expr) devuelve un valor aleatorio en el rango 1 a expr, y SIZE que devuelve la cantidad de memoria libre en bytes, se admite aritmética entera en el rango de -32768 a 32767. Las órdenes directas son RUN (ejecutar), LIST (listar) y NEW (borrar).
Algunas palabras clave BASIC admitidas:
LET A=5 INPUT A INPUT "VALOR"B PRINT "HOLA" PRINT A*B IF A<B PRINT "A<B" GOTO 100 GOTO expr GOSUB 100 GOSUB expr RETURN FOR A=1 TO 10 STEP 2 NEXT A STOP
Programa de ejemplo 2. Tabla de multiplicar:
10 INPUT "TABLA"A 20 FOR B=1 TO 10 30 PRINT #1,A," x",B," =",A*B 40 NEXT B
Estos fueron solo dos ejemplos de las capacidades básicas del emulador 8080. Si desea probar un sistema operativo, descargue el archivo KAYPROII.ZIP desde www.retroarchive.org, para obtener el CP/M de Digital Research, desarrollado por Gary Kildall en el año 1974, este sistema operativo es el antecesor del MS-DOS.
Extraiga el archivo CPM64.COM desde el directorio SOURCE, y copielo a archivos llamados A y B (serán las unidades de disco). Ahora descargue el archivo c_bios.bin y renombrelo como C (sin extensión) y ejecute el emulador.
Ahora ya tiene un sistema operativo CP/M funcional, con dos archivos creados por el emulador en la unidad simulada A:, HALT.COM para detener el emulador de forma que cierre los archivos, e IMPORT.COM para introducir nuevos archivos. Pruebe a teclear:
DIR
Para obtener un sistema operativo CP/M completo, se requieren los siguientes archivos del directorio SOURCE de KAYPROII.ZIP:
ASM.COM ED.COM STAT.COM DDT.COM LOAD.COM SUBMIT.COM DUP.COM PIP.COM XSUB.COM
Para importarlos debe ejecutarse el emulador con un argumento, por ejemplo:
./toledo2 DDT.COM
Cuando aparezca el indicador de entrada A>, escriba:
IMPORT DDT.COM
Cuando termine, escriba:
HALT
Así el archivo es salvado y se puede repetir el proceso con otro archivo. El archivo KAYPROII.ZIP también contiene el procesador de textos Wordstar 3.3. Hasta ahora se han probado exitosamente los siguientes programas:
http://www.retroarchive.org/cpm/lang/c80v30.zip http://www.retroarchive.org/cpm/lang/Mbasic.com http://www.retroarchive.org/cpm/business/MULTPLAN.ZIP http://www.retroarchive.org/cpm/cdrom/CPM/UTILS/ARC-LBR/UNARC16.ARK http://www.retroarchive.org/cpm/cdrom/CPM/UTILS/ARC-LBR/UNARC16.MSG http://www.retroarchive.org/cpm/cdrom/CPM/UTILS/ARC-LBR/DELBR12.ARK http://www.retroarchive.org/cpm/cdrom/CPM/UTILS/SQUSQ/USQ-20.COM http://www.retroarchive.org/cpm/cdrom/CPM/UTILS/SQUSQ/UNCR8080.LBR http://www.retroarchive.org/cpm/cdrom/CPM/UTILS/DIRUTL/XDIR3-12.LBR http://www.retroarchive.org/cpm/cdrom/CPM/UTILS/DIRUTL/CU.LBR http://www.retroarchive.org/cpm/cdrom/CPM/UTILS/FILCPY/SWEEP40.LBR
Visite www.retroarchive.org para acceder miles de programas compatibles con CP/M e incluso manuales de algunos de ellos. Varios programas requieren instalación para configurar la terminal, seleccione ANSI o VT-100.
¿Qué es el 8080?
El microprocesador Intel 8080 fue diseñado por Federico Faggin y Masatoshi Shima, y estuvo disponible al público a partir de diciembre de 1973, basado en el concepto Von Neumann, que une el procesador y sus registros para procesar instrucciones. El 8080 direcciona 65536 octetos (bytes) de memoria, que pueden contener instrucciones o datos, además tiene 256 puertas de entrada y salida para uso de periféricos.
|
|
|
Los registros de 8 bits pueden ser manipulados en pares de 16 bits, como AF, BC, DE y HL. El registro especial SP (Stack Pointer) mantiene la ubicación en memoria de la pila de datos, y es usado por instrucciones tales como PUSH, POP, CALL y RET. El registro PC (Program Counter) contiene la dirección actual de ejecución, y es alterado por instrucciones tales como JMP y CALL.
Las banderas son bits que están contenidos en el registro especial F, y se alteran automáticamente con el resultado de la última operación aritmética. Son S (Signo, bit 7), Z (Cero, bit 6), P (Paridad, bit 2) y C (Acarreo, bit 0), si cualquiera de ellas está puesta a 1 significa que se cumple la condición que indica.
Del microprocesador 8080 se derivaron otros microprocesadores como el Intel 8085, el Zilog Z80, y el Intel 8088, que fue el núcleo de la primera computadora IBM PC, igual que de los actuales «dual core», todos estos microprocesadores son de arquitectura CISC (Complex Instruction Set Computer), en la cual cada instrucción tiene un tiempo de ejecución variable, lo cual limita su eficiencia, incluso a velocidades de 3 gigahertz.
¿Cómo trabaja?
La memoria RAM de 64K es inicializada con el contenido del archivo C, el bucle principal lee cada instrucción y la decodifica para realizar la operación adecuada.
Para la ejecución del CP/M, se diseñó un BIOS —Basic Input Output System— a la medida, el cual reporta al sistema operativo la configuración del hardware simulado.
El emulador ejecuta en su totalidad el conjunto de instrucciones del microprocesador 8080, que es como sigue:
|
|
Los nemónicos Intel funcionan directamente con las utilidades ASM y DDT del CP/M, por lo tanto usted puede experimentar con la programación en lenguaje ensamblador, software de control, educativo o crear otro sistema operativo.
De forma virtual se han definido periféricos conectados al microprocesador, que permiten el acceso al teclado y a la pantalla, así como a las unidades de disco. Si usted desea escribir su propio monitor o sistema operativo, las siguientes instrucciones permiten la comunicación directa con los periféricos:
Microclave | Operación |
---|---|
76 | Sale del emulador |
DB 00 | Lee el estatus de tecla oprimida |
DB 01 | Lee la tecla |
DB 02 | Lee un byte de archivo (Carry = Fin de archivo) |
D3 xx | Escribe un byte del acumulador en la pantalla |
ED ED 02 | Lee un sector de 128 bytes de disco simulado |
ED ED 03 | Escribe un sector de 128 bytes de disco simulado |
Direcciones de memoria: | |
FBFA = Dirección origen/destino (byte bajo) | |
FBFB = Dirección origen/destino (byte alto) | |
FBFC = Sector (0 a 127) | |
FBFD = Pista (byte bajo) | |
FBFE = Pista (byte alto) | |
FBFF = Número de unidad (0= Unidad A:, 1= Unidad B:) |
¿Sabía usted que los torniquetes del metro de la Ciudad de México son gobernados por microprocesadores 8080?
Toledo3.c
(19º IOCCC Most Portable Chess Set) Listado del código fuente. #include <X11/Xlib.h> char *l="dbcefcbddabcddcba~WAB+ +BAW~ +-84HLSU?A6J57IKJT576,", *F=" ,>>,> xl~w/? ,>>>,s m\177>>\177\177 mm2>>> >uk>>> ",*f;y,u; #define v for (i=0,b=0;b>511?b=0,i+=64:0,i<512;b+=64) A=i/64*10+b/64+21,XCopy\ Plane(d, r[I[A]+7+14*(i+b>>6&1)+28*(A==z)],w,C,0,0,64,64,b,i,1); XFlush(d); #define _(a) *f++=a&*F?-(z%14<7):"U\252U\0DDDD"[z/14*2|u&1], #define G(p) p##Pixel(d,DefaultScreen(d)) #define R(a) |(a==O|p==a)* #define P return y=~y, #define a X(0,0,0, #define H while( #define D ;if( I[304],b,i,z;main(x,W) char**W; { Display *d = XOpenDisplay(""); Window w = XCreateSimpleWindow (d, DefaultRootWindow(d), 64,64,512,512,2,G(Black) ,G(Black)); XGCValues g; XButtonEvent e; int A,r [56],Z,* m = I , C ,Y; XSelectInput(d,w,32772); XMapWindow( d, w); g. foreground = G(White); C=XCreateGC(d,w,4,&g); F+=48; H f=I,i=0,z<56){ H u=0,i++<8){ H _(0)_( 64)_(16)_(8)_(4)_(2)_(1 )_(0)++u<8); F++; } F-= z%7-6?z%14<6?16:0:8; r[ z++]=XCreateBitmapFromData(d,w,I,64,64); } srand( time(z=u=0)); H I[z]=-( z>98|z<21|(z+1)%10<2), ++z<120); H ++m<9+I) 80 [m]=-2,90[m]=~(20[m]=7&* l++),30[m]=1; D 1<x) Z= *W[1]-45; D 2<x){ a u,1 ,Z); a u,0,1); z=0; } H 1){ XNextEvent(d,&e); D e.type==12){ v } D e. type==4){ b=e.y/64*10+e .x/64+21; D(b[I]^y)<-1) { z=b; v} else{ i=(b<29 |b>90)&((z[I]^y)==-2)?- 6^y:z[I]; Y=y; a u,0,1); z=0; v D 1<x&&Y-y){ a u ,1,Z); a u,0,1); } z=0; v } } } } X(w,c,h,e,S,s) { int p,O= *l,t,d,o,C ,*g,E,n,*m =I,N=-1e8, A,L,r,x = 10,q; y=~y ; H--O>20) { o=I[p=O] D q=o^y,q> 0){ q+=(q< 2)*y,C=q ["51#/+++"], A=q["95+3/33"]; do { m=0, r=I[p+=C[l ]-64] D !w |p==w&&q>1 |C+2<A|!r) { d=abs(O- p) D g=q<2 &e>>6==p+( y?x:-x)?I+ (e>>6):0, !r&(q>1|d% x<1||g)|(r ^y)<-1){ n =o,t=q<2&( 89<p|30>p) ?n+=y|1,6^ y:o+(y|1) D (r^y)<-6 ) P 1e7-811 *h; H n-t) { O[I]=0,p [I]=n,m?*g =*m,*m=0:g ?*g=0:0; E=e&63 R( 91)16 R(28) 4 R(21)2 R (98)32; L= (q>1?6-q?l [p/x-1]-l[ O/x-1]-q+2 :(E|=y?8:1 ,!!m)*9:(E |=20-d?0: 64*p,n-o?( l[15+n]-' ' )*9:d/8+!! g*99))+(l[ r+15]-' ') *9+l[p%x]- h-l[O%x]; L-=s>h||s== h&L>49&1<s ?X(s>h?0:p ,L,h+1,E,N ,s):0 D !( z-O|i-n|h| p-b|S|L<- 1e6))return u=E; O[I]= o,p[I]=r,m ?*m=*g,*g= 0:g?*g=-2^ y:0 D S|h&& (L>N||!h&N ==L&&rand( )&4)){ N=L D !h&&s) i =n,z=O,b=p D h&&c-L<S ) P L; } q >5&d<2&C+6 <A&&(g=I+p ,r=I[p+=p- O],m=p<O?g -3:g+2,!(e &(p<O?3:5) <<3*-y|*g| r|m[p<O?1: -1])&&L>- 1e6&&1e6>a 63,1,0))?d ++:(n+=y|1 );} } } C +=q<2&C+3> A&((y?O<80 :39<O)||r) ; } H!r&q> 2&q<6||(p= O,++C<A)) ; } } P N+ 1e8?N:0; } |
Ajedrez más Portátil
Este programa es un juego completo de ajedrez con interfaz gráfica, basta con desplazar el ratón y hacer click en las piezas para moverlas.
El juego acepta todos los movimientos legales del ajedrez, y automáticamente discrimina las jugadas ilegales.
Puede funcionar para dos jugadores, francamente útil cuando alguno de los contrincantes no conoce las reglas del ajedrez. Y si usted quiere probar sus habilidades ajedrecísticas, también le provee de un oponente computarizado con inteligencia artificial.
El código fuente es compilable en un entorno tipo UNIX con sistema de ventanas X11 —compatible con BSD y Linux—, descargue el código fuente toledo3.c y compile de la siguiente forma:
cc toledo3.c -o toledo3 -lX11
Ejecute el programa sin argumentos para obtener el modo de 2 jugadores:
./toledo3
Ejecute con un argumento (indica el nivel de juego, 1-Rápido, 2-Medio, 3-Muy lento) para jugar blancas contra negras guiadas por la computadora:
./toledo3 1
Ejecute con dos argumentos para jugar negras contra blancas guiadas por la computadora, el contenido del segundo argumento no importa:
./toledo3 1 a
Ya que UNIX se utiliza escasamente en las computadoras, este juego de ajedrez fue escrito de tal forma que un aditamento hace que pueda ser compilado en sistemas operativos Windows. Descargue el archivo layer.c, y substituya en toledo3.c la primera línea #include <X11/Xlib.h> por #include "layer.c", después de esto compile con su compilador favorito de Windows (modo C no C++, aplicación Win32).
La versión Windows está fija para un jugador con blancas contra computadora con negras en nivel básico, pero esto se puede cambiar fácilmente modificando el archivo layer.c.
Este ajedrez puede funcionar en cualquier sistema operativo, basta con crear una capa layer.c adecuada, lo que lo hace completamente portátil.
La mitad superior del programa listado compone la interfaz y las gráficas, y la mitad inferior implementa las reglas del ajedrez, todo esto en el límite de 2047 caracteres del IOCCC (no se cuentan espacios, ni llaves ni punto y coma seguidos por espacio).
Es el ajedrez con gráficas más pequeño del mundo escrito en lenguaje C.
El ajedrez corriendo en el Sistema Fénix (utilizando
una capa de traslación de los programadores de la Familia Toledo)
|
El ajedrez corriendo en Windows XP (utilizando
la capa de traslación anexa)
|
El ajedrez corriendo en una distribución de Linux
(versión por defecto)
|
Toledo1.c
(19º IOCCC Best Small Program) Listado del código fuente. char *e,t [366 ],*f ,*g, *h,* i;d, m ; main (c,b) char **b;{ for( ;d[t] =d%3 ?60<d &300 >d&6 <d % 30?0 :32: d%30 ?32: 10 , 366> ++d;) ;for (g=3* atoi (*++ b) + 34+t; i=f= "\1" "\7" "(d" "\177" "yX" "\34" ,e=g ; ) for( *e++ =++m/ 10 + 48,g =c=0 ,*e = 48+m %10; h=e- 65+* i,d= *h,* i++; f-=8 ,g=d <c?c =d,h: g)for (; d -=!! h[*f ++-64 ],*f ;) ; puts (t);} |
El Mejor Programa Diminuto
Un reto con raíces matemáticas es tratar de desplazar un caballo sobre los 64 escaques del tablero de ajedrez, sin repetir ninguno de ellos; este desafío mental también es conocido como el periplo del caballo.
Parece sencillo, pero el caballo se desplaza en forma de L, dos cuadros en una dirección y un cuadro en otra, comprobarlo manualmente puede ser complicado.
Este programa soluciona el problema cómodamente, y es compilable en cualquier plataforma, descargue toledo1.c y compile con su IDE favorito, o en un entorno de órdenes teclee:
cc toledo1.c -o toledo1
Los cuadros del tablero quedan númerados de la siguiente forma:
11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 |
31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 |
41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 |
51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 |
61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 |
71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 |
81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 |
Para obtener la secuencia de movimientos a partir de un cuadro basta con darle el argumento al programa, por ejemplo:
./toledo1 44
Y el programa simula el movimiento del caballo, listando la secuencia en la pantalla, marcada por los números 1 hasta el 64.
Por ser un programa reducido, es ideal para que los estudiantes de lenguaje C conozcan más a fondo el lenguaje, al limpiar el código y analizarlo pueden tardar semanas entendiéndolo, pero de seguro aprenderán mucho.
Semblanza
Oscar Toledo Gutiérrez nace en noviembre de 1978, en Naucalpan, Estado de México, como primogénito del matrimonio formado por Oscar Toledo Esteva y Hortensia Gutiérrez Mendoza, el joven Óscar se caracterizó en su infancia como un niño tranquilo, pero con una viva curiosidad por los acontecimientos de su alrededor. A la edad de tres años, inició el viaje maravilloso al mundo de la enseñanza, guiado de la mano de sus padres. En el momento de enseñarle en forma creativa el arte de leer, su madre Hortensia G. lo introdujo a un mundo de grandes expectativas, donde descubrió que el conocimiento crea hombres creativos.
Después de devorar cuanto libro encontraba dentro de su hogar, el pequeño Óscar a la edad de cinco años, vislumbró su verdadera vocación, entusiasmado con los programas que realizaba su padre en aquel tiempo, en lenguajes como el BASIC y el ensamblador, fue llevado por el impulso que tienen todos los niños de descubrir y jugar, comenzando a crear pequeños programas, algunos sin función y otros de estructura básica en torno a los juegos. Estos pequeños logros aplaudidos por sus padres, lo llevaron a realizar a la edad de diez años su primer programa funcional, para una de las computadoras que el padre diseñó, un software orientado a la edición de textos con interfaz gráfica, que era un paquete completo y autónomo para crear cartas, boletines y propaganda impresa, que fue de gran utilidad a la naciente organización Familia Toledo.
Siempre con el apoyo y el conocimiento que le brindaba su padre, comenzó una larga y exitosa carrera de avances y triunfos dentro de la programación, enfocándose en diversas áreas con horas dedicadas al aprendizaje de nuevas técnicas de programación, y acumulando años de experiencia en trabajo de campo, el joven Óscar fue forjando una carrera en la industria del software como programador en diversos lenguajes y máquinas, en forma totalmente autodidacta.
Apasionado por su trabajo, ha complementado su vida cotidiana con el estudio y las diversiones propias de sus edad, en sus ratos libres no es raro observarlo con un libro en mano, creando ideas para programas novedosos. Algunas veces jugando ajedrez, platicando con sus amigos o disfrutando un DVD, su mente siempre activa encuentra soluciones ingeniosas para problemas de programación. Su gusto por el cine, la música y el ajedrez, le imprimen un sello característico a sus creaciones al diseñar programas de aplicaciones diversas. Este año demostró que la pasión por el estudio rinde frutos, diseñando en sus ratos libres, tres complejos programas para participar en un concurso internacional, el IOCCC (International Obfuscated C Code Contest), el joven Óscar Toledo Gutiérrez de ahora 29 años, hizo que sus padres se sintieran orgullosos y además colocó en la palestra mundial del software a México, al ganar por segunda vez en uno de los eventos más importantes que se realizan dentro del area de la programación en E.U.A, y fue el primer y único ganador iberoamericano de dicho concurso, hasta el momento.
Libro, ligas y artículos relacionados
Artículo anterior | Siguiente articulo |