OPiMedia

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.         ('()', ''),
  54.         ('(abc)d(efg)', 'cbadgfe'),
  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

Adblocker detected! Please consider disabling it...

We've detected AdBlock Plus or some other adblocking software preventing Pastebin.com from fully loading.

We don't have any obnoxious sound, or popup ads, we actively block these annoying types of ads!

Please add Pastebin.com to your ad blocker whitelist or disable your adblocking software.

×