Percolation/Mean cluster density: Difference between revisions

(Added Wren)
Line 871:
8192 0.065766
</pre>
 
=={{header|Nim}}==
{{trans|Go}}
<lang Nim>import random, sequtils, strformat
 
const
N = 15
T = 5
P = 0.5
NotClustered = 1
Cell2Char = " #abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
NRange = [4, 64, 256, 1024, 4096]
 
type Grid = seq[seq[int]]
 
 
proc newGrid(n: Positive; p: float): Grid =
result = newSeqWith(n, newSeq[int](n))
for row in result.mitems:
for cell in row.mitems:
if rand(1.0) < p: cell = 1
 
 
func walkMaze(grid: var Grid; m, n, idx: int) =
grid[n][m] = idx
if n < grid.high and grid[n + 1][m] == NotClustered:
grid.walkMaze(m, n + 1, idx)
if m < grid[0].high and grid[n][m + 1] == NotClustered:
grid.walkMaze(m + 1, n, idx)
if m > 0 and grid[n][m - 1] == NotClustered:
grid.walkMaze(m - 1, n, idx)
if n > 0 and grid[n - 1][m] == NotClustered:
grid.walkMaze(m, n - 1, idx)
 
 
func clusterCount(grid: var Grid): int =
var walkIndex = 1
for n, row in grid:
for m, cell in row:
if cell == NotClustered:
inc walkIndex
grid.walkMaze(m, n, walkIndex)
result = walkIndex - 1
 
 
 
proc clusterDensity(n: int; p: float): float =
var grid = newGrid(n, p)
result = grid.clusterCount() / (n * n)
 
 
proc print(grid: Grid) =
for n, row in grid:
stdout.write n mod 10, ") "
for cell in row:
stdout.write ' ', Cell2Char[cell]
stdout.write '\n'
 
 
when isMainModule:
 
randomize()
 
var grid = newGrid(N, 0.5)
echo &"Found {grid.clusterCount()} clusters in this {N} by {N} grid\n"
grid.print()
echo ""
 
for n in NRange:
var sum = 0.0
for _ in 1..T:
sum += clusterDensity(n, P)
let sim = sum / T
echo &"t = {T} p = {P:4.2f} n = {n:4} sim = {sim:7.5f}"</lang>
 
{{out}}
<pre>Found 22 clusters in this 15 by 15 grid
 
0) a b c d e f g h i
1) a a a a a a a a g
2) a a a a a j
3) a a a a a a a k
4) a a a a a a a l
5) a a a a a m
6) a a a a a a a a n o
7) a a a a a a a
8) a a a a p q r s
9) a a a a a a a a p p p p
0) a a a a a t p p
1) a a a a a p p
2) a p p p p p
3) a a a p p p p p
4) u a a p p p p p p v
 
t = 5 p = 0.50 n = 4 sim = 0.16250
t = 5 p = 0.50 n = 64 sim = 0.10308
t = 5 p = 0.50 n = 256 sim = 0.09183
t = 5 p = 0.50 n = 1024 sim = 0.09053
t = 5 p = 0.50 n = 4096 sim = 0.08995</pre>
 
=={{header|Perl}}==
Anonymous user