Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- fun {MakeAsked N}
- Rows = {MakeTuple rows N} in
- for I in 1..N do
- Rows.I = {MakeTuple cols N}
- end
- Rows
- end
- fun {CheckAllAsked Asked N}
- NumAsked = {NewCell 0} in
- for I in 1..N do
- for J in 1..N do
- NumAsked := NumAsked + Asked.I.J
- end
- end
- @NumAsked == 8
- end
- fun {AskAllNeighbors X Y Alive Neighbors}
- {ForAll Neighbors proc {$ N}
- {Send N getAlive(From:pos(X Y) Alive)}
- end}
- end
- fun {MakeAgent X Y Alive Neighbors Map N}
- fun {Behavior Msg State}
- case Msg of getAlive(From:pos(X Y) FromAlive) then
- NewAskedAlive = State.askedAlive + FromAlive in
- State.asked.X.Y = true
- if {CheckAllAsked State.asked N} then NewAlive in
- if NewAskedAlive == 2 then NewAlive = State.alive
- elseif NewAskedAlive == 3 then NewAlive = 1
- else NewAlive = 0 end
- {AskAllNeighbors X Y NewAlive Neighbors}
- {AdjoinList State [alive:NewAlive asked:{MakeAsked} askedAlive:0]}
- else
- {AdjoinList State [askedAlive:NewAskedAlive]}
- end
- end
- end
- in
- {NewPortObject Behavior state(
- alive:Alive
- asked:{MakeAsked}
- askedAlive:0
- )}
- end
- fun {MakeMap N}
- Rows = {MakeTuple row N} in
- for I in 1..N do
- Rows.I = {MakeTuple col N}
- for J in 1..N do
- Neighbors = [
- % Left side
- Rows.(1+((I+N-1) mod N)).(1+((J+N-1) mod N))
- Rows.(1+((I+N-1) mod N)).J
- Rows.(1+((I+N-1) mod N)).(1+((J+1) mod N))
- % Top and bottom
- Rows.I.(1+((J+N-1) mod N))
- Rows.I.(1+((J+1) mod N))
- % Right side
- Rows.(1+((I+1) mod N)).(1+((J+N-1) mod N))
- Rows.(1+((I+1) mod N)).J
- Rows.(1+((I+1) mod N)).(1+((J+1) mod N))
- ]
- Alive = {OS.rand} mod 2
- in
- Rows.I.J = {MakeAgent I J Alive Neighbors Map N}
- {AskAllNeighbors I J Alive Neighbors}
- end
- end
- Rows
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement