RosettaCodeData/Task/Percolation-Site-percolation/Phix/percolation-site-percolation.phix
2019-09-12 10:33:56 -07:00

47 lines
1.1 KiB
Text

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()