gpt4 book ai didi

c - 我们如何有效地迭代卡片组合?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:16:11 25 4
gpt4 key购买 nike

有大量的扑克牌可能。我们想通过移除相似的牌来减少这种情况,以便我们可以遍历每个可能的组合。

为了做到这一点,可能的组合由长度为 52 的字符串表示,其中“0”表示卡片不存在,“1”表示卡片存在。

所以手2、3、4、5、6 颗红心将是:'0000000000000000000000000000000000000000000000011111'

2,4,10,红心 A 和梅花 3 将是:'0000000000000000000000000000000000000101000100000101'

等等……

这里前 13 位表示黑桃 A,K,Q,...4,3,2,接下来的 13 位用于钻石接下来的 13 个俱乐部最后 13 个是红桃

现在我们需要做的是,从一个二进制字符串的十进制值,将其还原为类似扑克手牌的二进制字符串,并返回其十进制值

所以当我说相似的手时我是什么意思:- - 黑桃 A,Q,7,6,2 = 梅花 AQ762 = 红心 AQ762 = 方 block AQ762所以它们的每一个二进制表示都可以化简为红心AQ762的二进制表示,是最小的 - 类似地,一手黑桃 2、3、4、5 和方 block A 相当于红心 A 和梅花 2、3、4、5,因此前者可以简化为后者。

AsKsQsJsTs = 1111100000000000000000000000000000000000000000000000
AcKcQcJcTc = 0000000000000000000000000011111000000000000000000000
AdKdQdJdTd = 0000000000000111110000000000000000000000000000000000
AhKhQhJhTh = 0000000000000000000000000000000000000001111100000000

Ac5s4s3s2s = 0000000001111000000000000010000000000000000000000000
Ah5c4c3c2c = 0000000000000000000000000000000000011111000000000000
Ac5d4d3d2d = 0000000000000000000000111100000000000001000000000000

但我知道:

AKQJTs == AKQJTc == AKQJTd == ... are same, because combination have same strength in poker, we can simplify suits
Ac5432s == Ah5432c == Ah5432d == ... are same

我认为我们可以对花色进行抽象:[1]、[2]、[3]、[4]

[1] - new first suit, suit of highest card
[2] - second suit if we are going down from highest card


65432[1] == 65432s == 65432c == 65432d == ..
6[1]5432[2] == 6c5432s == 6h5432c == 6c5432d == ..

最高牌的第一套是[1],下一套是[2]......

面具将是:

AKQJTs=AKQJTc=AKQJTd=AKQJTh = 0000000000000000000000000000000000000001111100000000 = 7936

Ah5432c=Ac5432d= ... = 0000000000000000000000000000000000011111000000000000 = 126976

我如何才能有效地进行这种掩码转换?

喜欢 - simplyfyMask(4362862139015168) = 7936simplyfyMask(1040187392) = 126976

PS:如果我要使用另一个掩码:Aces - 0,1,2,3,Kings - 4,5,6,7,Jacks - 8,9,10,11 - 比特?

最佳答案

在您提供的示例中:simplyfyMask(1040187392) = 126976您可以进一步减少:
来自 -0000000000000000000000000000000000011111000000000000
到 - - -0000000000000000000000000000000000000011000000001110
因为他们在扑克牌中的等级相同

这是一个 python 代码(希望这有帮助,我不是 C 程序员,所以没有用 C 语言回答)

def replaceByindex(string, index, value) :
li = list(string)
li[index] = value
return ''.join(li)

def checkFlush(string) :
for suit in range(4) :
count = 0
# print(suit,'-th suit check for flush')
for card in range(13) :
if string[suit*13 + card] != '0' :
count += 1
if count == 0 :
continue
elif count == 5 :
# print('Flushed')
return True
else :
# print(count,'cards counted for',suit,'-th suit')
return False

def unFlushify(string) :
if checkFlush(string) :
for card in range(13) :
index = 51 - card
if string[index] == '2' :
string = replaceByindex(string,index-13,'2')
string = replaceByindex(string,index,'0')
break
return string

def simplifyMask(num) :
num = bin(num)
num = num[2:]
size = len(num)
num = '0'*(52-size) + num
# print(num, len(num))
count = 0
i = 0
if not checkFlush(num) :
while i<52 and count<5 :
if num[i] == '1' :
count += 1
tgt_index = 39 + i%13
updated = False
while tgt_index>i and num[tgt_index] != '0' :
tgt_index -=13
if tgt_index <= i :
num = replaceByindex(num,i,'2')
else :
num = replaceByindex(num,i,'0')
num = replaceByindex(num,tgt_index,'2')
i+=1
num = unFlushify(num)
else :
while i<52 and count<5 :
if num[i] == '1' :
count+=1
num = replaceByindex(num,i,'0')
num = replaceByindex(num,39+i%13,'2')
return num.replace('2','1')


num = int(input())
number = simplifyMask(num)
print(int(number,2),number)

我认为自己是编码方面的初学者,因此这可能不是最高效的一段代码,但这应该能让您了解如何继续。 :)

关于c - 我们如何有效地迭代卡片组合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45856449/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com