#!/usr/bin/python
import os
import sys
def rp_parse(string):
# Stage 1: create expression
string = string.replace('(', '+(').replace(')', ')+')
while string != string.replace('(+(', '((').replace(')+)', '))').replace('++', '+'):
string = string.replace('(+(', '((').replace(')+)', '))').replace('++', '+')
if string[0] == '+':
string = string[1:]
if string[len(string)-1] == '+':
string = string[:len(string)-1]
# Stage 2: reverse_polish_notation(string)
# Priority: 1: '()' ; 2: '+'
# Alias: '()' => '<<'
op_stack = list()
out_stack = list()
counter = 0
out_stack.append('')
for c in string:
if c == '(':
op_stack.append('(')
if out_stack[counter]:
out_stack.append('')
counter += 1
elif c == ')':
i = len(op_stack) - 1
while op_stack[i] != '(' and i >= 0:
out_stack.append(op_stack[i])
op_stack.pop()
counter += 1
i -= 1
op_stack.pop() # take '(' out
if out_stack[counter] == '':
out_stack[counter] = "<<"
out_stack.append('')
counter += 1
else:
out_stack.append('<<')
out_stack.append('')
counter += 2
elif c == '+':
op_stack.append('+')
if out_stack[counter]:
out_stack.append('')
counter += 1
else:
out_stack[counter] += c
if out_stack[counter] == '':
del out_stack[counter]
i = len(op_stack) - 1
while i >= 0:
out_stack.append(op_stack[i])
i -= 1
return out_stack
def rp_reverse(string):
i = len(string) - 1
buff = str()
while i >= 0:
buff += string[i]
i -= 1
return buff
def rp_process(rplist):
i = 0
while len(rplist) != 1:
if rplist[i] == '<<':
rplist[i-1] = rp_reverse(rplist[i-1])
del rplist[i]
elif rplist[i] == '+':
rplist[i-2] = ''.join([rplist[i-2], rplist[i-1]])
i -= 1
del rplist[i]
del rplist[i]
else:
i += 1
return rplist[0]
### TEST CASE
test_sample_1 = '12((34)5(67)8)90'
test_sample_2 = 'a(bc)(de)'
test_sample_3 = '((abc)def)'
print 'sample 1:', test_sample_1
print 'result: (test_1) ', rp_process(rp_parse(test_sample_1))
print 'expected result: (test_1): 12 ( 43 5 76 8 ) 90 => 12 867534 90\n'
print 'sample 2:', test_sample_2
print 'result: (test_2) ', rp_process(rp_parse(test_sample_2))
print 'expected result: (test_2): acbde\n'
print 'sample 3:', test_sample_3
print 'result: (test_3) ', rp_process(rp_parse(test_sample_3))
print 'expected result: (test_3): fedabc\n'
if len(sys.argv) != 1:
for i in sys.argv[1:]:
print i, ':', rp_process(rp_parse(i))
IyEvdXNyL2Jpbi9weXRob24KCmltcG9ydCBvcwppbXBvcnQgc3lzCgpkZWYgcnBfcGFyc2Uoc3RyaW5nKToKCgkjIFN0YWdlIDE6IGNyZWF0ZSBleHByZXNzaW9uCglzdHJpbmcgPSBzdHJpbmcucmVwbGFjZSgnKCcsICcrKCcpLnJlcGxhY2UoJyknLCAnKSsnKQoJd2hpbGUgc3RyaW5nICE9IHN0cmluZy5yZXBsYWNlKCcoKygnLCAnKCgnKS5yZXBsYWNlKCcpKyknLCAnKSknKS5yZXBsYWNlKCcrKycsICcrJyk6CgkJc3RyaW5nID0gc3RyaW5nLnJlcGxhY2UoJygrKCcsICcoKCcpLnJlcGxhY2UoJykrKScsICcpKScpLnJlcGxhY2UoJysrJywgJysnKQoJaWYgc3RyaW5nWzBdID09ICcrJzoKCQlzdHJpbmcgPSBzdHJpbmdbMTpdCglpZiBzdHJpbmdbbGVuKHN0cmluZyktMV0gPT0gJysnOgoJCXN0cmluZyA9IHN0cmluZ1s6bGVuKHN0cmluZyktMV0KCgkjIFN0YWdlIDI6IHJldmVyc2VfcG9saXNoX25vdGF0aW9uKHN0cmluZykKCSMJUHJpb3JpdHk6IDE6ICcoKScgOyAyOiAnKycKCSMJQWxpYXM6ICcoKScgPT4gJzw8JwoJb3Bfc3RhY2sgID0gbGlzdCgpCglvdXRfc3RhY2sgPSBsaXN0KCkKCWNvdW50ZXIgICA9IDAKCW91dF9zdGFjay5hcHBlbmQoJycpCglmb3IgYyBpbiBzdHJpbmc6CgkJaWYgYyA9PSAnKCc6CgkJCW9wX3N0YWNrLmFwcGVuZCgnKCcpCgkJCWlmIG91dF9zdGFja1tjb3VudGVyXToKCQkJCW91dF9zdGFjay5hcHBlbmQoJycpCgkJCQljb3VudGVyICs9IDEKCQllbGlmIGMgPT0gJyknOgoJCQlpID0gbGVuKG9wX3N0YWNrKSAtIDEKCQkJd2hpbGUgb3Bfc3RhY2tbaV0gIT0gJygnIGFuZCBpID49IDA6CgkJCQlvdXRfc3RhY2suYXBwZW5kKG9wX3N0YWNrW2ldKQoJCQkJb3Bfc3RhY2sucG9wKCkKCQkJCWNvdW50ZXIgKz0gMQoJCQkJaSAtPSAxCgkJCW9wX3N0YWNrLnBvcCgpCSMgdGFrZSAnKCcgb3V0CgkJCWlmIG91dF9zdGFja1tjb3VudGVyXSA9PSAnJzoKCQkJCW91dF9zdGFja1tjb3VudGVyXSA9ICI8PCIKCQkJCW91dF9zdGFjay5hcHBlbmQoJycpCgkJCQljb3VudGVyICs9IDEKCQkJZWxzZToKCQkJCW91dF9zdGFjay5hcHBlbmQoJzw8JykKCQkJCW91dF9zdGFjay5hcHBlbmQoJycpCgkJCQljb3VudGVyICs9IDIKCQllbGlmIGMgPT0gJysnOgoJCQlvcF9zdGFjay5hcHBlbmQoJysnKQoJCQlpZiBvdXRfc3RhY2tbY291bnRlcl06CgkJCQlvdXRfc3RhY2suYXBwZW5kKCcnKQoJCQkJY291bnRlciArPSAxCgkJZWxzZToKCQkJb3V0X3N0YWNrW2NvdW50ZXJdICs9IGMKCQoJaWYgb3V0X3N0YWNrW2NvdW50ZXJdID09ICcnOgoJCWRlbCBvdXRfc3RhY2tbY291bnRlcl0KCglpID0gbGVuKG9wX3N0YWNrKSAtIDEKCXdoaWxlIGkgPj0gMDoKCQlvdXRfc3RhY2suYXBwZW5kKG9wX3N0YWNrW2ldKQoJCWkgLT0gMQoKCXJldHVybiBvdXRfc3RhY2sKCgpkZWYgcnBfcmV2ZXJzZShzdHJpbmcpOgoJaSA9IGxlbihzdHJpbmcpIC0gMQoJYnVmZiA9IHN0cigpCgl3aGlsZSBpID49IDA6CgkJYnVmZiArPSBzdHJpbmdbaV0KCQlpIC09IDEKCXJldHVybiBidWZmCgpkZWYgcnBfcHJvY2VzcyhycGxpc3QpOgoJaSA9IDAKCXdoaWxlIGxlbihycGxpc3QpICE9IDE6CgkJaWYgcnBsaXN0W2ldID09ICc8PCc6CgkJCXJwbGlzdFtpLTFdID0gcnBfcmV2ZXJzZShycGxpc3RbaS0xXSkKCQkJZGVsIHJwbGlzdFtpXQoJCWVsaWYgcnBsaXN0W2ldID09ICcrJzoKCQkJcnBsaXN0W2ktMl0gPSAnJy5qb2luKFtycGxpc3RbaS0yXSwgcnBsaXN0W2ktMV1dKQoJCQlpIC09IDEKCQkJZGVsIHJwbGlzdFtpXQoJCQlkZWwgcnBsaXN0W2ldCgkJZWxzZToKCQkJaSArPSAxCglyZXR1cm4gcnBsaXN0WzBdCgoKIyMjCQlURVNUIENBU0UKCnRlc3Rfc2FtcGxlXzEgPSAnMTIoKDM0KTUoNjcpOCk5MCcKdGVzdF9zYW1wbGVfMiA9ICdhKGJjKShkZSknCnRlc3Rfc2FtcGxlXzMgPSAnKChhYmMpZGVmKScKCnByaW50ICdzYW1wbGUgMTonLCB0ZXN0X3NhbXBsZV8xCnByaW50ICdyZXN1bHQ6ICh0ZXN0XzEpICcsIHJwX3Byb2Nlc3MocnBfcGFyc2UodGVzdF9zYW1wbGVfMSkpCnByaW50ICdleHBlY3RlZCByZXN1bHQ6ICh0ZXN0XzEpOiAxMiAoIDQzIDUgNzYgOCApIDkwID0+IDEyIDg2NzUzNCA5MFxuJwoKcHJpbnQgJ3NhbXBsZSAyOicsIHRlc3Rfc2FtcGxlXzIKcHJpbnQgJ3Jlc3VsdDogKHRlc3RfMikgJywgcnBfcHJvY2VzcyhycF9wYXJzZSh0ZXN0X3NhbXBsZV8yKSkKcHJpbnQgJ2V4cGVjdGVkIHJlc3VsdDogKHRlc3RfMik6IGFjYmRlXG4nCgpwcmludCAnc2FtcGxlIDM6JywgdGVzdF9zYW1wbGVfMwpwcmludCAncmVzdWx0OiAodGVzdF8zKSAnLCBycF9wcm9jZXNzKHJwX3BhcnNlKHRlc3Rfc2FtcGxlXzMpKQpwcmludCAnZXhwZWN0ZWQgcmVzdWx0OiAodGVzdF8zKTogZmVkYWJjXG4nCgppZiBsZW4oc3lzLmFyZ3YpICE9IDE6Cglmb3IgaSBpbiBzeXMuYXJndlsxOl06CgkJcHJpbnQgaSwgJzonLCBycF9wcm9jZXNzKHJwX3BhcnNlKGkpKQoKCg==