Как перемешать первые n элементов в массиве - PullRequest
0 голосов
/ 05 июня 2018

Пусть:

example = [1,2,3,4,5,6,7,8,9]

Я хочу перетасовать свои первые пять элементов.Другие элементы должны оставаться под тем же индексом, например:

[2,4,1,3,5,6,7,8,9]
[3,1,4,5,2,6,7,8,9]
# etc

Я пробовал example.shuffle, но он перемешивает все элементы.

Ответы [ 5 ]

0 голосов
/ 05 июня 2018

Еще несколько забавных способов: (все неразрушающие)

 a =[*1..9]

 a.each_slice(5).to_a.tap do |f| 
   f.first.shuffle!
 end.reduce(:+)

 a.reduce([]) do |memo,n|
   (memo << n).size == 5 ? memo.shuffle : memo
 end

 a.partition.with_index do |_,i| 
   i < 5 
 end.inject { |memo,p| memo.shuffle.concat(p) }

 a.values_at(*[*0..4].shuffle).push(*a.drop(5)) 

Мне тоже очень нравится этот, но только если все элементы гарантированно уникальны

 a.take(5).shuffle | a
0 голосов
/ 05 июня 2018

Я опоздал, но мои два цента.Это разрушительно.

example.shift(5).shuffle + example
0 голосов
/ 05 июня 2018
example = [1, 2, 3, 4, 5, 6, 7, 8, 9]

example.first(5).shuffle + example.last(4)

вернет нужный вам массив, хотя это может быть не самым элегантным решением

РЕДАКТИРОВАТЬ

Как прокомментировал @Stefan, вы можете использовать drop, поэтому вам не нужно вычислять длину оставшегося массива:

example.first(5).shuffle + example.drop(5)
0 голосов
/ 05 июня 2018

Вы можете получить первые 5 элементов через []:

example[0, 5]
#=> [1, 2, 3, 4, 5]

Аналогично, вы можете установить первые 5элемент через []=:

example[0, 5] = [5, 4, 3, 2, 1]
#=> [5, 4, 3, 2, 1]

example
#=> [5, 4, 3, 2, 1, 6, 7, 8, 9]

Таким образом, чтобы shuffle первые 5 элементов, вы могли бы использовать:

example[0, 5] = example[0, 5].shuffle
#=> [3, 2, 1, 4, 5]

example
#=> [3, 2, 1, 4, 5, 6, 7, 8, 9]

Обратите внимание, что example[0, 5].shuffle! будет не работает, потому что Array#[] возвращает новый массив вместо ссылки на подмассив (в Ruby такого нет).

0 голосов
/ 05 июня 2018
a = [1, 2, 3, 4, 5, 6, 7, 8, 9] 
a[0..4].shuffle + a[5..-1]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...