Самый короткий способ преобразования инфиксных выражений в postfix (RPN) в C

Оригинальная формулировка дается здесь (вы можете попробовать также свою программу для правильности).

Дополнительные правила:
 1. Программа должна считывать со стандартного ввода и записывать на стандартный вывод.
 2. Программа должна вернуть ноль в вызывающую систему/программу.
 3. Программа должна компилироваться и запускаться с помощью gcc -O2 -lm -s -fomit-frame-pointer.

У проблемы есть некоторая история: призыв к коротким реализациям был объявлен в блоге конкурса польских программистов в сентябре 2009 года. После конкурса, самый короткий код был длинным 81 символом. Позже второй звонок был сделан для еще более короткого кода, и после года matix2267 опубликовал свое решение в 78 байт:

main(c){read(0,&c,1)?c-41&&main(c-40&&(c%96<27||main(c),putchar(c))):exit(0);}

Кто-нибудь, чтобы сделать его еще короче или доказать, что это невозможно?

Ответ 1

Здесь можно уменьшить код до 76:

main(c){read(0,&c,1)?c-41&&main(c-40&&putchar(c,c%96>26&&main(c))):exit(0);}

Более длинная, прокомментированная версия для ясности:

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 */
}

Ответ 2

Ну, настоящий победитель - тот, кто написал этот небольшой код, который вы предоставили, но вы можете немного изменить его, чтобы удалить выход:

main(c){read(0,&c,1)?c-41&&main(c-40&&(c%96<27||main(c),putchar(c))):0;}

Я пробовал, и он работает.

Ответ 3

Я не собираюсь нарушать какие-либо записи, но я все равно отправлю это сообщение:

#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;}

Изменить: Исправлены проблемы с корректностью, отмеченные комментарием kuszi.