将特定值移动到随机填充数组的末尾

问题描述

我正在创建二十一点计分方法,并且试图将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] }

同样,如果您有一个实现ComparableCard类并且有一个<=>方法可以进行排序,就像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"]

注意:只有第一个“王牌”会被重新放置。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...