Sync
This commit is contained in:
parent
6f050a029e
commit
776bba907c
3887 changed files with 59894 additions and 7280 deletions
|
|
@ -1,6 +1,7 @@
|
|||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <time.h> // For time
|
||||
|
||||
enum { empty = 0, tree = 1, fire = 2 };
|
||||
const char *disp[] = {" ", "\033[32m/\\\033[m", "\033[07;31m/\\\033[m"};
|
||||
|
|
@ -17,7 +18,7 @@ void evolve(int w, int h)
|
|||
|
||||
show: printf("\033[H");
|
||||
for_y {
|
||||
for_x printf(disp[univ[y][x]]);
|
||||
for_x printf("%s",disp[univ[y][x]]);
|
||||
printf("\033[E");
|
||||
}
|
||||
fflush(stdout);
|
||||
|
|
|
|||
168
Task/Forest-fire/COBOL/forest-fire.cobol
Normal file
168
Task/Forest-fire/COBOL/forest-fire.cobol
Normal file
|
|
@ -0,0 +1,168 @@
|
|||
IDENTIFICATION DIVISION.
|
||||
PROGRAM-ID. forest-fire.
|
||||
|
||||
DATA DIVISION.
|
||||
WORKING-STORAGE SECTION.
|
||||
*> Probability represents a fraction of 10000.
|
||||
*> For instance, IGNITE-PROB means a tree has a 1 in 10000 chance
|
||||
*> of igniting.
|
||||
78 IGNITE-PROB VALUE 1.
|
||||
78 NEW-TREE-PROB VALUE 100.
|
||||
|
||||
78 EMPTY-PROB VALUE 3333.
|
||||
|
||||
78 AREA-SIZE VALUE 40.
|
||||
|
||||
01 sim-table.
|
||||
03 sim-row OCCURS AREA-SIZE TIMES INDEXED BY row-index.
|
||||
05 sim-area OCCURS AREA-SIZE TIMES
|
||||
INDEXED BY col-index.
|
||||
07 current-status PIC 9.
|
||||
*> The flags correspond to the colours they will
|
||||
*> be displayed as.
|
||||
88 empty VALUE 0. *> Black
|
||||
88 tree VALUE 2. *> Green
|
||||
88 burning VALUE 4. *> Red
|
||||
|
||||
07 next-status PIC 9.
|
||||
88 empty VALUE 0.
|
||||
88 tree VALUE 2.
|
||||
88 burning VALUE 4.
|
||||
|
||||
01 rand-num PIC 9999.
|
||||
|
||||
01 next-row PIC 9(4).
|
||||
01 next-col PIC 9(4).
|
||||
|
||||
01 neighbours-row PIC 9(4).
|
||||
01 neighbours-col PIC 9(4).
|
||||
|
||||
PROCEDURE DIVISION.
|
||||
main-line.
|
||||
*> Seed RANDOM with current time.
|
||||
MOVE FUNCTION RANDOM(FUNCTION CURRENT-DATE (9:8)) TO rand-num
|
||||
|
||||
PERFORM initialise-table
|
||||
PERFORM FOREVER
|
||||
PERFORM show-simulation
|
||||
PERFORM step-simulation
|
||||
END-PERFORM
|
||||
|
||||
GOBACK
|
||||
.
|
||||
|
||||
initialise-table.
|
||||
PERFORM VARYING row-index FROM 1 BY 1
|
||||
UNTIL AREA-SIZE < row-index
|
||||
AFTER col-index FROM 1 BY 1
|
||||
UNTIL AREA-SIZE < col-index
|
||||
PERFORM get-rand-num
|
||||
IF rand-num <= EMPTY-PROB
|
||||
SET empty OF current-status (row-index, col-index)
|
||||
TO TRUE
|
||||
SET empty OF next-status (row-index, col-index)
|
||||
TO TRUE
|
||||
ELSE
|
||||
SET tree OF current-status (row-index, col-index)
|
||||
TO TRUE
|
||||
SET tree OF next-status (row-index, col-index)
|
||||
TO TRUE
|
||||
END-IF
|
||||
END-PERFORM
|
||||
.
|
||||
|
||||
show-simulation.
|
||||
PERFORM VARYING row-index FROM 1 BY 1
|
||||
UNTIL AREA-SIZE < row-index
|
||||
AFTER col-index FROM 1 BY 1
|
||||
UNTIL AREA-SIZE < col-index
|
||||
DISPLAY SPACE AT LINE row-index COLUMN col-index
|
||||
WITH BACKGROUND-COLOR
|
||||
current-status (row-index, col-index)
|
||||
END-PERFORM
|
||||
.
|
||||
|
||||
*> Updates the simulation.
|
||||
step-simulation.
|
||||
PERFORM VARYING row-index FROM 1 BY 1
|
||||
UNTIL AREA-SIZE < row-index
|
||||
AFTER col-index FROM 1 BY 1
|
||||
UNTIL AREA-SIZE < col-index
|
||||
EVALUATE TRUE
|
||||
WHEN empty OF current-status (row-index, col-index)
|
||||
PERFORM get-rand-num
|
||||
IF rand-num <= NEW-TREE-PROB
|
||||
SET tree OF next-status
|
||||
(row-index, col-index) TO TRUE
|
||||
END-IF
|
||||
|
||||
WHEN tree OF current-status (row-index, col-index)
|
||||
PERFORM simulate-tree
|
||||
|
||||
WHEN burning OF current-status
|
||||
(row-index, col-index)
|
||||
SET empty OF next-status (row-index, col-index)
|
||||
TO TRUE
|
||||
END-EVALUATE
|
||||
END-PERFORM
|
||||
|
||||
PERFORM update-statuses.
|
||||
.
|
||||
|
||||
*> Updates a tree tile, assuming row-index and col-index are at
|
||||
*> a tree area.
|
||||
simulate-tree.
|
||||
*> Find the row and column of the bottom-right neighbour.
|
||||
COMPUTE next-row = FUNCTION MIN(row-index + 1, AREA-SIZE)
|
||||
COMPUTE next-col = FUNCTION MIN(col-index + 1, AREA-SIZE)
|
||||
|
||||
COMPUTE neighbours-row = FUNCTION MAX(row-index - 1, 1)
|
||||
COMPUTE neighbours-col = FUNCTION MAX(col-index - 1, 1)
|
||||
|
||||
*> If a neighbour is burning, catch fire.
|
||||
PERFORM VARYING neighbours-row FROM neighbours-row BY 1
|
||||
UNTIL next-row < neighbours-row
|
||||
*> Check if neighbours in a row are on fire.
|
||||
PERFORM VARYING neighbours-col FROM neighbours-col BY 1
|
||||
UNTIL next-col < neighbours-col
|
||||
IF neighbours-row = row-index
|
||||
AND neighbours-col = col-index
|
||||
EXIT PERFORM CYCLE
|
||||
END-IF
|
||||
|
||||
IF burning OF current-status
|
||||
(neighbours-row, neighbours-col)
|
||||
SET burning OF next-status (row-index, col-index)
|
||||
TO TRUE
|
||||
EXIT PARAGRAPH
|
||||
END-IF
|
||||
END-PERFORM
|
||||
|
||||
*> Move neighbours-col back to starting position
|
||||
COMPUTE neighbours-col =
|
||||
FUNCTION MAX(neighbours-col - 3, 1)
|
||||
END-PERFORM
|
||||
|
||||
*> Otherwise, there is a random chance of
|
||||
*> catching fire.
|
||||
PERFORM get-rand-num
|
||||
IF rand-num <= IGNITE-PROB
|
||||
SET burning OF next-status (row-index, col-index) TO TRUE
|
||||
END-IF
|
||||
.
|
||||
|
||||
update-statuses.
|
||||
PERFORM VARYING row-index FROM 1 BY 1
|
||||
UNTIL AREA-SIZE < row-index
|
||||
AFTER col-index FROM 1 BY 1
|
||||
UNTIL AREA-SIZE < col-index
|
||||
MOVE next-status (row-index, col-index)
|
||||
TO current-status (row-index, col-index)
|
||||
END-PERFORM
|
||||
.
|
||||
|
||||
*> Puts a random value between 0 and 9999 in rand-num.
|
||||
get-rand-num.
|
||||
COMPUTE rand-num =
|
||||
FUNCTION MOD(FUNCTION RANDOM * 100000, 10000)
|
||||
.
|
||||
|
|
@ -1,14 +1,13 @@
|
|||
import std.stdio, std.random, std.string, std.algorithm, simpledisplay;
|
||||
import std.stdio, std.random, std.algorithm, std.typetuple,
|
||||
simpledisplay;
|
||||
|
||||
enum double TREE_PROB = 0.55; // original tree probability
|
||||
enum double F_PROB = 0.01; // auto combustion probability
|
||||
enum double P_PROB = 0.01; // tree creation probability
|
||||
enum double TREE_PROB = 0.55; // Original tree probability.
|
||||
enum double F_PROB = 0.01; // Auto combustion probability.
|
||||
enum double P_PROB = 0.01; // Tree creation probability.
|
||||
enum worldSide = 600;
|
||||
|
||||
template TypeTuple(T...) { alias T TypeTuple; }
|
||||
alias TypeTuple!(-1, 0, 1) sp;
|
||||
|
||||
enum Cell : char { empty=' ', tree='T', burning='#' }
|
||||
alias Cell[][] World;
|
||||
enum Cell : ubyte { empty, tree, burning }
|
||||
alias World = Cell[worldSide][];
|
||||
|
||||
immutable white = Color(255, 255, 255),
|
||||
red = Color(255, 0, 0),
|
||||
|
|
@ -16,37 +15,37 @@ immutable white = Color(255, 255, 255),
|
|||
|
||||
void nextState(ref World world, ref World nextWorld,
|
||||
ref Xorshift rnd, Image img) {
|
||||
enum double div = cast(double)typeof(rnd.front()).max;
|
||||
enum double div = typeof(rnd.front).max;
|
||||
immutable nr = world.length;
|
||||
immutable nc = world[0].length;
|
||||
foreach (r, row; world)
|
||||
foreach (c, elem; row)
|
||||
final switch (elem) {
|
||||
case Cell.empty:
|
||||
foreach (immutable r, const row; world)
|
||||
foreach (immutable c, immutable elem; row)
|
||||
START: final switch (elem) with (Cell) {
|
||||
case empty:
|
||||
img.putPixel(c, r, white);
|
||||
nextWorld[r][c] = (rnd.front()/div)<P_PROB ? Cell.tree : Cell.empty;
|
||||
rnd.popFront();
|
||||
nextWorld[r][c] = (rnd.front / div) < P_PROB ? tree : empty;
|
||||
rnd.popFront;
|
||||
break;
|
||||
|
||||
case Cell.tree:
|
||||
case tree:
|
||||
img.putPixel(c, r, green);
|
||||
|
||||
foreach (rowShift; sp)
|
||||
foreach (colShift; sp)
|
||||
foreach (immutable rowShift; TypeTuple!(-1, 0, 1))
|
||||
foreach (immutable colShift; TypeTuple!(-1, 0, 1))
|
||||
if ((r + rowShift) >= 0 && (r + rowShift) < nr &&
|
||||
(c + colShift) >= 0 && (c + colShift) < nc &&
|
||||
world[r + rowShift][c + colShift] == Cell.burning) {
|
||||
nextWorld[r][c] = Cell.burning;
|
||||
goto END;
|
||||
break START;
|
||||
}
|
||||
|
||||
nextWorld[r][c]=(rnd.front()/div)<F_PROB ? Cell.burning : Cell.tree;
|
||||
rnd.popFront();
|
||||
END: break;
|
||||
nextWorld[r][c]= (rnd.front / div) < F_PROB ? burning : tree;
|
||||
rnd.popFront;
|
||||
break;
|
||||
|
||||
case Cell.burning:
|
||||
case burning:
|
||||
img.putPixel(c, r, red);
|
||||
nextWorld[r][c] = Cell.empty;
|
||||
nextWorld[r][c] = empty;
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
@ -55,17 +54,17 @@ void nextState(ref World world, ref World nextWorld,
|
|||
|
||||
void main() {
|
||||
auto rnd = Xorshift(1);
|
||||
auto world = new World(600, 600); // create world
|
||||
foreach (row; world)
|
||||
auto world = new World(worldSide);
|
||||
foreach (ref row; world)
|
||||
foreach (ref el; row)
|
||||
el = uniform(0.0, 1.0, rnd) < TREE_PROB ? Cell.tree : Cell.empty;
|
||||
auto nextWorld = new World(world.length, world[0].length);
|
||||
auto nextWorld = new World(world[0].length);
|
||||
|
||||
auto w= new SimpleWindow(world.length,world[0].length,"ForestFire");
|
||||
auto img = new Image(w.width, w.height);
|
||||
|
||||
w.eventLoop(1, {
|
||||
auto painter = w.draw();
|
||||
auto painter = w.draw;
|
||||
nextState(world, nextWorld, rnd, img);
|
||||
painter.drawImage(Point(0, 0), img);
|
||||
});
|
||||
|
|
|
|||
77
Task/Forest-fire/D/forest-fire-3.d
Normal file
77
Task/Forest-fire/D/forest-fire-3.d
Normal file
|
|
@ -0,0 +1,77 @@
|
|||
#chance of empty->tree
|
||||
set :p 0.004
|
||||
#chance of spontaneous tree combustion
|
||||
set :f 0.001
|
||||
#chance of tree in initial state
|
||||
set :s 0.5
|
||||
#height of world
|
||||
set :H 10
|
||||
#width of world
|
||||
set :W 20
|
||||
|
||||
has-burning-neigbour state pos:
|
||||
for i range -- swap ++ dup &< pos:
|
||||
for j range -- swap ++ dup &> pos:
|
||||
& i j
|
||||
try:
|
||||
state!
|
||||
catch value-error:
|
||||
:empty
|
||||
if = :burning:
|
||||
return true
|
||||
false
|
||||
|
||||
evolve state pos:
|
||||
state! pos
|
||||
if = :tree dup:
|
||||
if has-burning-neigbour state pos:
|
||||
:burning drop
|
||||
elseif chance f:
|
||||
:burning drop
|
||||
elseif = :burning:
|
||||
:empty
|
||||
else:
|
||||
if chance p:
|
||||
:tree
|
||||
else:
|
||||
:empty
|
||||
|
||||
step state:
|
||||
local :next {}
|
||||
for k in keys state:
|
||||
set-to next k evolve state k
|
||||
next
|
||||
|
||||
local :(c) { :tree "T" :burning "B" :empty "." }
|
||||
print-state state:
|
||||
for j range 0 H:
|
||||
for i range 0 W:
|
||||
print\ (c)! state! & i j
|
||||
print ""
|
||||
|
||||
init-state:
|
||||
local :first {}
|
||||
for j range 0 H:
|
||||
for i range 0 W:
|
||||
if chance s:
|
||||
:tree
|
||||
else:
|
||||
:empty
|
||||
set-to first & i j
|
||||
first
|
||||
|
||||
run:
|
||||
init-state
|
||||
while true:
|
||||
print-state dup
|
||||
print ""
|
||||
step
|
||||
|
||||
run-slowly:
|
||||
init-state
|
||||
while true:
|
||||
print-state dup
|
||||
drop input
|
||||
step
|
||||
|
||||
run
|
||||
72
Task/Forest-fire/Erlang/forest-fire.erl
Normal file
72
Task/Forest-fire/Erlang/forest-fire.erl
Normal file
|
|
@ -0,0 +1,72 @@
|
|||
-module( forest_fire ).
|
||||
|
||||
-export( [task/0] ).
|
||||
|
||||
-record( state, {neighbours=[], position, probability_burn, probability_grow, tree} ).
|
||||
|
||||
task() ->
|
||||
erlang:spawn( fun() ->
|
||||
Pid_positions = forest_create( 5, 5, 0.5, 0.3, 0.2 ),
|
||||
Pids = [X || {X, _} <- Pid_positions],
|
||||
[X ! {tree_pid_positions, Pid_positions} || X <- Pids],
|
||||
Start = forest_status( Pids ),
|
||||
Histories = [Start | [forest_step( Pids ) || _X <- lists:seq(1, 2)]],
|
||||
[io:fwrite("~p~n~n", [X]) || X <- Histories]
|
||||
end ).
|
||||
|
||||
|
||||
|
||||
forest_create( X_max, Y_max, Init, Grow, Burn ) ->
|
||||
[{tree_create(tree_init(Init, random:uniform()), X, Y, Grow, Burn), {X,Y}} || X <- lists:seq(1, X_max), Y<- lists:seq(1, Y_ma\
|
||||
x)].
|
||||
|
||||
forest_status( Pids ) ->
|
||||
[X ! {status_request, erlang:self()} || X <- Pids],
|
||||
[receive {status, Tree, Position, X} -> {Tree, Position} end || X <- Pids].
|
||||
|
||||
forest_step( Pids ) ->
|
||||
[X ! {step} || X <- Pids],
|
||||
forest_status( Pids ).
|
||||
|
||||
is_neighbour({X, Y}, {X, Y} ) -> false; % Myself
|
||||
is_neighbour({Xn, Yn}, {X, Y} ) when abs(Xn - X) =< 1, abs(Yn - Y) =< 1 -> true;
|
||||
is_neighbour( _Position_neighbour, _Position ) -> false.
|
||||
|
||||
loop( State ) ->
|
||||
receive
|
||||
{tree_pid_positions, Pid_positions} ->
|
||||
loop( loop_neighbour(Pid_positions, State) );
|
||||
{step} ->
|
||||
[X ! {tree, State#state.tree, erlang:self()} || X <- State#state.neighbours],
|
||||
loop( loop_step(State) );
|
||||
{status_request, Pid} ->
|
||||
Pid ! {status, State#state.tree, State#state.position, erlang:self()},
|
||||
loop( State )
|
||||
end.
|
||||
|
||||
loop_neighbour( Pid_positions, State ) ->
|
||||
My_position = State#state.position,
|
||||
State#state{neighbours=[Pid || {Pid, Position} <- Pid_positions, is_neighbour( Position, My_position)]}.
|
||||
|
||||
loop_step( State ) ->
|
||||
Is_burning = lists:any( fun loop_step_burning/1, [loop_step_receive(X) || X <- State#state.neighbours] ),
|
||||
Tree = loop_step_next( Is_burning, random:uniform(), State ),
|
||||
State#state{tree=Tree}.
|
||||
|
||||
loop_step_burning( Tree ) -> Tree =:= burning.
|
||||
|
||||
loop_step_next( _Is_burning, Probablility, #state{tree=empty, probability_grow=Grow} ) when Grow > Probablility -> tree;
|
||||
loop_step_next( _Is_burning, _Probablility, #state{tree=empty} ) -> empty;
|
||||
loop_step_next( _Is_burning, _Probablility, #state{tree=burning} ) -> empty;
|
||||
loop_step_next( true, _Probablility, #state{tree=tree} ) -> burning;
|
||||
loop_step_next( false, Probablility, #state{tree=tree, probability_burn=Burn} ) when Burn > Probablility -> burning;
|
||||
loop_step_next( false, _Probablility, #state{tree=tree} ) -> tree.
|
||||
|
||||
loop_step_receive( Pid ) -> receive {tree, Tree, Pid} -> Tree end.
|
||||
|
||||
tree_create( Tree, X, Y, Grow, Burn ) ->
|
||||
State = #state{position={X, Y}, probability_burn=Burn, probability_grow=Grow, tree=Tree},
|
||||
erlang:spawn_link( fun() -> random:seed( X, Y, 0 ), loop( State ) end ).
|
||||
|
||||
tree_init( Tree_probalility, Random ) when Tree_probalility > Random -> tree;
|
||||
tree_init( _Tree_probalility, _Random ) -> empty.
|
||||
29
Task/Forest-fire/MATLAB/forest-fire.m
Normal file
29
Task/Forest-fire/MATLAB/forest-fire.m
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
function forest_fire(f,p,N,M)
|
||||
% Forest fire
|
||||
if nargin<4;
|
||||
M=200;
|
||||
end
|
||||
if nargin<3;
|
||||
N=200;
|
||||
end
|
||||
if nargin<2;
|
||||
p=.03;
|
||||
end
|
||||
if nargin<1;
|
||||
f=p*.0001;
|
||||
end
|
||||
|
||||
% initialize;
|
||||
F = (rand(M,N) < p)+1; % tree with probability p
|
||||
S = ones(3); S(2,2)=0; % surrounding
|
||||
|
||||
textmap = ' T#';
|
||||
colormap([.5,.5,.5;0,1,0;1,0,0]);
|
||||
while(1)
|
||||
image(F); pause(.1) % uncomment for graphical output
|
||||
% disp(textmap(F)); pause; % uncomment for textual output
|
||||
G = ((F==1).*((rand(M,N)<p)+1)); % grow tree
|
||||
G = G + (F==2) .* ((filter2(S,F==3)>0) + (rand(M,N)<f) + 2); % burn tree if neighbor is burning or by chance f
|
||||
G = G + (F==3); % empty after burn
|
||||
F = G;
|
||||
end;
|
||||
75
Task/Forest-fire/Vedit-macro-language/forest-fire.vedit
Normal file
75
Task/Forest-fire/Vedit-macro-language/forest-fire.vedit
Normal file
|
|
@ -0,0 +1,75 @@
|
|||
#1 = 25 // height of the grid
|
||||
#2 = 60 // width of the grid
|
||||
#3 = 2 // probability of random fire, per 1000
|
||||
#4 = 40 // probability of new tree, per 1000
|
||||
|
||||
#5 = #2+2+Newline_Chars // total length of a line
|
||||
#90 = Time_Tick // seed for random number generator
|
||||
#91 = 1000 // get random numbers in range 0 to 999
|
||||
|
||||
// Fill the grid and draw border
|
||||
Buf_Switch(Buf_Free)
|
||||
Ins_Char('-', COUNT, #2+2)
|
||||
Ins_Newline
|
||||
for (#11=0; #11<#1; #11++) {
|
||||
Ins_Char('|')
|
||||
for (#12=0; #12<#2; #12++) {
|
||||
Call("RANDOM")
|
||||
if (Return_Value < 500) { // 50% propability for a tree
|
||||
Ins_Char('♠')
|
||||
} else {
|
||||
Ins_Char(' ')
|
||||
}
|
||||
}
|
||||
Ins_Char('|')
|
||||
Ins_Newline
|
||||
}
|
||||
Ins_Char('-', COUNT, #2+2)
|
||||
|
||||
#8=1
|
||||
Repeat(10) {
|
||||
BOF
|
||||
Update()
|
||||
// calculate one generation
|
||||
for (#11=1; #11<#1+2; #11++) {
|
||||
Goto_Line(#11)
|
||||
for (#12=1; #12<#2+2; #12++) {
|
||||
Goto_Col(#12)
|
||||
#14=Cur_Pos
|
||||
Call("RANDOM")
|
||||
#10 = Return_Value
|
||||
if (Cur_Char == '♠') { // tree?
|
||||
if (#10 < #3) {
|
||||
Ins_Char('*', OVERWRITE) // random combustion
|
||||
} else {
|
||||
if (Search_Block("░", CP-#5-1, CP+#5+2, COLUMN+BEGIN+NOERR)) {
|
||||
Goto_Pos(#14)
|
||||
Ins_Char('*', OVERWRITE) // combustion
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (Cur_Char == ' ') { // empty space?
|
||||
if (#10 < #4) {
|
||||
Ins_Char('+', OVERWRITE) // new tree
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// convert tmp symbols
|
||||
Replace("░"," ", BEGIN+ALL+NOERR) // old fire goes out
|
||||
Replace("*","░", BEGIN+ALL+NOERR) // new fire
|
||||
Replace("+","♠", BEGIN+ALL+NOERR) // new tree
|
||||
}
|
||||
Return
|
||||
|
||||
//--------------------------------------------------------------
|
||||
// Generate random numbers in range 0 <= Return_Value < #91
|
||||
// #90 = Seed (0 to 0x7fffffff)
|
||||
// #91 = Scaling (0 to 0xffff)
|
||||
|
||||
:RANDOM:
|
||||
#92 = 0x7fffffff / 48271
|
||||
#93 = 0x7fffffff % 48271
|
||||
#90 = (48271 * (#90 % #92) - #93 * (#90 / #92)) & 0x7fffffff
|
||||
return ((#90 & 0xffff) * #91 / 0x10000)
|
||||
Loading…
Add table
Add a link
Reference in a new issue