Reputation: 2079
Original formulation is given here (you can try also your program for correctness) .
Additional rules:
1. The program should read from standard input and write to standard output.
2. The program should return zero to the calling system/program.
3. The program should compile and run with gcc -O2 -lm -s -fomit-frame-pointer.
The challenge has some history: the call for short implementations has been announced at the Polish programming contest blog in September 2009. After the contest, the shortest code was 81 chars long. Later on the second call has been made for even shorter code and after the year matix2267 published his solution in 78 bytes:
main(c){read(0,&c,1)?c-41&&main(c-40&&(c%96<27||main(c),putchar(c))):exit(0);}
Anyone to make it even shorter or prove this is impossible?
Upvotes: 13
Views: 5897
Reputation: 6548
Here's a way to reduce the code down to 76 chars:
main(c){read(0,&c,1)?c-41&&main(c-40&&putchar(c,c%96>26&&main(c))):exit(0);}
A longer, commented version for clarity:
int main(int c)
{
if (read(0,&c,1)) { /* read char */
if (c-41) { /* if not ')' */
if (c-40) { /* then if not '(' */
if (c%96>26) { /* then if operator (not alphabet or <LF>) */
main(c); /* recurse */
}
putchar(c); /* print */
}
main(c); /* recurse */
}
} else exit(0); /* end program */
}
Upvotes: 11
Reputation: 6548
I'm not out to break any records but I'll post this anyway:
#define x(z) while(p>##z s)putchar(*p--);
main(c){
int s[9],*p=s-1;
for(;read(0,&c,1);){
isalpha(c)?putchar(c):c=='('?(c=0):c==')'?(c=1):isdigit(c)?:(*++p=c);
if(c==0){x()main(0);}
if(c==1) break;}
x(=)return 0;}
Edit: Fixed correctness issues pointed out by kuszi's comment.
Upvotes: 4
Reputation: 6387
Well, the real winner is the one who wrote this small code you provided, but you can slightly modify it to remove the exit:
main(c){read(0,&c,1)?c-41&&main(c-40&&(c%96<27||main(c),putchar(c))):0;}
I tried and it works.
Upvotes: 4