2014-10-30 2 views
1

Простой пример, но я хочу понять, как это делается, поэтому я могу применить его еще там, где у меня есть основной массив с 6 элементами. Я хочу взять 3 элемента из основного массива и поместить их в массив, а затем взять остальные 3 из основного массива и поместить их в массив b. Я буду использовать это, чтобы применить его к решению карт двух игроковразделить содержимое массива на два других массива

main = [1, 2, 3, 4, 5, 6] 
    a = [ ] 
    b = [ ] 
+3

'а = основная [0,3] => [1, 2, 3]; b = main [3,3] => [4, 5, 6] '. –

+2

'' main = [1, 2, 3, 4, 5, 6]; '' '' a, b = main.each_slice (3) .to_a'' – rejin

+0

Я отправил ответ в соответствии с вашим требованием. ;) –

ответ

4
main = [1, 2, 3, 4, 5, 6] 
#=> [1, 2, 3, 4, 5, 6] 
main.first(3) 
#=> [1, 2, 3] 
main.last(3) 
#=> [4, 5, 6] 
1
a = [1, 2, 3, 4, 5, 6] 
#=> [1, 2, 3, 4, 5, 6] 
b = a.take(3) 
#=> [1, 2, 3] 
c = a.drop(3) 
#=> [4, 5, 6] 
0

У вас есть много способов сделать то же самое в Ruby. Разделение массивов не является исключением. Многие ответы (и комментарии) рассказали вам о некоторых способах этого. Если ваша программа работает с картами, вы не остановитесь там. Во-первых, у вас, вероятно, будет более 6 карт. Во-вторых, у вас, вероятно, будет более двух игроков. Скажем, карты C, а игроки - P. Вам нужно написать метод, который, независимо от того, сколько Cs или Ps существует, метод даст каждому игроку равное количество Ccards (или возвращает ошибку, если это не может дать ему равное количество карт). Так что для 6 карт и 2 игроков он будет давать по 3 карты каждый. Для 12 карт и 3 игроков - по 4 карты. Для 3-х карт и 2 игроков, это будет выдавать ошибку, потому что карты не могут быть равномерно распределены:

def split_cards_evenly_between_players(cards, players) 
    if cards.size % players != 0 
    raise 'Cannot split evenly!' 
    else 
    groups_to_split_into = cards.size/players 
    cards.each_slice(groups_to_split_into).to_a 
    end 
end 

Давайте пройдемся по коду. Если карты не могут быть равномерно распределены между игроками, то остаток, деля их, не будет 0 (6 карт/3 игрока = остаток 0. 7 карт/3 игрока = остаток 1). Вот что проверяет строка 2. Если карты могут быть разделены, тогда мы сначала обнаруживаем, что группы разбиваются на (которые делят количество карт на количество игроков). Затем мы просто разделили массив на множество групп с Enumerable#each_slice. Наконец, поскольку это не создает массив, нам нужно .to_a его преобразовать. Возвращаемое значение в Ruby всегда является значением последнего выполненного выражения. Единственным выражением в этом методе является выражение if/then, которое также возвращает значение последнего выполняемого выражения (которое является строкой, где каждая из них является). Давайте попробуем это:

p split_cards_evenly_between_players([1,2,3,4,5,6,7,8,9,10,11,12],2) #=> [[1, 2, 3, 4, 5, 6], [7, 8, 9, 10, 11, 12]] 
p split_cards_evenly_between_players([4,5,1,2,5,3], 3) #=> [[4, 5], [1, 2], [5, 3]] 
p split_cards_evenly_between_players([1,2,3],2) #=> Error: Cannot split evenly! 

Хорошая вещь о Руби является его простой синтаксис и тот факт, что пытается выйти из своего пути, решая проблему, так что вы можете сосредоточиться на актуальной проблеме, чем код.

1

Все, возможно, дал правильный ответ, но как я понял из вашего вопроса (I will use this to apply it to dealing cards to two players) При работе карты, так как вы имеете дело карты игроку main массив должен удалить этот элемент из себя массив преодолеть Redundancy проблемы (дублирование). Когда вы делаете все карты main, массив должен быть пустым.

Для этого решения взглянуть на Array#shift

> main = [1,2,3,4,5,6] # I have 6 cards on my hand before dealing cards to players 
=> [1, 2, 3, 4, 5, 6] 
> a = main.shift(3) # given 3 cards to Player a 
=> [1, 2, 3] 
> b = main.shift(3) # given 3 cards to Player b 
=> [4, 5, 6] 
> main # after dealing all cards to two players I should not have any card on my hand 
=> []