#!/usr/bin/ruby
#
## https://rosettacode.org/wiki/Maze_generation#Sidef
#
var(w, h) = (5, 5);
var avail = (w * h);
# cell is padded by sentinel col and row, so I don't check array bounds
var cell = (1..h -> map {([true] * w) + [false]} + [[false] * w+1]);
var ver = (1..h -> map {["| "] * w });
var hor = (0..h -> map {["+--"] * w });
func walk(x, y) {
cell[y][x] = false;
avail-- > 0 || return(); # no more bottles, er, cells
var d = [[-1, 0], [0, 1], [1, 0], [0, -1]];
while (d.len) {
var i = d.pop_rand;
var (x1, y1) = (x + i[0], y + i[1]);
cell[y1][x1] || next;
if (x == x1) { hor[[y1, y].max][x] = '+ ' };
if (y == y1) { ver[y][[x1, x].max] = ' ' };
walk(x1, y1);
}
}
walk(w.rand.int, h.rand.int); # generate
for i in range(0, h) {
say (hor[i].join('') + '+');
if (i < h) {
say (ver[i].join('') + '|');
}
}