简单的例子,但我想了解它是如何完成的,所以我可以应用它,否则我有一个包含6个元素的主数组。我想从主数组中取出3个元素并将其放入数组中,然后从主数组中取出其他3个元素并将它们放入b数组中。我会用这个来将它应用于两张牌手的发牌卡
main = [1, 2, 3, 4, 5, 6]
a = [ ]
b = [ ]
答案 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 :(得分: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]
答案 2 :(得分:1)
所有人都可能给出了正确的答案,但正如我从你的问题中所理解的那样( I will use this to apply it to dealing cards to two players
)当你发牌时,当你向牌main
阵列发牌时应该从self数组中删除该元素以克服冗余问题(重复)。当您处理所有卡片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
=> []
答案 3 :(得分:0)
你有很多方法可以在Ruby中做同样的事情。拆分数组也不例外。许多答案(和评论)告诉你一些方法。如果你的程序正在交易卡,你不会就此止步。首先,你可能会有超过6张牌。其次,你可能会有超过2名球员。假设卡片是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表达式,它还返回最后执行的表达式的值(即each_slice所在的行)。我们试一试:
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!
Ruby的优点在于其简单的语法以及它在解决问题时试图摆脱困境的事实,因此您可以更多地关注实际问题而不是代码。