Ayrılmış sözcük kullanmadan ilk 128 asal sayıyı yazdır


13

Bariz çözüm sadece bir dize olarak yazdırmak olacaktır, ancak daha kısa bir kod yazmak mümkün mü?

Gereksinimler:

  1. Hiçbir girdi işlenmemeli ve çıktı 2 3 5 7 11 13 ...vb. Şeklinde olmalıdır .
  2. Dilde hiçbir ayrılmış kelime kullanılmıyor
  3. Dil en azından yapılandırılmış programlamaya izin vermeli ve ayrılmış sözcüklere sahip olmalıdır (aksi takdirde 2. nokta tartışmalıdır).

önce aklımda sadece C / C ++ vardı, ama yine de hile önlemek için soruyu genişletti


1
Ne yazık ki benim için, Tcl'nin ayrılmış kelimesi yok.
Johannes Kuhn

Yanıtlar:


14

C, 60 karakter

"Anahtar kelime yok" sınırlaması burada önemli değil. Eminim, iyileştirmenin anahtar kelimeler ekleyerek yapılmayacağından eminim.

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

Alternatif sürüm:
Çıktı o kadar hoş değil, ama printfkötüye kullanımı seviyorum .

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

Her iki çözümdeki hile, iki döngüyü (özyineleme ile uygulanan) bir araya getirmektir.
nbir sonraki potansiyel asal, bir msonraki potansiyel bölen.
Her yinelemeli çağrıda, ya n( mönceki değerine ayarlanırken) artar ya da azalırız m.


7

Python, 108 karakter

Bu meydan okuma için Python yapılmadı. İster printmisin? Bu ayrılmış. Peki, kullanmaya ne dersin stdout? That'sey, bunun bedeli import... ... tahmin ettin, ayrýldý. Şey ... Ben unix üzerinde, bu yüzden stdout olur dosya tanımlayıcı 1 açabilirim. Hile!

İnsan ve yineleme? Hiçbir şey ama eval. Döngü yok elbette, defveya ile bir işlev bile tanımlayamayız lambda. Ve yaralanmaya hakaret eklemek için liste kavrayışını bile kullanamayız! Her zaman map(p.__mod__,...)kod golf gibi şeyleri kullanmak için bir bahane ararım ... anlama her zaman daha iyidir. Şimdiye kadar, bu.

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

Şimdi, şikayet olabilir exec(ben bile değil mi anahtar kelime kullanmak olmamasına rağmen, bir anahtar kelimedir evalbir exec). İşte kullanmayan 117 karakterlik bir çözüm '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
print Python3'te ayrılmış değil :) kullanabilirsiniz __import__, ancak bu karakterlere mal olacak
gnibbler

6

JavaScript (80 karakter)

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

Web tarayıcınızın konsolunda çalıştırın.

Çok yoğun olduğu ortaya çıkan bir ana elek kullanıldı.


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

İşte hızlı bir ilk deneme. Bunun gereksinimleri karşılaması gerektiğine inanıyorum. Asalları bulmak için basit deneme bölümü kullanıyorum ve yeterince bulana kadar ön işlemciyi kullanarak ön işlemciyi kullanarak oluşturulmuş bir açılmamış döngü. Tekrar sayısı, tam olarak 128 asal basılacak şekilde değiştirildi.


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

(Daha işlevsel bir tarzda yazmaya çalıştım, ama returnbu planı bir türlü kullanamadım .)


3

C, 134 karakter

İşte kelimeleri mümkün olduğunca ayrılmış, ayrılmış veya başka bir şekilde kullanmaktan kaçınmaya çalışan alternatif bir çözüm:

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

Tek kullandığı printfve maintek bir argümanla.


3

Mathematica 50 karakter

Mathematica için "ayrılmış kelimeler" nasıl yorumlanacağından emin değilim ama oynamak istiyorum, bu yüzden asal üretmek veya ilkeliğini test etmek için yerleşik işlevler olmadan yapmak anlamına geleceğim.

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

2

Haskell, 72 karakter

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

Kuşkusuz, Haskell'de anahtar kelimelerden kaçınmak çok zor değil.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.