2011-01-06 13 views
13

Oryginalna formuła ma here (można również sprawdzić poprawność swojego programu).Najkrótsza metoda przekształcania wyrażeń wlewkowych na postfiks (RPN) w C

Dodatkowe zasady:
1. Program powinien odczytywać ze standardowego wejścia i zapisywać na standardowe wyjście.
2. Program powinien zwrócić zero do systemu wywołującego/programu.
3. Program powinien zostać skompilowany i uruchomiony z gcc -O2 -lm -s -fomit-frame-pointer.

Wyzwanie ma pewną historię: wezwanie do krótkich wdrożeń ogłoszono na Polish programming contest blog we wrześniu 2009 r. Po zakończeniu konkursu najkrótszy kod miał 81 znaków. Później drugiego naboru został złożony nawet krótszy kod, a po roku matix2267 published his solution w 78 bajtów:

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

Każdy, aby jeszcze krótsze lub okazać to niemożliwe?

+1

@fuzzyTew, zwarcie nie jest niezdefiniowana dla c nim jest właściwie bardzo dobrze zdefiniowany. || i && mają na celu przeproszenie – hhafez

+0

przeprosin za usunięcie Z doświadczenia wiem, że studio graficzne 6 z włączonymi optymalizacjami odwróci ich kolejność. musiał być jednym z wielu błędów. – fuzzyTew

+0

Nie głosuję, aby zamknąć. Głosuję, aby usunąć tag [code-golf]. – Nakilon

Odpowiedz

15

Oto sposób na zmniejszenie kod do znaków:

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

Dłuższy komentuje Wersja dla jasności:

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

To nie zadziała w kompilatorach języka C, gdzie putchar jest makrem ... –

+0

Potwierdza, że ​​działa na mniejszej wersji testowej. – st0le

+4

+1 dla wersji z komentarzami. –

5

nie jestem się złamać wszelkie rekordy, ale będę pisać to w każdym razie:

#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: Naprawiono problemy poprawności podkreślił komentarzu kuszi męska.

+0

Jeśli podoba Ci się ten rodzaj puzzli, możesz rzucić okiem na [ten konkurs] (http://www.spoj.pl/SHORTEN/) więcej (dozwolona różnorodność języków programowania). – kuszi

+0

Twój program nie powinien wyprowadzać liczby przypadków testowych i po teście nie ma nowego znaku linii. Zobacz [przykład pracy] (http://ideone.com/ihrpz) – kuszi

+1

Dziękuję - dla mnie działa już teraz! – kuszi

6

Cóż, prawdziwym zwycięzcą jest ten, kto napisał ten mały kod podany, ale można nieco zmodyfikować, aby usunąć wyjście:

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

próbowałem i to działa.

+0

Zgodzę się, ale spróbowałem i wynik był prawie taki sam, ale nie całkiem. Korzystając z przykładowego wejścia z http://www.spoj.pl/problems/ONP/ otrzymujesz dodatkowe końcowe "3". –

+0

Nie mam tego dodatkowego "3" z gcc 3.4.4. Którego używasz? –

+0

gcc wersja 3.4.6 20060404 (Red Hat 3.4.6-11). Powiedziałem, że wypróbowałem to na gcc 4.1.2 i działa dobrze. –

Powiązane problemy