def nonoblocks(cell, blocks)
  raise 'Those blocks will not fit in those cells' if cell < blocks.inject(0,:+) + blocks.size - 1
  nblock(cell, blocks, '', [])
end

def nblock(cell, blocks, position, result)
  if cell <= 0
    result << position[0..cell-1]
  elsif blocks.empty? or blocks[0].zero?
    result << position + '.' * cell
  else
    rest = cell - blocks.inject(:+) - blocks.size + 2
    bl, *brest = blocks
    rest.times.inject(result) do |res, i|
      nblock(cell-i-bl-1, brest, position + '.'*i + '
    end
  end
end

conf = [[ 5, [2, 1]],
        [ 5, []],
        [10, [8]],
        [15, [2, 3, 2, 3]],
        [ 5, [2, 3]],      ]
conf.each do |cell, blocks|
  begin
    puts 
    result = nonoblocks(cell, blocks)
    puts result, result.size, 
  rescue => e
    p e
  end
end