In 128 số nguyên tố đầu tiên mà không sử dụng bất kỳ từ dành riêng


13

Giải pháp rõ ràng là chỉ in chúng dưới dạng chuỗi, nhưng có thể viết mã ngắn hơn không?

Yêu cầu:

  1. Không có đầu vào nên được xử lý, và đầu ra phải ở dạng 2 3 5 7 11 13 ...vv
  2. Không có từ dành riêng trong ngôn ngữ được sử dụng ở tất cả
  3. Ngôn ngữ ít nhất phải cho phép lập trình có cấu trúc và có các từ dành riêng (nếu không thì điểm 2 sẽ là moot).

Đầu tiên tôi chỉ có C / C ++ trong đầu, nhưng đã mở rộng câu hỏi trong khi vẫn cố gắng ngăn chặn gian lận


1
Thật không may cho tôi, Tcl không có từ dành riêng.
Julian Kuhn

Câu trả lời:


14

C, 60 ký tự

Giới hạn "không có từ khóa" không quan trọng ở đây. Tôi khá chắc chắn rằng việc cải thiện nó, nếu có thể, sẽ không được thực hiện bằng cách thêm từ khóa.

n=2;main(m){n<720&&main(m<2?printf("%d ",n),n:n%m?m-1:n++);}

Phiên bản thay thế:
Đầu ra không đẹp, nhưng tôi thích sự printflạm dụng.

n=2;main(m){n<720&&main(m<2?printf("%*d",n,n):n%m?m-1:n++);}

Thủ thuật trong cả hai giải pháp là hợp nhất hai vòng lặp (được thực hiện bằng đệ quy) thành một.
nlà số nguyên tố tiềm năng tiếp theo, mước số tiềm năng tiếp theo.
Trong mỗi cuộc gọi đệ quy, chúng tôi hoặc tăng n(trong khi đặt mthành giá trị trước đó) hoặc giảm dần m.


7

Python, 108 ký tự

Python không được thực hiện cho thử thách này. Muốn printkhông Đó là dành riêng. Vâng, chúng ta sử dụng stdoutnhư thế nào? Chà, điều đó sẽ tốn một import... bạn đoán nó, dành riêng. Chà ... tôi đang ở unix, vì vậy tôi có thể mở mô tả tập tin 1, điều này xảy ra là thiết bị xuất chuẩn. Gian lận!

Người đàn ông, và lặp đi lặp lại? Không có gì nhưng eval. Tất nhiên không có vòng lặp, nhưng chúng ta thậm chí không thể định nghĩa một hàm với defhoặc lambda. Và để thêm sự xúc phạm đến thương tích, chúng ta thậm chí không thể sử dụng sự hiểu biết danh sách! Tôi luôn tìm kiếm một cái cớ để sử dụng những thứ như map(p.__mod__,...)trong môn đánh gôn ... sự hiểu biết luôn tốt hơn. Cho đến bây giờ, đó là.

p=1
eval(compile("p+=1;open('/dev/fd/1','w').write('%s '%p*all(map(p.__mod__,range(2,p))));"*720,'','exec'))

Bây giờ, bạn có thể phàn nàn rằng execlà một từ khóa, mặc dù tôi đã không sử dụng từ khóa (Tôi thậm chí còn không evalmột exec). Chà, đây là một giải pháp 117 ký tự không sử dụng 'exec'.

p=2
s="eval('('+s*(p<720)+')',open('/dev/fd/1','w').write('%s '%p*all(map(p.__mod__,range(2,p)))),{'p':p+1})";eval(s)

1
in không được bảo lưu trong Python3 :) bạn có thể sử dụng __import__, nhưng điều đó sẽ tốn các ký tự
gnibbler

6

JavaScript (80 ký tự)

eval((s=Array(719)).join("s[j=++n]?j:"+s.join("s[j+=n]=")+"r+=n+' ';"),r="",n=1)

Chạy trong giao diện điều khiển của webbrowser của bạn.

Sử dụng một sàng chính, hóa ra là rất cô đặc.


4

C, 183 ký tự

#define q j*j<k?i%p[j++]||(i++,j=0):printf("%d\n",p[j=0,k++]=i++)
#define A q;q;q;q;q;q;q;q
#define B A;A;A;A;A;A;A;A
#define C B;B;B;B;B;B;B
main(){int i=2,j=0,k=0,p[999];C;C;C;C;C;}

Vâng, đây là một nỗ lực đầu tiên nhanh chóng. Tôi tin rằng điều này sẽ đáp ứng các yêu cầu. Tôi đang sử dụng phân chia thử nghiệm đơn giản để tìm các số nguyên tố và một vòng lặp không được kiểm soát được xây dựng bằng bộ tiền xử lý để lặp lại cho đến khi tôi tìm thấy đủ chúng. Số lần lặp lại đã được điều chỉnh sao cho chính xác 128 số nguyên tố được in.


4

C, 87 ký tự

d;p(n){--d<2||n%d&&p(n);}r(n){p(d=n);d<2&&printf("%d\n",n);++n<720&&r(n);}main(){r(2);}

(Tôi đã cố viết nó theo phong cách nhiều chức năng hơn, nhưng tôi không có khả năng sử dụng returnloại giết kế hoạch đó.)


3

C, 134 ký tự

Đây là một giải pháp thay thế cố gắng tránh sử dụng các từ nhiều nhất có thể, dành riêng hoặc nói cách khác:

main(i){i<9?main(2953216):i>4097?--i&4094?i/4096%(i%4096)?main(i):
main((i/4096-1)*4097):printf("%d\n",i>>12,main((i/4096-1)*4097)):0;}

Tất cả nó sử dụng là printfmainvới một đối số duy nhất.


3

Toán học 50 ký tự

Tôi không chắc cách diễn giải "các từ dành riêng" cho Mathicala nhưng tôi muốn chơi vì vậy tôi sẽ hiểu nó có nghĩa là không có các hàm dựng sẵn để tạo các số nguyên tố hoặc kiểm tra tính nguyên thủy.

Fold[#2Cases[#/#2,1|_Rational]&,#,#]&@Range[2,719]

2

Haskell, 72 ký tự

main=putStrLn.unwords$take 128[show p|p<-[2..],all((>0).mod p)[2..p-1]]

Phải thừa nhận rằng, tránh các từ khóa không quá khó trong Haskell.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.