Percolation/Site percolation: Difference between revisions

(Added Kotlin)
Line 1,299:
p = 0.9: 1.000
p = 1.0: 1.000
</pre>
 
=={{header|Phix}}==
{{trans|C}}
<lang Phix>string grid
integer m, n, last, lastrow
 
enum SOLID = '#', EMPTY=' ', WET = 'v'
procedure make_grid(integer x, y, atom p)
m = x
n = y
grid = repeat('\n',x*(y+1)+1)
last = length(grid)
lastrow = last-n
for i=0 to x-1 do
for j=1 to y do
grid[1+i*(y+1)+j] = iff(rnd()<p?EMPTY:SOLID)
end for
end for
end procedure
 
function ff(integer i) -- flood_fill
if i<=0 or i>=last or grid[i]!=EMPTY then return 0 end if
grid[i] = WET
return i>=lastrow or ff(i+m+1) or ff(i+1) or ff(i-1) or ff(i-m-1)
end function
function percolate()
for i=2 to m+1 do
if ff(i) then return true end if
end for
return false
end function
procedure main()
make_grid(15,15,0.55)
{} = percolate()
printf(1,"%dx%d grid:%s",{15,15,grid})
puts(1,"\nrunning 10,000 tests for each case:\n")
for ip=0 to 10 do
atom p = ip/10
integer count = 0
for i=1 to 10000 do
make_grid(15, 15, p)
count += percolate()
end for
printf(1,"p=%.1f: %6.4f\n", {p, count/10000})
end for
end procedure
main()</lang>
{{out}}
<pre>
15x15 grid:
#v###vvv###vv#
##vvv##v# #v #
#vvvvvv# v #
##vvv#vv# ##vv#
#vv##### # #vv
### # ### ###v
# ##### ##vv
### # # #vvvv
### #### ##vvv
## ## vvvvvv
# #v##vvv
## #vv# ##v
# v######
v
##### v#### #
 
running 10,000 tests for each case:
p=0.0: 0.0000
p=0.1: 0.0000
p=0.2: 0.0000
p=0.3: 0.0000
p=0.4: 0.0035
p=0.5: 0.0933
p=0.6: 0.5601
p=0.7: 0.9561
p=0.8: 0.9997
p=0.9: 1.0000
p=1.0: 1.0000
</pre>
 
7,818

edits