arrays - 将特定值移动到随机填充数组的末尾
问题描述
我正在创建一个二十一点计分方法,并且我正在尝试将 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", "2", "T", "J", "A"]
另一个是partition
喜欢这样:
hand.partition { |v| v != 'A' }.flatten
# => ["2", "9", "4", "Q", "3", "2", "T", "J", "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] }
同样,如果您有一个Card
实现Comparable
并具有<=>
允许排序的方法的类,那就更好了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]
推荐阅读
- oracle - 表正在变异,触发器/函数可能看不到它错误 oracle db
- aws-iam - AWS 访问密钥,无需访问控制台
- avaudiosession - AudioKit:当应用程序在后台时始终出现红色麦克风图标
- javascript - 在javascript中计算时间
- html - 链接跨越整个页面(使用图像作为链接)
- jquery - 使用 Ajax 从外部网页显示 CSS 和 HTML
- swift - 我的相机应用程序的 Swift 代码中有几个错误
- escaping - 防止 Excel 在 JXL API 创建的文件中使 URL 可点击
- java - 如何使用 Springboot 和 Thymeleaf 使用 LocalTime 在两个日期之间进行验证
- typescript - 从没有属性或属性列表的接口创建类型