问题描述
我正在创建二十一点计分方法,并且试图将Ace移动到数组的末尾以便最后计数。我该怎么做?因为这不起作用
if hand.include?("Ace")
hand.map{ |card| hand.last(card) if card == "Ace" }
end
解决方法
两种方法有效。一种是将它们排序到最后:
hand = %w[ 2 9 4 Q 3 2 A T J 6 ]
hand.sort_by { |v| v == 'A' ? 1 : 0 }
# => ["6","9","4","Q","3","2","T","J","A"]
另一种方法是partition
:
hand.partition { |v| v != 'A' }.flatten
# => ["2","6","A"]
如果您有一个正确的Card
类,实现了ace?
之类的东西,那么这会更加容易:
hand.partition(&:ace?).reverse.flatten
您也可以这样设置,使得A
的排序为11,这样最后排在最后,如:
CARD_SORT_VALUE = Hash.new { |h,k| h[k] = k.to_i }.merge(
'J' => 10,'Q' => 10,'K' => 10,'A' => 11
).freeze
可以在其中进行排序的位置,例如:
hand.sort_by { |c| CARD_SORT_VALUE[c] }
同样,如果您有一个实现Comparable
的Card
类并且有一个<=>
方法可以进行排序,就像cards.sort
一样,那就更好了。
如果要解决“这只手有什么值”的一般问题,请考虑将值定义为数组,如:
CARD_VALUE = {
'2' => [ 2 ],'3' => [ 3 ],'4' => [ 4 ],'5' => [ 5 ],'6' => [ 6 ],'7' => [ 7 ],'8' => [ 8 ],'9' => [ 9 ],'T' => [ 10 ],'J' => [ 10 ],'Q' => [ 10 ],'K' => [ 10 ],'A' => [ 1,11 ]
}.freeze
然后您可以在其中处理所有可能的值组合以获得最终结果:
def hand_value(hand)
hand.map { |c| CARD_VALUE[c] }.inject([ [ ] ]) do |accum,arr|
accum.flat_map do |a|
arr.map do |v|
a + [ v ]
end
end
end.map(&:sum).uniq
end
如:
hand_value(%w[ A T Q ])
# => [21,31]
hand_value(%w[ A A 2 ])
# => [4,14,24]
,
如果Ace存在,则索引函数将返回其索引。有一个用于在特定索引处删除的数组方法,该方法返回已删除的元素。然后可以将返回的元素推到数组的后面。所有这些都可以在一行中完成,例如,违反LoD:
hand=["heart","spade","Ace","olive","branch"]
if hand.include?("Ace")
hand.push(hand.delete_at(hand.index("Ace")))
end
p hand #["heart","branch","Ace"]
注意:只有第一个“王牌”会被重新放置。