You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言中如何将字母向量转为数值向量?附扑克牌顺子场景

R语言扑克牌顺子判断解决方案

一、字母向量转数值向量

对于字母到数值的映射,最直接的方式是使用命名向量建立对应关系,通过索引快速转换:

自定义映射(对应你示例的c("A","B","C")→c(10,20,30))

# 创建自定义映射规则
custom_map <- c("A" = 10, "B" = 20, "C" = 30)
# 转换向量
letters_vec <- c("A", "B", "C")
nums_vec <- custom_map[letters_vec]
nums_vec
# 输出: A  B  C 
#       10 20 30

扑克牌点数映射(适配你的实际场景)

针对扑克牌的A、J、Q、K,建议将A映射为14(方便判断10-J-Q-K-A的顺子),其余字母按常规规则映射:

rank_map <- c("A" = 14, "2" = 2, "3" = 3, "4" = 4, "5" = 5, 
              "6" = 6, "7" = 7, "8" = 8, "9" = 9, "10" = 10, 
              "J" = 11, "Q" = 12, "K" = 13)

二、顺子判断的完整实现

结合扑克牌的两种合法顺子(常规顺子、A-2-3-4-5特殊顺子),可以编写如下判断函数:

# 定义顺子判断函数
is_straight <- function(hand_ranks) {
  # 将手牌点数转换为数值
  nums <- rank_map[hand_ranks]
  # 顺子需要5个不同点数,先去重校验
  nums_unique <- unique(nums)
  if (length(nums_unique) != 5) return(FALSE)
  
  # 常规顺子:排序后相邻点数差全为1
  sorted_nums <- sort(nums_unique)
  regular_straight <- all(diff(sorted_nums) == 1)
  
  # 特殊顺子(A-2-3-4-5):包含A(14)且同时包含2、3、4、5
  special_straight <- (14 %in% nums_unique) && all(c(2,3,4,5) %in% nums_unique)
  
  # 满足任意一种情况即为顺子
  regular_straight || special_straight
}

# 测试用例验证
test_cases <- list(
  c("A","2","3","4","5"),   # 特殊顺子 → TRUE
  c("10","J","Q","K","A"),  # 常规顺子 → TRUE
  c("3","4","5","6","7"),   # 常规顺子 → TRUE
  c("A","K","Q","J","10"),  # 常规顺子 → TRUE
  c("2","3","4","5","7"),   # 非顺子 → FALSE
  c("A","A","2","3","4")    # 有重复点数 → FALSE
)

# 输出测试结果
sapply(test_cases, is_straight)

代码说明

  1. 数值转换:通过rank_map将字母点数统一转为数值,解决原代码无法处理字母的问题;
  2. 去重校验:排除对子、三条等非顺子的重复点数情况;
  3. 双场景判断:同时覆盖常规顺子和特殊顺子的逻辑,确保所有合法情况都能被识别。

内容的提问来源于stack exchange,提问作者鈴木悠真

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 13:10:59