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)
代码说明
- 数值转换:通过
rank_map将字母点数统一转为数值,解决原代码无法处理字母的问题; - 去重校验:排除对子、三条等非顺子的重复点数情况;
- 双场景判断:同时覆盖常规顺子和特殊顺子的逻辑,确保所有合法情况都能被识别。
内容的提问来源于stack exchange,提问作者鈴木悠真
相关产品推荐
相关产品推荐

