您当前的位置: 首页 >  Python

星拱北辰

暂无认证

  • 0浏览

    0关注

    1205博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

【Python】Magician“专属”神秘的“读心术”

星拱北辰 发布时间:2019-10-07 10:32:38 ,浏览量:0

贴吧里有这样一个题目 在这里插入图片描述 下面楼主的补发: 在这里插入图片描述 这种魔术看起来是有魔术师有“读心术”? 实际上不然。 奥秘在于助手的出牌顺序,这背后有一套算法,展示后魔术师经过计算已经知道了最后一张牌的值(每张牌有一个编号),对应的可以找到隐藏的牌。

我的思路是这样的(这是编程设计算法的思路,查阅过一些资料总结的): 首先只有4种花色,抽5张牌,根据鸽巢原理(鸽洞原理),必定有重花色的情况出现。 然后一种花色只有13张牌,围成一个圈,最远的距离是6(双向可达)。 So,我们作如下规约:

  • 藏匿的卡牌花色与第一张相同
  • 藏匿卡牌的字面值与第一张相距在1~6之间(毕竟不能重复,0是不存在的)
  • 1~6 的距离由第2张~第4张展示的牌的大小顺序呈现(按照编号而不是字面值)
    • (小->中->大)= 1
    • (小->大->中)= 2
    • (中->小->大)= 3
    • (中->大->小)= 4
    • (大->小->中)= 5
    • (大->中->小)= 6
  • 编号顺序花色从Club(梅花)->Diamond(方片)->Heart(红心)->Spade(黑桃)
  • 花色内部编号从小到大A->2->3->…->K(与斗地主不同啊)
  • 依据先补满同字面值的花色再往后延伸字面值到K的顺序来编号

规约就是这样,然后就可以搞事情了嘿嘿嘿~~~

下面放出来Python描述的代码实现:

# 你可以读心术——随机抽取五张牌,其中一张隐藏起来,按照特定的顺序给四张牌,你就能知道第五张牌是什么!

# deck是一个字符串列表,每个字符串是一张卡。名单上卡片的顺序很重要!!
deck = ['A_C', 'A_D', 'A_H', 'A_S', '2_C', '2_D', '2_H', '2_S',
        '3_C', '3_D', '3_H', '3_S', '4_C', '4_D', '4_H', '4_S',
        '5_C', '5_D', '5_H', '5_S', '6_C', '6_D', '6_H', '6_S',
        '7_C', '7_D', '7_H', '7_S', '8_C', '8_D', '8_H', '8_S',
        '9_C', '9_D', '9_H', '9_S', '10_C', '10_D', '10_H', '10_S',
        'J_C', 'J_D', 'J_H', 'J_S', 'Q_C', 'Q_D', 'Q_H', 'Q_S',
        'K_C', 'K_D', 'K_H', 'K_S']


# 给5张牌,助手会藏一张合适的牌,TA仔细挑选了剩下的四张卡片,然后把它们读出来!
def AssistantOrderCards():
    print('Cards are character strings as shown below.')
    print('Ordering is:', deck)
    # 初始化
    cards, cind, cardsuits, cnumbers = [], [], [], []
    numsuits = [0, 0, 0, 0]
    # 将卡片作为用户/观众的输入
    # 填写各种数据结构
    for i in range(5):
        print('Please give card', i + 1, end=' ')
        card = input('in above format: ')
        cards.append(card)
        n = deck.index(card)
        cind.append(n)
        cardsuits.append(n % 4)
        cnumbers.append(n // 4)
        numsuits[n % 4] += 1
        if numsuits[n % 4] > 1:
            pairsuit = n % 4
    # 从5个相同的套装中找出两张牌。保证存在
    cardH = []
    for i in range(5):
        if cardsuits[i] == pairsuit:
            cardH.append(i)
    # 找出需要隐藏的卡和要编码的号码
    hidden, other, encode = outputFirstCard(cnumbers, cardH, cards)
    remindices = []
    for i in range(5):
        if i != hidden and i != other:
            remindices.append(cind[i])
    # 按升序排列这三张牌
    sortList(remindices)
    # 给定需要编码的号码,对卡片进行适当的排序
    outputNext3Cards(encode, remindices)
    return


# 这个程序可以根据距离隐藏哪张卡。两张牌之间有相同的套装。它返回隐藏卡、第一张暴露卡和距离。
def outputFirstCard(ns, oneTwo, cards):
    encode = (ns[oneTwo[0]] - ns[oneTwo[1]]) % 13
    if 0             
关注
打赏
1660750074
查看更多评论
0.0559s