Pozwolić:

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

Chcę przetasować swoje pierwsze pięć elementów. Inne elementy muszą pozostać pod tym samym indeksem, np.:

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

Próbowałem example.shuffle, ale shuffles wszystkie elementy.

0
Vijay Atmin 5 czerwiec 2018, 10:17

5 odpowiedzi

Najlepsza odpowiedź

Możesz dostać pierwsze 5 elementów przez []:

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

Podobnie, możesz zestaw pierwszego 5 elementu przez {x0}}:

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

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

Więc shuffle Pierwsze 5 elementów można użyć:

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

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

Należy zauważyć, że example[0, 5].shuffle! byłoby nie Praca, ponieważ Array#[] zwraca nową tablicę zamiast odniesienia do podawcy (nie ma czegoś takiego w Ruby).

11
Stefan 5 czerwiec 2018, 07:29
a = [1, 2, 3, 4, 5, 6, 7, 8, 9] 
a[0..4].shuffle + a[5..-1]
2
djaszczurowski 5 czerwiec 2018, 07:21
example = [1, 2, 3, 4, 5, 6, 7, 8, 9]

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

Zwróci tablicę, której potrzebujesz, chociaż może nie być najbardziej eleganckim rozwiązaniem

EDYTUJ

Gdy @stefan skomentowałeś, możesz użyć drop, więc nie musisz obliczyć długości pozostałej tablicy:

example.first(5).shuffle + example.drop(5)
2
ldeld 5 czerwiec 2018, 07:37

Kilka więcej zabawnych sposobów: (wszystkie nieniszczące)

 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)) 

Naprawdę podobały mi się ten, ale tylko wtedy, gdy wszystkie elementy są gwarantowane wyjątkowe

 a.take(5).shuffle | a
1
engineersmnky 5 czerwiec 2018, 14:42

Spóźniłem się, ale moje dwa century. Jest to destrukcyjne.

example.shift(5).shuffle + example
0
iGian 5 czerwiec 2018, 12:38