Давайте поиграем в однопользовательскую игру под названием 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
, который всегда дает неотрицательные результаты.Ответы:
Pyth : 28 символов (Python 2: 116 символов)
Использование:
Попробуйте это здесь: Pyth Compiler / Executor
Ожидается список целых чисел в качестве входных данных
[0,2,5,4,-9,0,-1,1,-1,1,-6]
Объяснение:
Я заметил одно важное свойство функции
loop
: для каждогоi
естьj
, так чтоloop(a,i,0) == loop(a,j,1)
и наоборот. Поэтому нам нужно только вычислить значенияloop(a,i,b)
дляb=0
.Доказательство: если есть цикл
i -> j -> k -> ... -> z -> i
сb = 0
, то существует циклj -> k -> ... -> z -> i -> j
сb = 1
.Поэтому простой скрипт может работать следующим образом. Перебирайте все
i
и пытайтесь достичь сi
помощью итеративных вычисленийi = a[(i + a[i]) mod len(a)] mod len(a)
. Поскольку это вычисление может выполняться без циклаi
, мы отменяем вычисление послеlen(a)
шагов. Затем мы печатаем максимальный цикл.Python 2 реализация выглядит следующим образом ( 125 символа }:
Для реализации Pyth я использовал немного другой подход. Для каждого
i
я вычисляю список позиций и ищуi
в этом списке.редактировать: Python 2: 116 символов
Решение @proud haskeller было на несколько символов короче, чем у моего решения на Python, поэтому мне пришлось немного его укоротить.
Разница в том, что я вычисляю число рекурсивно, а не итеративно.
источник
Питон - 157
источник
len(a)
переменную и замените всеlen(a)
s на имя этой переменной, вы можете сохранить некоторые символы.t+=1;t%=2
->t^=1
иif t: j=(j+a[j])%z else: j=a[j]%z
->j=(t*j+a[j])%z
while c not in s[:-1]:
может бытьwhile(c in s[:-1])-1:
.j
, поскольку этот цикл присваивает содержимоеrange(z)
дляi
вместо приращения его. Просто заменитеj
с ,i
чтобы сохранить 4 символов.Хаскелл,
120105это создает бесконечный список для каждой отправной точки (по соображениям игры в гольф мы перебираем все значения вместо всех индексов, которые эквивалентны). затем он вычисляет цикл каждого списка (длина цикла
xs
isxs % []
).он использует наблюдения @ jakubes о циклах. потому что он делает 2 шага за раз, нам не нужно делить на 2 в конце.
Изменить : теперь, используя трюк @ MthViewMark, отбрасываем первые
n
элементы, чтобы гарантировать цикл с первым элементом. Кстати, мне удалось поиграть в свой алгоритм по112
персонажам:источник
Haskell - 139 символов
Примеры:
Это использует наблюдение @ jakube о том, что вам нужно проверять только половину начальных значений, выполняя 2 шага за итерацию.
источник
where
до предыдущего]
. Кроме того, вы пытались использоватьcycle l!!i
вместоl!!mod n(length l)
?b
и использовать шаблон защиты|n<-l a
для устраненияwhere
.Питон, 160
Функция для ответа есть
j
.Рекурсивная функция
l
возвращает длину цикла для заданного массива, начала и первого поворота, и функцияj
находит максимальное значение.источник
lambda
.Mathematica,
189 162161 байтЕсли разрешены анонимные функции - 161 байт:
В противном случае - 163 байта:
Выполнение этого во всех тестовых случаях:
Результаты в:
Python 2, 202 байта
DEMO
Это почти порт моего ответа Mathematica.
источник
For
с 3 аргументами обычно корочеWhile
(так как вы можете сохранить точку с запятой передFor
).Mathematica,
113112 символовПример:
источник
исп 82
Первый аргумент не учитывается в длине (инициализация массива в
$1
иb
инициализация в$2
- выберите «игру»).источник