123456789101112131415161718192021222324252627282930313233343536373839 |
- #!/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();
- 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(irand(1,w), irand(1, h)); # generate
- for i in range(0, h) {
- say (hor[i].join('') + '+');
- say (ver[i].join('') + '|') if (i < h);
- }
|