Pi günü

4
auselen

Üçüncü ayın ondördü, Monte Carlo'dan selamlar...

python2 -c "
from random import random
l = lambda (a, b), c: (a + c, b + 1)
g = (1 if random()**2 + random()**2 <= 1 else 0 for i in range(10**6))
r, t = reduce(l, g, (0.0, 0))
print r / t * 4.0
"
Pi

Görüşler

1
FZ

A-aaa, Buffon! :)

1
auselen

tras olunca taniyamadim.

1
auselen

Genel sıkıntım, bu tarz basit programları bir satırda yazacak bir programlama dili bulamamış olmam. Herhangi bir öneriye açığım. Aynı şekilde birisi python ile daha düzgününü yazabiliyorsa, görmeyi çok isterim.

1
FZ

Valla her birkac senede bir ogrenmeye heves ettigim APL turevi dillerden biri care olabilir zira uzaktan bakinca asiri 'kompakt' gorunuyorlar. Misal:

2
tongucyumruk

Hmm, tek satir mi? Challenge accepted:

print (lambda (r, t): r / t * 4.0)((lambda random: reduce(lambda (a, b), c: (a + c, b + 1), (1 if random()**2 + random()**2 <= 1 else 0 for i in range(10**6)), (0.0, 0)))(__import__("random").random))

Daha duzgunu mu? Tabi ki hayir, ama saniyorum APL ile yazilmis olsa da benzer seviyede okunamaz olurdu.

1
tongucyumruk

Denemek isteyenler icin: https://repl.it/GW3m

1
auselen
from random import random; print 4 * sum(1.0 if random()**2 + random()**2 <= 1 else 0 for i in range(10**6)) / 10**6

10**6 yi tekrar etmeden, import kismi kaldirilsa tatmin olurdum, herhalde. "Running average" tarzi bir yöntem bekli de?

1
FZ

J kodu:

pi=: (0.25&* %~ +/@(1 >: [: +/&.:*: _1 2 p. 0 ?@$~ 2&,))"0

Komut satirindan denemek icin:

$ ijconsole
   pi=: (0.25&* %~ +/@(1 >: [: +/&.:*: _1 2 p. 0 ?@$~ 2&,))"0
   pi 1e6
3.14104
1
FZ

Octave kodu:

>> sum(rand(1,100000).^2+rand(1,100000).^2<1)/100000*4
ans =  3.1435
1
FZ

Biraz daha sadelestirirsek:

>> t=10000000;sum(rand(1,t).^2+rand(1,t).^2<1)/t*4
ans =  3.1415
1
auselen

araya noktali virgul koyunca, ya da komut satirindan bir seferde calistiramayinca pek tadi yok.

Moving average versiyonu. import olmasa bu yeterdi bana.

from random import random
print 4 * reduce(
    lambda a, (c, d): (a * (d - 1) + c) / d,
    ((1.0 if random()**2 + random()**2 <= 1 else 0, i) for i in range(1, 10**6)),
   0)
1
FZ

Komut satirindan calistirmakta bir sıkıntı yok Octave icin de, noktali virgulu de kaldiralim gitsin:

$  octave --eval "sum(rand(1,10^6).^2+rand(1,10^6).^2<1)/10^6*4"
ans =  3.1488
$
1
auselen

Şimdi de 10**6 yi azaltalım.

1
auselen

Vektör çarpımı ile olabilir belki.

1
FZ

Requirement: "Şimdi de 10**6 yi azaltalım."

Deliverable:

octave --eval 'feval(@(x) sum(eval(x) + eval(x) < 1), "rand(1,10^6).^2") / 10^6*4'
ans =  3.1421

Bu kadar "golf" yeter bugun icin. Herkese bol vektorel islemli gunler :)

1
onur

Python tek satırlıklarıyla pek güçlü bir dil değil, bu işin ehli elbette Perl. Farklı bir algoritma ve perl ile yazılmış bir Pi hesaplayıcı¹:

perl -e '()while(printf"%.16f\n",$,+=((-1/++$_/(($?||=1)*=($_-$_++)*-1)))*4)'

1
butch

Klavyenizden Pi sayısına piyano ile eşlik etmek için buraya.

Görüş belirtmek için giriş yapın...