首页 > 试题广场 >

扑克牌大小

[编程题]扑克牌大小
  • 热度指数:96430 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

扑克牌游戏大家应该都比较熟悉了,一副牌由54张组成,含3~A、2各4张,小王1张,大王1张。牌面从小到大用如下字符和字符串表示(其中,小写joker表示小王,大写JOKER表示大王):
3 4 5 6 7 8 9 10 J Q K A 2 joker JOKER
输入两手牌,两手牌之间用"-"连接,每手牌的每张牌以空格分隔,"-"两边没有空格,如:4 4 4 4-joker JOKER。
请比较两手牌大小,输出较大的牌,如果不存在比较关系则输出ERROR。
基本规则:
(1)输入每手牌可能是个子、对子、顺子(连续5张)、三个、炸弹(四个)和对王中的一种,不存在其他情况,由输入保证两手牌都是合法的,顺子已经从小到大排列;
(2)除了炸弹和对王可以和所有牌比较之外,其他类型的牌只能跟相同类型的存在比较关系(如,对子跟对子比较,三个跟三个比较),不考虑拆牌情况(如:将对子拆分成个子);
(3)大小规则跟大家平时了解的常见规则相同,个子、对子、三个比较牌面大小;顺子比较最小牌大小;炸弹大于前面所有的牌,炸弹之间比较牌面大小;对王是最大的牌;

(4)输入的两手牌不会出现相等的情况。

数据范围:字符串长度:




输入描述:

输入两手牌,两手牌之间用"-"连接,每手牌的每张牌以空格分隔,"-"两边没有空格,如 4 4 4 4-joker JOKER。



输出描述:

输出两手牌中较大的那手,不含连接符,扑克牌顺序不变,仍以空格隔开;如果不存在比较关系则输出ERROR。

示例1

输入

4 4 4 4-joker JOKER

输出

joker JOKER
import sys

dd = {'3':3, 
      '4':4, 
      '5':5, 
      '6':6, 
      '7':7, 
      '8':8, 
      '9':9, 
      '10':10, 
      'J':11, 
      'Q':12, 
      'K':13, 
      'A':14, 
      '2':15, 
      'joker':16,
      'JOKER':17}

def func(left, right):
    l_list = left.split()
    r_list = right.split()
    l_len = len(l_list)
    r_len = len(r_list)
    # 有对王时,直接返回对王
    if left == 'joker JOKER' or right == 'joker JOKER':
        return 'joker JOKER'
    # 同类型的对比,同个子、对子、三个、**、顺子
    if l_len == r_len:
        if dd[l_list[0]] > dd[r_list[0]]:
            return left
        else:
            return right
    # 不同类型对比,如有有**,返回**
    if l_len == 4:
        return left
    if r_len == 4:
        return right
    # 规则不匹配
    return 'ERROR'

for line in sys.stdin:
    left, right = line.strip().split('-')
    print(func(left, right))

编辑于 2021-05-16 18:44:20 回复(0)
# 扑克牌大小 - HJ88
# 使用字典更加高效一点,按照牌面大小赋予字典值
# cond1: 大小王最大
# cond2: **压其他
# cond3: 同类型牌对比,i.e. 长度一致时,比较第一张大小。(因为已小到大排序)
# cond4: 不同类型(else),无法比较。输出(ERROR)
while True:
    try:
        D = {'3':0, '4':1, '5':2, '6':3, '7':4, '8':5, '9':6, '10':7, 'J':8, 'Q':9, 'K':10, 'A':11, '2':12, 'joker':13, 'JOKER':14}
        a, b = input().split('-')
        s1, s2 = a.split(), b.split()
        if a == 'joker JOKER'&nbs***bsp;b == 'joker JOKER': # cond1
            print('joker JOKER')
        elif len(s1) == 4&nbs***bsp;len(s2) == 4: # cond2
            if len(s1) != len(s2): 
                #当s1或s2其中一组为**长度为4,可能另外一组为顺子其长度为5。**赢
                print(a if len(s1) == 4 else b)
            else:
                print(a if D[s1[0]]>D[s2[0]] else b)
        elif len(s1) == len(s2): # cond3
            print(a if D[s1[0]]>D[s2[0]] else b)
        else: # cond4
            print('ERROR')
    except:
        break
