Давайте поиграем в однопользовательскую игру под названием Jump the array . Чтобы играть, вам нужен только массив целых чисел, скажем a
. Вы начинаете с какой-то позиции i
, и на каждом ходу вы переходите на новую позицию. На очереди n
,
- если
n
чёт, вы переходите в абсолютную позициюa[i] mod length(a)
, - если
n
нечетно, вы переходите в относительную позицию(i + a[i]) mod length(a)
.
Индексация массива начинается с нуля. Вы можете посчитать первый прыжок как ход 0
или поворот 1
, что дает другую игру. Поскольку пространство состояний игры является конечным (ваш ход определяется вашей позицией и соотношением числа ходов), вы, конечно, в конечном итоге войдете в цикл равной длины. Обозначим loop(a, i, b)
длину этого цикла, когда первый прыжок считается поворотом b
.
вход
Непустой массив a
целых чисел для игры.
Выход
Максимальное число p
таких , что при запуске на некотором положение i
и подсчет первого поворота или как 0
или 1
, в конечном итоге вы ввести петлю длины 2 * p
. Другими словами, ваш вывод это число
max { loop(a, i, b)/2 : i in [0 .. length(a)-1], b in [0,1] }
правила
Вы можете дать функцию или полную программу. Наименьшее количество байтов выигрывает, и стандартные лазейки запрещены.
Контрольные примеры
[0] -> 1
[-213] -> 1
[1,3,12,-1,7] -> 1
[2,3,5,7,9,11,13,17,19] -> 2
[-2,3,-5,7,-9,11,-13,17,-19,23,-27] -> 3
[0,2,5,4,-9,0,-1,1,-1,1,-6] -> 4
mod
определяется как всегда положительный ( -1 mod 5 == 4
) в отличие от C. Это так?
mod
, который всегда дает неотрицательные результаты.