# Constants for making it easy
leftBrackets = ['(', '{', '[' ];
rightBrackets = [')', '}', ']'];
examples = [  '((your[drink {remember to}]) ovaltine)',
              '[racket for {brackets (matching) is a} computers]',
              '[can {and it(it (mix) up ) } look silly]',
              '((your[drink {remember to))) ovaltine)',
              '[can {and it(it (mix) up ) look silly]',
              '[racket for brackets (matching) is a} computers]',
              '{years [four score] ago (and seven) our fathers}'
          ];

def testForErrors(example):
  for leftBracket, rightBracket in zip(leftBrackets, rightBrackets):
    if(example.count(leftBracket) != example.count(rightBracket)):
      print 'Generates an error "Missing opening bracket';
      return False;

  return True;

def MARCHMADNESS(s):
  if s == '':
    return '';

  for leftBracket, rightBracket in zip(leftBrackets, rightBrackets):
    s = s.replace(leftBracket, '(');
    s = s.replace(rightBracket, ')');

  leftBracketIndex = s.rfind('(');
  rightBracketIndex = s.find(')');
  while(leftBracketIndex > rightBracketIndex):
    leftBracketIndex = s.rfind('(', 0, leftBracketIndex);

  return s[leftBracketIndex+1:rightBracketIndex]+ ' ' + str(MARCHMADNESS(s[0:leftBracketIndex] + s[rightBracketIndex+1:])).strip().replace('  ', ' ');

for example in examples:
  if(testForErrors(example) == False):
    continue;
  print MARCHMADNESS(example);