发表于 2021-02-07 07:33:11 回复(0)
# 使用字典更加高效一点:使用字典来定义牌面值的大小
# 先判断是否有对王,有则输出对王
# 然后判断双方牌数是否相同,牌数相同时,按牌面值比,输出第一位较大的(包含**和**的比较)
# 当双方牌数不一样时,然后判断其中一方是否有**,有则输出**。否则,无法比较,输出ERROR。
while True:
    try:
        D = {'3':0, '4':1, '5':2, '6':3, '7':4, '8':5, '9':6, '10':7, 'J':8, 'Q':9, 'K':10, 'A':11, '2':12, 'joker':13, 'JOKER':14}
        a, b = input().split('-')
        s1, s2 = a.split(), b.split()
        if a == 'joker JOKER' or b == 'joker JOKER':
            print('joker JOKER')
        elif len(s1) == len(s2):
            print(a if D[s1[0]]>D[s2[0]] else b)
        elif len(s1) == 4:
            print(a)
        elif len(s2) == 4:
            print(b)
        else:
            print('ERROR')
    except:
        break

编辑于 2020-12-30 23:00:40 回复(0)
while True:
    try:
        kards = "345678910JQKA2"
        a, b = input().split("-")
        x, y = a.split(), b.split()
        if a=="joker JOKER"&nbs***bsp;b=="joker JOKER":
            print("joker JOKER")
        elif len(x) == len(y):
            print(a if kards.index(x[0])>kards.index(y[0]) else b)
        elif len(x) == 4:
            print(a)
        elif len(y) == 4:
            print(b)
        else:
            print("ERROR")
    except:
        break

发表于 2020-12-18 17:10:52 回复(0)
# 分支判断
while True:
    try:
        in_init = input().split('-')
        in_0 = str(in_init[0]).split()
        in_1 = str(in_init[1]).split()
        flag = 0 # 0左 1右
        flag_w = 0 # 0 无王
        table = {"3": 3, "4": 4, "5": 5, "6": 6, "7": 7, "8": 8, "9": 9, "10": 10, "J": 11, "Q": 12, "K" : 13, "A": 14, "2": 15}
        if "joker" in in_0:
            flag = 0
            flag_w = 1
        if "joker" in in_1:
            flag = 1
            flag_w = 1
        if flag_w == 0:
            new_0 = []
            new_1 = []
            for i in in_0:
                new_0.append(table[i])
            for i in in_1:
                new_1.append(table[i])
            
            if len(new_0)==4&nbs***bsp;len(new_1)==4: # 有**时判断
                if len(new_0)==4 and len(new_1)!= 0:
                    flag = 0
                elif len(new_0)!=4 and len(new_1)== 0:
                    flag = 1
                else:
                    if min(new_0)> min(new_1):
                        flag = 0
                    else :
                        flag = 1
            else:
                if len(new_0) !=len(new_1):
                    print('ERROR')
                    flag = 3 # 后面不用输出 
                else:
                    if min(new_0)> min(new_1):
                        flag = 0
                    else :
                        flag = 1
        if flag == 0:
            print(" ".join(in_0))
        elif flag == 1:
            print(" ".join(in_1))
    except:
        break

发表于 2020-08-21 21:46:25 回复(0)
a,b=input().split("-")
s1=list(a.split())
s2=list(b.split())
if a == "joker JOKER" or b=="joker JOKER" :
    print("joker JOKER") #先判断有无对王有则直接输出
elif len(s1)!=len(s2): #若两列牌不等判断是否有炸
    if len(s1)==4:      #若a是炸则输出a
        if s1[0]==s1[-1]:
            print(a)
    if len(s2)==4:     #若b是炸则输出b
        if s2[0]==s2[-1]:
            print(b)
    elif len(s2)!=4 and len(s1)!=4:#若没有**两手牌张数不等则报错
        print('ERROR')
elif len(s1)==len(s2):#若没有**,没有王,且手牌张数相等,则进行比较
    D={"3":0,"4":1,"5":2,"6":3,"7":4,"8":5,"9":6,"10":7,"J":8,"Q":9,"K":10,"A":11,"2":12,"joker":13,"JOKER":14}
    print(a if D[s1[0]]>D[s2[0]] else b)   #由于顺子已排好序且不是顺子此时就一定是牌面相同(均为某数字)的对子,个子,三个,只需比较第一张牌大小即可
        
     
发表于 2020-08-13 16:40:44 回复(0)
先用字母将A,2,JQK替换了,保证再用ascall比较的时候顺序和牌大小的顺序一样即可。然后就是下面几种情况,唯一注意的就是顺子就把A,和2换成字符的ascall比较小的就好了。
ra,rb = input().split('-')
def compare(a,b,ra,rb):
    return a>b and ra or rb
