Предположение
Я предполагаю, что игра начинается в позиции 0
. Каждый ход увеличивает или уменьшает позицию на целую величину. Цель состоит в том, чтобы вернуться в положение 0
после того, как был сделан первый ход.
Нам дан массив arr
целых чисел и отображение позиций в индексы массива. Для позиции p
индекс arr
задается как p % arr.size
.
Если мы находимся в позиции p
, мы получаем, что значение может переместиться в позицию p + n
или p - n
, где
n = arr[p % arr.size]
Для приведенного примера:
arr = [6, 4, 1, 3, 3, 1, 4, 1, 1, 0]
(arr.size #=> 10
) и p
изначально ноль,
n = arr[0 % 10]
#=> arr[0] => 6
, поэтому мы можем перейти в положение + 6 или -6. Если мы перейдем к +6, мы вычислим
n = arr[6 % 10]
#=> 4
, поэтому мы можем перейти в положение 6+4 #=> 10
или 6-4 #=> 2
. Если мы перейдем к -6, мы вычислим
n = arr[-6 % 10]
#=> 3
, поэтому мы можем перейти в положение -6-3 #=> -9
или -6+3 #=> -3
.
Обратите внимание, что arr[9] #=> 0
может рассматриваться как поглощающее состояние .
код
Метод, который я выбрал для использования, является рекурсивным.
def onward_to_zero(arr, pos=0)
n = arr[pos % arr.size]
return [] if n.zero?
return [-n] if (pos-n).zero?
return [n] if (pos+n).zero?
if rand < 0.5
rv = onward_to_zero(arr, pos-n)
return [-n] + rv unless rv.empty?
rv = onward_to_zero(arr, pos+n)
return [n] + rv unless rv.empty?
else
rv = onward_to_zero(arr, pos+n)
return [n] + rv unless rv.empty?
rv = onward_to_zero(arr, pos-n)
return [-n] + rv unless rv.empty?
end
[]
end
Я считаю, что это возможно Докажи, что всегда есть путь к нулю, но я не придумал доказательства.
Примеры
arr = [6, 4, 1, 3, 3, 1, 4, 1, 1, 0]
onward_to_zero(arr)
#=> [-6, 3, 1, -1, 1, -1, -1, 4]
# pos % 10 0 4 7 8 7 8 7 6
# pos-> 0 -6 -3 -2 -3 -2 -3 -4 0
arr = [3, 2, 4, 1, 3, 6, 2]
onward_to_zero(arr)
#=> [3, -1, 4, 2, 2, 1, -3, 2, -1, -4, -6, -2, 3]
# pos-> 3 2 6 8 10 11 8 10 9 5 -1 -3 0
arr = [3, 3]
onward_to_zero(arr)
#=> [-3, 3]
# pos-> -3 0
arr = [7, 26, 33, 18, 7, 13]
onward_to_zero(arr)
#=> [-7, -13, 7, 13]
# pos-> -7 -20 -13 0
Обсуждение
Обратите внимание, что if rand < 0.5
заставляет меня задуматься о сокращении позиции до ее увеличения примерно в половину времени. Если бы я всегда рассматривал уменьшение до увеличения или наоборот, я мог бы легко получить слишком большой уровень стека ошибка.
Однако даже с этим механизмом вероятности метод дает довольно разнообразные результаты и все равно может привести к слишком глубокой ошибке на уровне стека . Вот результаты, которые я получил, выполнив первый пример 10 раз.
[6, -4, 1, -3]
[-6, 3, 1, -1, -1, 4]
[6, 4, 6, 4, 6, 4, 6, 4, 6,..., -1, -1, 4] (824 elements)
[6, 4, -6, -3, 4, 1, -4, -1,..., -4, 1, -3] (386 elements)
[-6, 3, 1, -1, -1, 4]
[-6, -3, 4, 1, 4]
[-6, 3, 1, -1, 1, -1, -1, 4]
[-6, -3, -4, -1, -4, 1, -3, 6, 4, 6, 4]
[-6, -3, -4, 1, -1, -1, -4, -1, 4, 1, 4, 6, 4]
[-6, 3, -1, 4]