Here is my solution.
It considers any input that is balanced and doesn't contain empty
packaging (like []) valid.
For correcting it just tries every possible way of correcting a
string, until it finds a valid one.


def valid_packaging?(str)
  other_br = {'}'=>'{',']'=>'[',')'=>'('}
  stack = []
  pc = nil
  str.split('').each {|c|
    if other_br.values.include? c
      stack << c
	elsif mb = other_br[c]
      return false unless stack.pop == mb && pc != mb # unbalanced, or
 {} detected
    end
    pc = c
  }
  return stack.empty?
end

input = ARGV[0].to_s
pos = [input] + "[](){}".split('').map{|c|
  (0..input.length).map {|i| input[0...i] + c + input[i..-1] }
}

if corr = pos.flatten.find{|str| valid_packaging? str}
  puts corr
else
  exit! 1
end