2011-01-06 44 views
13

Công thức ban đầu được đưa ra here (bạn cũng có thể thử chương trình của mình để có được tính chính xác).Cách ngắn nhất để chuyển đổi biểu thức infix thành postfix (RPN) trong C

Quy tắc bổ sung:
1. Chương trình phải đọc từ đầu vào chuẩn và ghi vào đầu ra tiêu chuẩn.
2. Chương trình sẽ trả về số không cho hệ thống/chương trình gọi điện.
3. Chương trình sẽ biên dịch và chạy với gcc -O2 -lm -s -fomit-frame-pointer.

Thách thức có một số lịch sử: cuộc gọi triển khai ngắn đã được công bố tại Polish programming contest blog vào tháng 9 năm 2009. Sau cuộc thi, mã ngắn nhất là 81 ký tự. Sau đó cuộc gọi thứ hai đã được thực hiện cho mã thậm chí ngắn hơn và sau khi matix2267 năm published his solution trong 78 byte:

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

Bất cứ ai để làm cho nó thậm chí còn ngắn hơn hoặc chứng minh điều này là bất khả thi?

+1

@fuzzyTew, ngắn mạch là không xác định cho c nó thực sự được xác định rất tốt. || và && được coi là ngắn mạch – hhafez

+0

lời xin lỗi vì đã xóa Tôi đã trải nghiệm rằng studio trực quan 6 có bật tối ưu hóa sẽ đảo ngược thứ tự của chúng. phải là một trong nhiều lỗi của nó. – fuzzyTew

+0

Tôi không bỏ phiếu để đóng. Tôi bỏ phiếu để xóa thẻ [code-golf]. – Nakilon

Trả lời

15

Dưới đây là một cách để giảm bớt các mã xuống chars:

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

Một lâu hơn, nhận xét phiên bản cho rõ ràng:

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

Điều này sẽ không hoạt động trên trình biên dịch C trong đó putchar là macro ... –

+0

Có thể xác nhận nó hoạt động trên Testcase nhỏ hơn. – st0le

+4

+1 cho phiên bản đã nhận xét. –

5

Tôi không ra để phá vỡ bất cứ hồ sơ nhưng tôi sẽ đăng bài này 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: vấn đề đúng đắn cố định chỉ ra bởi bình luận kuszi của.

+0

Nếu bạn thích loại câu đố này Bạn có thể xem [cuộc thi này] (http://www.spoj.pl/SHORTEN/) để biết thêm (nhiều ngôn ngữ lập trình được phép). – kuszi

+0

Chương trình của bạn không được xuất số trường hợp thử nghiệm và thiếu ký tự dòng mới sau khi kiểm tra. Xem [ví dụ làm việc] (http://ideone.com/ihrpz) – kuszi

+1

Cảm ơn bạn - đối với tôi, nó hoạt động ngay bây giờ! – kuszi

6

Vâng, người chiến thắng thực sự là một trong những người viết mã nhỏ này mà bạn cung cấp, nhưng bạn hơi có thể sửa đổi nó để loại bỏ các lối ra:

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

tôi đã cố gắng và nó hoạt động.

+0

Đã đồng ý, nhưng tôi đã thử nó và kết quả gần như giống nhau nhưng không hoàn toàn. Sử dụng thông tin đầu vào ví dụ từ http://www.spoj.pl/problems/ONP/ bạn nhận được dấu "3" bổ sung. –

+0

Tôi không có "3" bổ sung này với gcc 3.4.4. Cái nào bạn đang dùng? –

+0

phiên bản gcc 3.4.6 20060404 (Mũ Đỏ 3.4.6-11). Điều đó nói rằng, tôi đã thử nó trên gcc 4.1.2 và nó hoạt động tốt. –

Các vấn đề liên quan