Draw a cuboid

const dirs = Hash("-" => [1,0], "|" => [0,1], "/" => [1,1])
 
func cuboid(nx, ny, nz) {
  say("cuboid %d %d %d:" % [nx, ny, nz])
  var(x, y, z) = (8*nx, 2*ny, 4*nz)
  var area = []
  var line = func(n, sx, sy, c) {
    var(dx, dy) = dirs{c}...
    for i (0..n) {
      var (xi, yi) = (sx + i*dx, sy + i*dy)
      area[yi] \\= [" "]*(x+y+1)
      area[yi][xi] = (area[yi][xi] == " " ? c : '+')
    }
  }
 
  0 .. nz-1 -> each {|i| line(x,       0,     4*i, "-") }
  0 .. ny   -> each {|i| line(x,     2*i, z + 2*i, "-") }
  0 .. nx-1 -> each {|i| line(z,     8*i,       0, "|") }
  0 .. ny   -> each {|i| line(z, x + 2*i,     2*i, "|") }
  0 .. nz-1 -> each {|i| line(y,       x,     4*i, "/") }
  0 .. nx   -> each {|i| line(y,     8*i,       z, "/") }
 
  area.reverse.each { |line|
     say line.join('')
  }
}
 
cuboid(2, 3, 4)
cuboid(1, 1, 1)
cuboid(6, 2, 1)
cuboid(2, 4, 1)

A faster approach:

Output:

Last updated

Was this helpful?