if ra == 'joker JOKER'or rb == 'joker JOKER':
    print('joker JOKER')
else:
    a = ra.replace('A','a').replace('2','b').replace('10','C').replace('J','D').replace('Q','E')
    b = rb.replace('A','a').replace('2','b').replace('10','C').replace('J','D').replace('Q','E')
    if len(a)==len(b):
        if len(a)==7:
            a = ra.replace('A','1')
            b = rb.replace('A','1')
        print(compare(a,b,ra,rb))
    else:
        if len(a)==7 or len(b) == 7:
            print(len(a)==7 and ra or rb)
        else:
            print('ERROR')


编辑于 2020-04-08 19:23:45 回复(1)
while True:
    try:
        s = input().split('-')
        player1 = s[0].split()
        player2 = s[1].split()
        # print(player1)
        # print(player2)
        def size(x):
            if x[0] == 'J':
                return 11
            elif x[0] == 'Q':
                return 12
            elif x[0] == 'K':
                return 13
            elif x[0] == 'A':
                return 14
            elif x[0] == '2':
                return 15
            elif x[0] == 'j':
                return 16
            elif x[0] == '10':
                return 10
            elif ord('3') <= ord(x[0]) <= ord('9'):
                return (ord(x[0]) - ord('3') + 3)

        if player1 == ['joker', 'JOKER'] or player2 == ['joker', 'JOKER']:
            print('joker JOKER')
        elif len(player1) == 4 and len(player2) != 4:
            print(s[0])
        elif len(player1) != 4 and len(player2) == 4:
            print(s[1])
        elif len(player1) == 4 and len(player2) == 4:
            if size(player1) > size(player2):
                print(s[0])
            else:
                print(s[1])

        elif len(player1) == 3 and len(player2) == 3:
            if size(player1) > size(player2):
                print(s[0])
            else:
                print(s[1])

        elif len(player1) == 5 and len(player2) == 5:
            if size(player1) > size(player2):
                print(s[0])
            else:
                print(s[1])

        elif len(player1) == 2 and len(player2) == 2:
            if size(player1) > size(player2):
                print(s[0])
            else:
                print(s[1])

        elif len(player1) == 1 and (len(player2) == 1 or player2 == '10'):
            if size(player1) > size(player2):
                print(s[0])
            else:
                print(s[1])

        elif len(player2) == 1 and (len(player1) == 1 or player1 == '10'):
            if size(player1) > size(player2):
                print(s[0])
            else:
                print(s[1])
        else:
            print('ERROR')
    except:
        break

编辑于 2020-03-30 15:14:15 回复(2)
value = {
    '3': 0,
    '4': 1,
    '5': 2,
    '6': 3,
    '7': 4,
    '8': 5,
    '9': 6,
    '10': 7,
    'J': 8,
    'Q': 9,
    'K': 10,
    'A': 11,
    '2': 12,
}

while True:
    try:
        s = input().split('-')
        a, b = s[0].split(), s[1].split()

        if 'joker' in a and 'JOKER' in a&nbs***bsp;'joker' in b and 'JOKER' in b:
            print('joker JOKER')
        elif len(a) == 4&nbs***bsp;len(b) == 4:
            if len(a) == len(b):
                print(s[0] if value[a[0]] > value[b[0]] else s[1])
            elif len(a) == 4:
                print(s[0])
            else:
                print(s[1])
        elif len(a) == len(b) and len(a) in [1, 2, 3, 5]:
            print(s[0] if value[a[0]] > value[b[0]] else s[1])
        else:
            print('ERROR')

    except:
        break

