# reverse_in_parentheses

Feb 20th, 2021
703
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
1. #!/usr/bin/env python3
2.
3. """
4. Return the string with reversing parts inside parentheses.
5.
6. Solution for problem from CodeSignal.
7. """
8.
9.
10. def reverse_in_parentheses(s: str, is_reverse: bool = False) -> str:
11.     """
12.    s must be well-formed.
13.    """
14.     j = s.find('(')
15.     if j == -1:
16.         return (''.join(reversed(s)) if is_reverse
17.                 else s)
18.
19.     pieces = []
20.     count = 0
21.     i = 0
22.     while j < len(s):
23.         if s[j] == '(':
24.             if count == 0:  # add part without parentheses
25.                 pieces.append(reverse_in_parentheses(s[i:j], is_reverse))
26.                 i = j
27.             count += 1
28.         elif s[j] == ')':
29.             count -= 1
30.             if count == 0:  # add '...' from part '(...)'
31.                 piece = reverse_in_parentheses(
32.                     reverse_in_parentheses(s[i + 1:j], True),
33.                     is_reverse)
34.                 pieces.append(piece)
35.                 i = j + 1
36.
37.         j += 1
38.
39.     pieces.append(reverse_in_parentheses(s[i:j], is_reverse))  # add remain
40.
41.     return ''.join(reversed(pieces) if is_reverse
42.                    else pieces)
43.
44.
45. def main() -> None:
46.     datas = (
47.         ('abc', 'abc'),
48.         ('(bar)', 'rab'),
49.         ('foo(bar)baz', 'foorabbaz'),
50.         ('foo(bar)baz(blim)', 'foorabbazmilb'),
51.         ('foo(bar(baz))blim', 'foobazrabblim'),
52.         ('', ''),
53.         ('()', ''),
55.         ('((ab)cd)', 'dcab'),
56.         ('foo(bar(baz))blim', 'foobazrabblim')
57.     )
58.
59.     for data_input, data_output in datas:
60.         print(f'"{data_input}" "{data_output}"', end=' ')
61.         result = reverse_in_parentheses(data_input)
62.         print(f'"{result}"')
63.
64.         assert data_output == result
65.
66.
67. if __name__ == '__main__':
68.     main()
69.
RAW Paste Data