2014-11-27 4 views
4

Есть ли способ перетасовать все элементы в массиве, за исключением указанного индекса, используя функцию shuffle?Shuffle array with exceptions

Не нужно вручную писать метод, поддерживает ли Ruby что-либо подобное?

Например, у меня есть массив целых чисел:

array = [1,2,3,4,5] 

и я хочу, чтобы перетасовать элементы в любом произвольном порядке, но оставить первый Int на своем месте. Конечным результатом может быть примерно следующее:

=> [1,4,3,2,5] 

До тех пор, пока этот первый элемент остается на своем месте. Я, очевидно, нашел обходные пути, создав свои собственные методы для этого, но я хотел посмотреть, есть ли какая-то встроенная функция, которая может помочь сократить время и пространство.

+0

Согласно [перетасовка документация] (Http: //www.ruby-doc .org/core-2.1.5/Array.html # method-i-shuffle), вы не можете сделать это с помощью одной встроенной функции Ruby. Конечно, существует ряд однострочных решений, которые вы можете найти. – Free

+1

Возможно, вы можете передать пользовательский случайный объект, который не перетасовывает конкретные индексы? – August

+0

Почему бы вам не показать нам пример того, что вы подразумеваете, предоставляя некоторые входные данные и как вы хотите, чтобы это было рандомизировано, вместо того, чтобы просить нас представить это? –

ответ

1

Короткий ответ: нет. Основываясь на последнем Ruby documentation of Array.shuffle, единственным аргументом, который он принимает, является генератор случайных чисел. Поэтому вам нужно будет написать свой собственный метод: вот мой прием:

module ArrayExtender 
    def shuffle_except(index) 
    clone = self.clone 
    clone.delete_at(index) 
    clone.shuffle.insert(index, self[index]) 
    end 
end 

array = %w(a b c d e f) 

array.extend(ArrayExtender) 

print array.shuffle_except(1) # => ["e", "b", "f", "a", "d", "c"] 
print array.shuffle_except(2) # => ["e", "a", "c", "b", "f", "d"] 
1

Внутри нет встроенной функции. Это все еще довольно легко сделать:

первый элемент

arr = [1, 2, 3, 4, 5] 

hold = arr.shift 
# => 1 

arr.shuffle.unshift(hold) 
# => [1, 4, 5, 2, 3] 

специфический индекс

arr = [1, 2, 3, 4, 5] 
index = 2 

hold = arr.delete_at(index) 
# => 3 

arr.shuffle.insert(index, hold) 
# => [5, 1, 3, 2, 4]