Syntax error Program to get final position of moving animals when they stops in Python

Program to get final position of moving animals when they stops in Python



Suppose we have a string s that is representing the initial conditions of some animals. Each animal can take one of three values: L, indicates the animal moved to left. R, indicates the animal moved to right. @, indicates the animal is standing still. Animals moving on a direction will pick up other animals unless the animal receives a force from the opposite direction. Then, it will stand still. We have to find the orientation of each animal when the animal stop moving.

So, if the input is like s = "@@L@R@@@@L", then the output will be "LLL@RRRLLL"

To solve this, we will follow these steps −

  • levels := a list of size same as s and fill with -1

  • q := a double ended queue

  • for idx is in range 0 to size of s, do

    • if s[idx] is same as "R" or s[idx] is same as "L", then

      • insert (idx, 0, s[idx]) at the end of q

  • l := a new list of characters of s

  • while q is not empty, do

    • (idx, new_level, dir) := left element of q, and delete it from q

    • if levels[idx] is same as -1, then

      • levels[idx] := new_level

      • l[idx] := dir

      • if dir is same as "R" and idx + 1 < size of l , then

        • insert (idx + 1, new_level + 1, dir) at the end of q

      • otherwise when dir is same as "L" and idx - 1 >= 0, then

        • insert (idx - 1, new_level + 1, dir) at the end of q

    • otherwise when levels[idx] is same as new_level, then

      • if l[idx] is not same as dir, then

        • l[idx] := "@"

  • return a string by joining elements of l

Example

Let us see the following implementation to get a better understanding −

 Live Demo

from collections import deque
class Solution:
   def solve(self, s):
      levels = [-1 for i in s]
      q = deque()
      for idx in range(len(s)):
         if s[idx] == "R" or s[idx] == "L":
            q.append((idx, 0, s[idx]))
      l = list(s)
      while q:
         idx, new_level, dir = q.popleft()
         if levels[idx] == -1:
            levels[idx] = new_level
            l[idx] = dir
            if dir == "R" and idx + 1 < len(l):
               q.append((idx + 1, new_level + 1, dir))
            elif dir == "L" and idx - 1 >= 0:
               q.append((idx - 1, new_level + 1, dir))
         elif levels[idx] == new_level:
            if l[idx] != dir:
               l[idx] = "@"
      return "".join(l)
ob = Solution()
s = "@@L@R@@@@L"
print(ob.solve(s))

Input

"@@L@R@@@@L"

Output

LLL@RRRLLL
Updated on: 2020-12-22T06:24:50+05:30

214 Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements