Percolation/Mean cluster density: Difference between revisions
Content added Content deleted
Thundergnat (talk | contribs) m (Fix Perl 6 -> Raku links) |
(Added Wren) |
||
Line 1,468: | Line 1,468: | ||
n=1080, K(p)=0.0661267146776406 |
n=1080, K(p)=0.0661267146776406 |
||
n=6480, K(p)=0.06582889898643499 |
n=6480, K(p)=0.06582889898643499 |
||
</pre> |
|||
=={{header|Wren}}== |
|||
{{trans|Kotlin}} |
|||
{{libheader|Wren-fmt}} |
|||
<lang ecmascript>import "random" for Random |
|||
import "/fmt" for Fmt |
|||
var rand = Random.new() |
|||
var RAND_MAX = 32767 |
|||
var list = [] |
|||
var w = 0 |
|||
var ww = 0 |
|||
var ALPHA = "+.ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" |
|||
var ALEN = ALPHA.count - 3 |
|||
var makeList = Fn.new { |p| |
|||
var thresh = (p * RAND_MAX).truncate |
|||
ww = w * w |
|||
var i = ww |
|||
list = List.filled(i, 0) |
|||
while (i != 0) { |
|||
i = i - 1 |
|||
var r = rand.int(RAND_MAX+1) |
|||
if (r < thresh) list[i] = -1 |
|||
} |
|||
} |
|||
var showCluster = Fn.new { |
|||
var k = 0 |
|||
for (i in 0...w) { |
|||
for (j in 0...w) { |
|||
var s = list[k] |
|||
k = k + 1 |
|||
var c = (s < ALEN) ? ALPHA[1 + s] : "?" |
|||
System.write(" %(c)") |
|||
} |
|||
System.print() |
|||
} |
|||
} |
|||
var recur // recursive |
|||
recur = Fn.new { |x, v| |
|||
if (x >= 0 && x < ww && list[x] == -1) { |
|||
list[x] = v |
|||
recur.call(x - w, v) |
|||
recur.call(x - 1, v) |
|||
recur.call(x + 1, v) |
|||
recur.call(x + w, v) |
|||
} |
|||
} |
|||
var countClusters = Fn.new { |
|||
var cls = 0 |
|||
for (i in 0...ww) { |
|||
if (list[i] == -1) { |
|||
cls = cls + 1 |
|||
recur.call(i, cls) |
|||
} |
|||
} |
|||
return cls |
|||
} |
|||
var tests = Fn.new { |n, p| |
|||
var k = 0 |
|||
for (i in 0...n) { |
|||
makeList.call(p) |
|||
k = k + countClusters.call() / ww |
|||
} |
|||
return k / n |
|||
} |
|||
w = 15 |
|||
makeList.call(0.5) |
|||
var cls = countClusters.call() |
|||
System.print("width = 15, p = 0.5, %(cls) clusters:") |
|||
showCluster.call() |
|||
System.print("\np = 0.5, iter = 5:") |
|||
w = 1 << 2 |
|||
while (w <= (1 << 13)) { |
|||
var t = tests.call(5, 0.5) |
|||
Fmt.print("$5d $9.6f", w, t) |
|||
w = w << 1 |
|||
}</lang> |
|||
{{out}} |
|||
Sample run: |
|||
<pre> |
|||
width = 15, p = 0.5, 28 clusters: |
|||
. A A . . B . C . D . . . . A |
|||
A A A . E . F . G . . A A A A |
|||
. A A A . F F . . . A A . . . |
|||
. A . . . . F . . H . A . A . |
|||
. A A . . . . . H H H . A A A |
|||
A A A . . I I . . H . J . . A |
|||
A . . K . . . . H H . . . A A |
|||
A . L . M M . N . . O . . . . |
|||
A A . P . . . N . Q . R . S . |
|||
. A A . T T . . U . R R R . . |
|||
A A . . T T T . . . . R . . . |
|||
. A . T T T . . . . . R R R R |
|||
. A . . . T . . V . W . R R . |
|||
A A . X . T T . . . W . . . . |
|||
. . Y . T T . Z . a . . . b b |
|||
p = 0.5, iter = 5: |
|||
4 0.125000 |
|||
8 0.081250 |
|||
16 0.094531 |
|||
32 0.073242 |
|||
64 0.067920 |
|||
128 0.068567 |
|||
256 0.067404 |
|||
512 0.066401 |
|||
1024 0.065870 |
|||
2048 0.065885 |
|||
4096 0.065812 |
|||
8192 0.065795 |
|||
</pre> |
</pre> |
||