Cetak 128 bilangan prima pertama tanpa menggunakan kata-kata yang dipesan

13

Solusi yang jelas adalah dengan hanya mencetaknya sebagai string, tetapi apakah mungkin untuk menulis kode yang lebih pendek?

Persyaratan:

  1. Tidak ada input yang harus diproses, dan output harus dalam bentuk 2 3 5 7 11 13 ...dll.
  2. Tidak ada kata khusus dalam bahasa yang digunakan sama sekali
  3. Bahasa setidaknya harus memungkinkan pemrograman terstruktur, dan telah memesan kata-kata (jika tidak, poin 2 akan diperdebatkan).

pertama saya secara eksklusif C / C ++ dalam pikiran, tetapi memperpanjang pertanyaan sambil tetap berusaha untuk mencegah kecurangan

vsz
sumber
1
Sayangnya bagi saya, Tcl tidak memiliki kata-kata yang dicadangkan.
Johannes Kuhn

Jawaban:

14

C, 60 karakter

Batasan "tanpa kata kunci" tidak masalah di sini. Saya cukup yakin bahwa memperbaikinya, jika mungkin, tidak akan dilakukan dengan menambahkan kata kunci.

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

Versi alternatif:
Outputnya tidak sebaik, tapi saya suka printfpenyalahgunaannya.

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

Trik dalam kedua solusi adalah untuk menggabungkan dua loop (diimplementasikan oleh rekursi) menjadi satu.
nadalah potensi utama mberikutnya, pembagi potensial berikutnya.
Dalam setiap panggilan rekursif, kami menambah n(sambil mengatur mke nilai sebelumnya) atau mengurangi m.

ugoren
sumber
7

Python, 108 karakter

Python tidak dibuat untuk tantangan ini. Wanna print? Itu sudah dipesan. Nah, bagaimana kalau kita gunakan stdout? Yah, itu akan menelan biaya import... Anda dapat menebaknya, memesan. Yah ... Saya sedang di unix, jadi saya bisa membuka file descriptor 1, yang kebetulan adalah stdout. Retas!

Man, dan iterasi? Tapi tidak ada eval. Tidak ada loop, tentu saja, tetapi kita bahkan tidak bisa mendefinisikan fungsi dengan defatau lambda. Dan untuk menambah penghinaan pada cedera, kita bahkan tidak bisa menggunakan daftar pemahaman! Saya selalu mencari alasan untuk menggunakan hal-hal seperti map(p.__mod__,...)dalam kode golf ... pemahaman selalu lebih baik. Sampai sekarang.

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

Sekarang, Anda mungkin mengeluh itu execadalah kata kunci, meskipun saya tidak menggunakan kata kunci (saya bahkan evaltidak punya exec). Nah, inilah solusi 117-karakter yang tidak digunakan '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)
stan
sumber
1
cetak tidak dicadangkan dalam Python3 :) Anda dapat menggunakan __import__, tapi itu akan biaya karakter
gnibbler
6

JavaScript (80 karakter)

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

Jalankan di konsol browser web Anda.

Digunakan saringan utama, yang ternyata sangat kental.

salinan
sumber
4

C, 183 karakter

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

Nah, inilah upaya cepat pertama. Saya percaya ini harus memenuhi persyaratan. Saya menggunakan divisi percobaan sederhana untuk menemukan bilangan prima dan loop yang tidak dikontrol dibangun menggunakan preprocessor untuk mengulanginya sampai saya menemukan cukup banyak dari mereka. Jumlah pengulangan telah diubah sehingga tepat 128 bilangan prima dicetak.

Ilmari Karonen
sumber
4

C, 87 karakter

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

(Saya mencoba menulisnya dengan gaya yang lebih fungsional, tetapi ketidakmampuan saya untuk menggunakan returnsemacam itu mematikan rencana itu.)

kotak roti
sumber
3

C, 134 karakter

Berikut ini adalah solusi alternatif yang mencoba untuk menghindari menggunakan kata-kata sebanyak mungkin, dilindungi undang-undang atau sebaliknya:

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

Yang digunakan hanyalah printfdan maindengan satu argumen.

kotak roti
sumber
3

Mathematica 50 karakter

Saya tidak yakin bagaimana menafsirkan "kata-kata yang dicadangkan" untuk Mathematica tetapi saya ingin bermain sehingga saya akan menganggapnya berarti melakukan tanpa fungsi bawaan untuk menghasilkan bilangan prima atau menguji primality.

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

Haskell, 72 karakter

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

Diakui, menghindari kata kunci tidak terlalu sulit di Haskell.

hammar
sumber