--~ A reverse ipairs. Taken from http://l...content-available-to-author-only...s.org/wiki/IteratorsTutorial ~--
--[[parameters
t: the table to iterate over
returns
iterator function, the table and the index]]
function ripairs(t)
local function ripairs_it(t,i)
i=i-1
local v=t[i]
if v==nil then return v end
return i,v
end
return ripairs_it, t, #t+1
end
--~ Seed the random numbers ~--
math.randomseed(os.time())
math.random()math.random()math.random()
--~ Parameters ~--
local width = 50 --~ Width of the map ~--
local height = 50 --~ Height of the map ~--
local border = 2 --~ Width around the border of the map. At least 2 ~--
local kill_no = 6 --~ Minimum number of empty cells for a miner to die ~--
local spawn_prob = 0.6 --~ Chance for a miner to spawn a clone per frame ~--
local cell_kill_no = 6 --~ Minimum number of empty cells for that cell to be removed ~--
local map = {}
local miners = {}
local draw = {}
for x = 1, width do
map[x] = {}
for y = 1, height do
map[x][y] = true
end
end
table.insert(miners, {
x = math.random(border, width-border),
y = math.random(border, height-border)
})
--~ Main miner loop ~--
while #miners ~= 0 do
--~ Scan all the cells around the miner to check for empty ones --~
for i, miner in ripairs(miners) do
local empty = 0
for x = -1, 1 do
for y = -1, 1 do
if not map[miner.x+x][miner.y+y] or
(miner.x+x < border or miner.x+x > width-border) or
(miner.y+y < border or miner.y+y > height-border) then
empty = empty + 1
end
end
end
--~ If there are enough empty ones, remove the miner ~--
if empty >= kill_no then
table.remove(miners, i)
else
--~ Randomly spawn in another miner at this spot ~--
if math.random() <= spawn_prob then
table.insert(miners, {
x = miner.x,
y = miner.y
})
end
--~ Randomly move the miner, making sure it's not out of bounds ~--
local xDir, yDir = math.random(-1, 1), math.random(-1, 1)
if (miner.x+xDir >= border and miner.x+xDir <= width-border) and (miner.y+yDir >= border and miner.y+yDir <= height-border) then
miner.x = miner.x + xDir
miner.y = miner.y + yDir
end
--~ Remove the cell the miner is on ~--
if map[miner.x][miner.y] then
map[miner.x][miner.y] = false
end
end
end
end
--~ Display it as an ascii map ~--
output = ""
for x = 1, width do
output = output .. "\n"
for y = 1, height do
if map[x][y] then
output = output .. "#"
else
output = output .. " "
end
end
end
print(output)
LS1+IEEgcmV2ZXJzZSBpcGFpcnMuIFRha2VuIGZyb20gaHR0cDovL2wuLi5jb250ZW50LWF2YWlsYWJsZS10by1hdXRob3Itb25seS4uLnMub3JnL3dpa2kvSXRlcmF0b3JzVHV0b3JpYWwgfi0tCgktLVtbcGFyYW1ldGVycwoJCQl0OiB0aGUgdGFibGUgdG8gaXRlcmF0ZSBvdmVyCgkJcmV0dXJucwoJCQlpdGVyYXRvciBmdW5jdGlvbiwgdGhlIHRhYmxlIGFuZCB0aGUgaW5kZXhdXQoJZnVuY3Rpb24gcmlwYWlycyh0KQoJICBsb2NhbCBmdW5jdGlvbiByaXBhaXJzX2l0KHQsaSkKCQlpPWktMQoJCWxvY2FsIHY9dFtpXQoJCWlmIHY9PW5pbCB0aGVuIHJldHVybiB2IGVuZAoJCXJldHVybiBpLHYKCSAgZW5kCgkgIHJldHVybiByaXBhaXJzX2l0LCB0LCAjdCsxCgllbmQKCgktLX4gU2VlZCB0aGUgcmFuZG9tIG51bWJlcnMgfi0tCgltYXRoLnJhbmRvbXNlZWQob3MudGltZSgpKQoJbWF0aC5yYW5kb20oKW1hdGgucmFuZG9tKCltYXRoLnJhbmRvbSgpCgoJLS1+IFBhcmFtZXRlcnMgfi0tCglsb2NhbCB3aWR0aCA9IDUwIAkJLS1+IFdpZHRoIG9mIHRoZSBtYXAgfi0tCglsb2NhbCBoZWlnaHQgPSA1MAkJLS1+IEhlaWdodCBvZiB0aGUgbWFwIH4tLQoJbG9jYWwgYm9yZGVyID0gMgkJLS1+IFdpZHRoIGFyb3VuZCB0aGUgYm9yZGVyIG9mIHRoZSBtYXAuIEF0IGxlYXN0IDIgfi0tCglsb2NhbCBraWxsX25vID0gNgkJLS1+IE1pbmltdW0gbnVtYmVyIG9mIGVtcHR5IGNlbGxzIGZvciBhIG1pbmVyIHRvIGRpZSB+LS0KCWxvY2FsIHNwYXduX3Byb2IgPSAwLjYJLS1+IENoYW5jZSBmb3IgYSBtaW5lciB0byBzcGF3biBhIGNsb25lIHBlciBmcmFtZSB+LS0KCglsb2NhbCBjZWxsX2tpbGxfbm8gPSA2CS0tfiBNaW5pbXVtIG51bWJlciBvZiBlbXB0eSBjZWxscyBmb3IgdGhhdCBjZWxsIHRvIGJlIHJlbW92ZWQgfi0tCgoJbG9jYWwgbWFwID0ge30KCWxvY2FsIG1pbmVycyA9IHt9Cglsb2NhbCBkcmF3ID0ge30KCglmb3IgeCA9IDEsIHdpZHRoIGRvCgkJbWFwW3hdID0ge30KCQlmb3IgeSA9IDEsIGhlaWdodCBkbwoJCQltYXBbeF1beV0gPSB0cnVlCgkJZW5kCgllbmQKCgl0YWJsZS5pbnNlcnQobWluZXJzLCB7CgkJCXggPSBtYXRoLnJhbmRvbShib3JkZXIsIHdpZHRoLWJvcmRlciksCgkJCXkgPSBtYXRoLnJhbmRvbShib3JkZXIsIGhlaWdodC1ib3JkZXIpCgkJfSkKCgktLX4gTWFpbiBtaW5lciBsb29wIH4tLQoJd2hpbGUgI21pbmVycyB+PSAwIGRvCgkJLS1+IFNjYW4gYWxsIHRoZSBjZWxscyBhcm91bmQgdGhlIG1pbmVyIHRvIGNoZWNrIGZvciBlbXB0eSBvbmVzIC0tfgoJCWZvciBpLCBtaW5lciBpbiByaXBhaXJzKG1pbmVycykgZG8KCQkJbG9jYWwgZW1wdHkgPSAwCgkJCWZvciB4ID0gLTEsIDEgZG8KCQkJCWZvciB5ID0gLTEsIDEgZG8KCQkJCQlpZiBub3QgbWFwW21pbmVyLngreF1bbWluZXIueSt5XSBvcgoJCQkJCShtaW5lci54K3ggPCBib3JkZXIgb3IgbWluZXIueCt4ID4gd2lkdGgtYm9yZGVyKSBvcgoJCQkJCShtaW5lci55K3kgPCBib3JkZXIgb3IgbWluZXIueSt5ID4gaGVpZ2h0LWJvcmRlcikgdGhlbgoJCQkJCQllbXB0eSA9IGVtcHR5ICsgMQoJCQkJCWVuZAoJCQkJZW5kCgkJCWVuZAoJCQktLX4gSWYgdGhlcmUgYXJlIGVub3VnaCBlbXB0eSBvbmVzLCByZW1vdmUgdGhlIG1pbmVyIH4tLQoJCQlpZiBlbXB0eSA+PSBraWxsX25vIHRoZW4KCQkJCXRhYmxlLnJlbW92ZShtaW5lcnMsIGkpCgkJCWVsc2UKCQkJCS0tfiBSYW5kb21seSBzcGF3biBpbiBhbm90aGVyIG1pbmVyIGF0IHRoaXMgc3BvdCB+LS0KCQkJCWlmIG1hdGgucmFuZG9tKCkgPD0gc3Bhd25fcHJvYiB0aGVuCgkJCQl0YWJsZS5pbnNlcnQobWluZXJzLCB7CgkJCQkJeCA9IG1pbmVyLngsCgkJCQkJeSA9IG1pbmVyLnkKCQkJCX0pCgkJCQllbmQKCgkJCQktLX4gUmFuZG9tbHkgbW92ZSB0aGUgbWluZXIsIG1ha2luZyBzdXJlIGl0J3Mgbm90IG91dCBvZiBib3VuZHMgfi0tCgkJCQlsb2NhbCB4RGlyLCB5RGlyID0gbWF0aC5yYW5kb20oLTEsIDEpLCBtYXRoLnJhbmRvbSgtMSwgMSkKCQkJCWlmIChtaW5lci54K3hEaXIgPj0gYm9yZGVyIGFuZCBtaW5lci54K3hEaXIgPD0gd2lkdGgtYm9yZGVyKSBhbmQgKG1pbmVyLnkreURpciA+PSBib3JkZXIgYW5kIG1pbmVyLnkreURpciA8PSBoZWlnaHQtYm9yZGVyKSB0aGVuCgkJCQkJbWluZXIueCA9IG1pbmVyLnggKyB4RGlyCgkJCQkJbWluZXIueSA9IG1pbmVyLnkgKyB5RGlyCgkJCQllbmQKCgkJCQktLX4gUmVtb3ZlIHRoZSBjZWxsIHRoZSBtaW5lciBpcyBvbiB+LS0KCQkJCWlmIG1hcFttaW5lci54XVttaW5lci55XSB0aGVuCgkJCQkJbWFwW21pbmVyLnhdW21pbmVyLnldID0gZmFsc2UKCQkJCWVuZAoJCQllbmQKCQllbmQKCWVuZAoKCS0tfiBEaXNwbGF5IGl0IGFzIGFuIGFzY2lpIG1hcCB+LS0KCW91dHB1dCA9ICIiCglmb3IgeCA9IDEsIHdpZHRoIGRvCgkJb3V0cHV0ID0gb3V0cHV0IC4uICJcbiIKCQlmb3IgeSA9IDEsIGhlaWdodCBkbwoJCQlpZiBtYXBbeF1beV0gdGhlbgoJCQkJb3V0cHV0ID0gb3V0cHV0IC4uICIjIgoJCQllbHNlCgkJCQlvdXRwdXQgPSBvdXRwdXQgLi4gIiAiCgkJCWVuZAoJCWVuZAoJZW5kCgoJcHJpbnQob3V0cHV0KQ==