Python

Помогите с задачей

Маленький Артёмка нашёл кузнечика. Он принес его домой и собрал для него прыжковый тренажёр.

Тренажёр является клетчатой полоской 1 × n, в каждой клетке которой записаны направление и длина прыжка, который должен сделать кузнечик, если он попадёт в эту клетку. Кузнечик начинает в первой клетке и продолжает прыгать до тех пор, пока не выпрыгнет за пределы поля. Теперь Артём хочет узнать, произойдет ли это когда-нибудь.

Входные данные
В первой строке входных данных записано число n (1 ≤ n ≤ 100 000) — длина полоски.

В следующей строке записана строка длины n, которая состоит из символов «<» и «>», i-й из которых определяет направление прыжка из i-й клетки. В следующей строке находятся n целых чисел di (1 ≤ di ≤ 109) — длины соответствующих прыжков для каждой клетки.

Выходные данные
Выведите «INFINITE» (без кавычек), если кузнечик никогда не выпрыгнет за пределы полоски, иначе выведите «FINITE» (без кавычек).
Надо всего лишь отмечать клетки, в которых кузнечик уже побывал. И если он попал в уже посещённую клетку, значит его маршрут зациклился и он никогда не выберется.

Примерно так:

n = int(input())
dir = input()
len = list(map(int, input().split()))
visited = [0 for i in range(n)]
i = 0;
while 0 <= i < n and not visited[i]:
~~visited[i] = 1
~~i += len[i] if dir[i] == '>' else -len[i]
print('INFINITE' if 0 <= i < n else 'FINITE')
Всеволод Кудинов
Всеволод Кудинов
89 743
Лучший ответ
Тут сначала надо алгоритм составить без привязки к алгоритмическому языку и сразу всё вдруг станет ясно как Божий День!

1.Вводим n, строку длины n с символами < или > и натуральночисленный массив той же длины.

2.Все клетки поля являются либо клетками схóда (то есть кузнечик слетáет с поля своим следующим ходом) либо не являются. Вычислим по введённым данным рабочий массив move длины n, элементы которого совпадают с элементами массива d, если в соответствующем месте строки стоит >, или противоположенны им, если стоит <. В этом же цикле вычислим и массив всех полей схóда.

3.Симулируем движение. Введём массив пройденных полей - он вначале пустой! Инициируем переменную p (то есть номер клетки) единицей и начинаем бесконечный цикл. Если р принадлежит массиву полей схóда, пишем FINITE и выходим из цикла. Если же р принадлежит массиву пройденных полей, пишем INFINITE и покидаем цикл. Иначе добавляем в массив пройденных полей p, a к самой переменной р прибавляем move[p-1] (индекc массива move на единицу меньше номера клетки!). Это конец алгоритма. А вот и сам код:

n=int(input('n = ?\b'));s=input('Строка : ')

d=[int(x) for x in input('d[n] = ').split()]

move=d;soskok=[];history=[];p=1

for k in range(n):

~~if s[k]=='<':move[k]*=-1

~~l=k+1+move[k]

~~if l<1 or l>n:soskok.append(k+1)

while True:

~~if p in soskok:print('FINITE');break

~~elif p in history:print('INFINITE');break

~~else:history.append(p);p+=move[p-1]

Запускаем код и вводим:

n = 5

Строка : >><><

d[n] = 2 2 1 1 4

И получаем правильный результат:

INFINITE

(Действительно, по введённым нами данным кузнечик из первой клетки скачет в третью, оттуда во вторую, потом в четвёртую, затем в пятую, откуда снова в первую. Круг замкнулся, а значит этот виртуально-условный кузнечик так и будет скакать по полю вечно!)
Дмитрий Дёмин
Дмитрий Дёмин
28 648
По-моему так:

n = int(input())
s = input()
A = list(map(int,input().split()))
##n = 7##
##s = '>>>><<<'##
##sA = '6 4 2 2 1 3 5'##
##A = list(map(int,sA.split()))##
"""
with open('1.txt') as f:
~~~~n = int(f.readline())
~~~~A = []
~~~~for a in range(n):
~~~~~~~~A.append(int(f.readline()))
~~~~s = f.readline()
"""
B = [0]*n
B[0] = 1

for i in range(n):
~~~~if s[i]=='<':
~~~~~~~~A[i] *= -1
~~~~~~~~
##print(A)##

i = 0
while 1:
~~~~i += A[i]
~~~~##print(i)##
~~~~if i<0 or i>=len(A):
~~~~~~~~print('FINITE')
~~~~~~~~break
~~~~if B[i]==0:
~~~~~~~~B[i] = 1
~~~~else:
~~~~~~~~print('INFINITE')
~~~~~~~~break