发表于 2020-03-24 16:20:22 回复(0)
while True:
    try:
        inp1,inp2=input().strip().split('-')
        #print(inp1)
        inp1=list(inp1.split(' '))
        inp2=list(inp2.split(' '))
        list1=['3','4','5','6','7','8','9','10','J','Q','K','A','2']
        def zhadan(inp):
            result=False
            if len(inp)>=4:
                if 'joker'and 'JOKER' in inp :
                    result=True
                for i in inp:
                    if inp.count(i)==4:
                        result=True
            elif 'joker'and 'JOKER' in inp:
                result=True
            else:
                result=False
            return result
        #print(zhadan(inp1))
        #print(zhadan(inp2))
        def shunzi(inp):
            result=False
            if len(inp)==5:
                index=list1.index(inp[0])
                if inp==list1[index:index+5]:
                    result=True
            return result
        #print(shunzi(inp1))
        #print(shunzi(inp1))
        def feiji(inp):
            result=False
            if len(inp)>=3:
                for i in inp:
                    if inp.count(i)==3:
                        result=True
            return result
        def duizi(inp):
            result=False
            if len(inp)>=2:
                for i in inp:
                    if inp.count(i)==2:
                        result=True
            return result
        #print(duizi(inp1))
        #print(duizi(inp1))
        result='ERROR'
        if zhadan(inp1) or zhadan(inp2):
            #print('ok')
            if zhadan(inp1) and not zhadan(inp2):
                #print('ok')
                result=inp1
            elif not zhadan(inp1) and zhadan(inp2):
                #print('ok')
                result=inp2
            elif zhadan(inp1) and zhadan(inp2):
                #print('ok')
                if 'joker'and 'JOKER' in inp1:
                    result=inp1
                elif 'joker'and 'JOKER' in inp2:
                    #print(inp2)
                    result=inp2
                    #print(result)
                else:
                    if list1.index(inp1[0])>list1.index(inp2[0]):
                        result=inp1
                    else:
                        result=inp2
        elif shunzi(inp1) and shunzi(inp2):
            #print('ok')
            if list1.index(inp1[0])>list1.index(inp2[0]):
                result=inp1
            else:
                result=inp2
        elif duizi(inp1) and duizi(inp2):
            #print(inp1[0])
            if list1.index(inp1[0])>list1.index(inp2[0]):
                #print('ok')
                result=inp1
            else:
                result=inp2
        elif feiji(inp1) and feiji(inp2):
            if list1.index(inp1[0])>list1.index(inp2[0]):
                result=inp1
            else:
                result=inp2
        else:
            if len(inp1)!=len(inp2):
                result='ERROR'
            else:
                num1=0
                num2=0
                for i in inp1:
                    num1+=list1.index(i)
                for i in inp2:
                    num2+=list1.index(i)
                if num1>num2:
                    result=inp1
                else:
                    result=inp2
        if result=='ERROR':
            print(result)
        else:
            print(' '.join(result))       

    except:
        break
发表于 2019-06-23 09:59:14 回复(0)
# 使用字典更加高效一点
# 先判断是否有火箭,有则输出火箭
# 然后判断双方牌数是否相同,输出第一位较大的
# 然后判断是否有**,有则输出**
while True:
    try:
        D = {'3':0, '4':1, '5':2, '6':3, '7':4, '8':5, '9':6, '10':7, 'J':8, 'Q':9, 'K':10, 'A':11, '2':12, 'joker':13, 'JOKER':14}
        a,b = input().split('-')
        s1,s2 = a.split(),b.split()
        if a == 'joker JOKER' or b == 'joker JOKER':
            print('joker JOKER')
        elif len(s1) == len(s2):
            print(a if D[s1[0]]>D[s2[0]] else b)
        elif len(a) == 7:
            print(a)
        elif len(b) == 7:
            print(b)
        else:
            print('ERROR')
    except:
        break


发表于 2019-03-16 16:50:27 回复(23)
这道题目中间含有漏洞吧,还是我理解的不对呢,两手牌面只是比较第一张的大小么,其他的票面不用比较么,还是说所有牌面大小的和作比较?两种方法都通过了测试,是因为测试用例里边全部是第一张票面就决定了一切的么?
发表于 2018-07-21 17:49:54 回复(0)
def compare(firsthand,secondhand):
    card = ['3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A', '2', 'joker', 'JOKER']
    firsthand=firsthand.split(' ')
    secondhand=secondhand.split(' ')
    if len(firsthand)==2 and card.index(firsthand[0])+card.index(firsthand[1])==27:return ' '.join(firsthand)
    if len(secondhand)==2 and card.index(secondhand[0])+card.index(secondhand[1])==27:return ' '.join(secondhand)
    if len(firsthand)==len(secondhand):
        if card.index(firsthand[0])>card.index(secondhand[0]):return ' '.join(firsthand)
        else:return ' '.join(secondhand)
    if len(firsthand)!=len(secondhand):
        if len(firsthand)==4 :return ' '.join(firsthand)
        if len(secondhand)==4:return ' '.join(secondhand)
        else:return 'ERROR'

while True:
    try:
        twohand = raw_input()
        if not twohand:break
        firsthand, secondhand = twohand.split('-')
        print compare(firsthand,secondhand)
    except:
        break

发表于 2017-09-20 10:19:59 回复(0)