Вместо добавления результата в новый список обновите исходный список. Индекс выходит за пределы допустимого диапазона, когда ваш код пытается получить доступ к индексу после удаления значений. Когда нам нужно обновить список, нам нужно использовать enumerate
, а не l oop с длиной списка.
Вот мое решение относительно проблемы. Возможно, это не лучшее решение, но оно проходит все тестовые случаи:
def dirReduc(arr):
while True:
retry = False
for i, val in enumerate(arr):
if i+1 < len(arr):
if val == "NORTH" and arr[i+1] == "SOUTH":
del arr[i]
del arr[i]
retry = True
break
if val == "SOUTH" and arr[i+1] == "NORTH":
del arr[i]
del arr[i]
retry = True
break
if val == "WEST" and arr[i+1] == "EAST":
del arr[i]
del arr[i]
retry = True
break
if val == "EAST" and arr[i+1] == "WEST":
del arr[i]
del arr[i]
retry = True
break
if retry == False:
break
return arr
Пояснение:
Я просмотрел все элементы в массиве. Если я получаю любую идущую подряд пару, которая может уничтожить друг друга, я удаляю их из списка. Такими парами являются: (СЕВЕР, ЮГ), (ЮГ, СЕВЕР), (ВОСТОК, ЗАПАД) и (ЗАПАД, ВОСТОК).
Я продолжаю эту операцию до тех пор, пока в списке не останется съемная пара. Наконец, я возвращаю обновленный список.
Ссылка: