Самый короткий способ конвертировать инфиксные выражения в постфикс (RPN) в C - PullRequest
13 голосов
/ 07 января 2011

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

Дополнительные правила:
1. Программа должна читать со стандартного ввода и писать в стандартныйoutput.
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);}

Любой, кто сделает его еще короче или докажет, что это невозможно

Ответы [ 3 ]

15 голосов
/ 13 января 2011

Вот способ уменьшить код до 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 */
}
6 голосов
/ 12 января 2011

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

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

Я попытался, и это работает.

6 голосов
/ 07 января 2011

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

#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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...