Tous les ans, est organisé sur Internet le concours international du code C le plus obscur (International Obfuscated C Code Competition, IOCCC en abrégé). Le but est de produire un programme qui se compile et s'exécute sans erreur, dont le source est volontairement le plus obscur possible (ce qui est facile), mais qui est « intéressant » à un titre ou à un autre. C'est sur ce dernier point que doit s'exercer la créativité des participants. Tous les ans, les meilleures contributions sont de véritables joyaux et sont librement accessibles via l'URL : ftp://ftp.uu.net/pub/ioccc.
Nous présentons ci-dessous la contribution de Brian Westley pour l'année 1990. Son programme a ceci d'extraordinaire que le source C peut se lire comme un texte en « anglais » : il s'agit d'une conversation épistolaire entre un amoureux et sa belle (rétive, hélas pour lui). Il y a quelques petites licences prises par rapport à du vrai anglais : 1s est pris comme une approximation du mot anglais is, 1l est pris comme approximation de ll (dans I'll get a break) et des signes cabalistiques sont introduits entre les mots, mais c'est parfaitement lisible.
Il y a aussi un problème avec le langage C : le compilateur utilisé en 1990 par B. Westley n'était pas ANSI et acceptait le suffixe s derrière une constante entière pour lui donner le type short int. Si on transforme les 1s en 1, le programme se compile et s'exécute sans erreur. L'exécutable est un programme ... d'effeuillage de la marguerite ! Il faut lui passer en paramètre un nombre sensé être le nombre de pétales de la marguerite, et le programme va « dire » : love me, love me not, love me, love me not etc. 1.9un nombre de fois égal au nombre de pétales. Voici le texte du programme :
char*lie; double time, me= !0XFACE, not; int rested, get, out; main(ly, die) char ly, **die ;{ signed char lotte, dear; (char)lotte--; for(get= !me;; not){ 1 - out & out ;lie;{ char lotte, my= dear, **let= !!me *!not+ ++die; (char*)(lie= "The gloves are OFF this time, I detest you, snot\n\0sed GEEK!"); do {not= *lie++ & 0xF00L* !me; #define love (char*)lie - love 1s *!(not= atoi(let [get -me? (char)lotte- (char)lotte: my- *love - 'I' - *love - 'U' - 'I' - (long) - 4 - 'U' ])- !! (time =out= 'a'));} while( my - dear && 'I'-1l -get- 'a'); break;}} (char)*lie++; (char)*lie++, (char)*lie++; hell:0, (char)*lie; get *out* (short)ly -0-'R'- get- 'a'^rested; do {auto*eroticism, that; puts(*( out - 'c' -('P'-'S') +die+ -2 ));}while(!"you're at it"); for (*((char*)&lotte)^= (char)lotte; (love ly) [(char)++lotte+ !!0xBABE];){ if ('I' -lie[ 2 +(char)lotte]){ 'I'-1l ***die; } else{ if ('I' * get *out* ('I'-1l **die[ 2 ])) *((char*)&lotte) -= '4' - ('I'-1l); not; for(get=! get; !out; (char)*lie & 0xD0- !not) return!! (char)lotte;} (char)lotte; do{ not* putchar(lie [out *!not* !!me +(char)lotte]); not; for(;!'a';);}while( love (char*)lie);{ register this; switch( (char)lie [(char)lotte] -1s *!out) { char*les, get= 0xFF, my; case' ': *((char*)&lotte) += 15; !not +(char)*lie*'s'; this +1s+ not; default: 0xF +(char*)lie;}}} get - !out; if (not--) goto hell; exit( (char)lotte);}
Matthieu Moy 2017-02-08