美文网首页
faro shuffle

faro shuffle

作者: Python_Camp | 来源:发表于2022-09-25 15:13 被阅读0次

    Python中阶:faro shuffle洗牌

    图片
    今天的任务有难度。编程思路是关键的关键!
    场景:扑克洗牌
    通常高手洗牌做到每一张都能洗开。52张牌分成左右平均分两摞,将右手牌第一张插入左手牌第一和第二张之间,依此类推,完美洗开。此称之为faro shuffle洗牌。
    faro shuffle洗牌原始的底牌仍然在底部,原始的上牌仍然在顶部。比如如果共有6张牌

    ['ace', 'two', 'three', 'four', 'five', 'six']
    

    洗第一次顺序变为

    ['ace', 'four', 'two', 'five', 'three', 'six' ]
    

    If 8 perfect faro shuffles are performed on a deck of 52 playing cards, the deck is restored to its original order.
    Write a function that inputs an integer n and returns an integer representing the number of faro shuffles it takes to restore a deck of n cards to its original order.
    Assume n is an even number between 2 and 2000.

    如果在一副52张扑克牌上进行8次完美的法罗洗牌,牌组将恢复到原来的顺序。编写一个函数,输入一个整数n并返回一个整数,该整数表示将一组n张牌恢复到其原始顺序所需的faro洗牌次数。
    假设n是介于2和2000之间的偶数。

    arr = ['A','K','Q','J','9','8']
    arr[0] = arr[0]
    arr[1] = arr[3]
    arr[2] = arr[1]
    arr[3] = arr[4]
    arr[4] = arr[2]
    arr[5] = arr[5]
    
    
    print(arr)  #结果不对,因为赋值覆盖了前面的赋值
    ['A', 'J', 'J', '9', 'J', '8']
    
    

    Python按顺序执行,前面分6步执行赋值导致结果不符
    考虑一行代码搞定数组 6 个元素的赋值

    arr = ['A','K','Q','J','9','8']
    print(arr[0:6:2],arr[1:6:2])
    arr = arr[0:6:2] + arr[1:6:2]
    
    print(arr)
    ['A', 'Q', '9'] ['K', 'J', '8']
    

    符合预期结果!

    函数形式接受一个参数就是扑克牌的数量deck_size

    def faro_cycles(deck_size):
    
        arr, count = list(range(deck_size)), 0
    
        original_arr = arr
    
        while True:
    
            arr = arr[0:deck_size:2] + arr[1:deck_size:2]
    
            count += 1
    
            if original_arr == arr:
    
                break
    
        return count
    

    并列”可乐空罐换可乐“,本题目也是学习while循环的好例子,也是数组地址应用的绝佳案例!

    恺撒密码对数组切片的运用也值得称道

    如何定义函式数字母转数字,数字转回字母

    
    > number_to_letter()
    
    
    > 从字母到数字()
    
    > caesar_shift_single_character(l, amount)
    
    > caesar_shift(text, amount)
    
    

    字母表如何实现?

    alphabet = "abcdefghijklmnopqrstuvwxyz"
    

    运用导入string

    import string
    string.ascii_letter
    

    在字母和数字之间进行转换,最高可达26

    def number_to_letter(i):
    
        return alphabet[i%26] 
    
            #%26做绕口令
    
    def letter_to_number(l):
    
        return alphabet.find(l) # 字母表中的索引
    
    

    如何对单个字符(无论是否为字母)进行编码

    def caesar_shift_single_character(l, amount):
    
        i = letter_to_number(l)
    
        if i == -1: 
        # character not found in alphabet
    
          return ""                   
          # remove it, it's space or punctuation
    
        else:
    
          return number_to_letter(i + amount) 
                 # Caesar shift
    
    

    如何对一个完整的文本进行编码

    
    def caesar_shift(text, amount):
        shifted_text = ""
        for char in text.lower(): 
        # 也将大写字母转换为小写字母
           shifted_text += caesar_shift_single_character(char, amount)
    
          return shifted_text
    

    主程序

    输入需要加密的原文

    message = """
    
    Once upon a midnight dreary, while I pondered, weak and weary,Over many a quaint and curious volume of forgotten lore—
    
    While I nodded, nearly napping, suddenly there came a tapping,As of some one gently rapping, rapping at my chamber door—
    
    "'Tis some visitor," I muttered, "tapping at my chamber door—
    Only this and nothing more."
    
    """
    

    译文:

    message = """
    
    曾几何时,在一个沉闷的午夜,当我虚弱而疲惫地思索着。
    
    思考许多被遗忘的古朴而好奇的传说
    
    当我点点头,几乎打盹时,突然传来一阵敲击声。
    
    就像有人轻轻地拍打着我的房门。
    
    "是某个访客,"我喃喃自语,"敲打我的房门
    
    只有这个,没有别的。"
    
    """
    
    
    code = caesar_shift(message, 2)
    
    print(code) #输出结果
    
     
    

    输出加密后的密文

    "qpegwrqpcokfpkijvftgctayjkngkrqp
    fgtgfygcmcpfygctaqxgtocpacswckpvc
    pewtkqwuxqnwogqhhqtiqvgpnqtgyjkng
    kpqffgpgctnapcrrkpiuwffgpnavjgtge
    cogcvcrrkpicuqhuqogpgigpvnatcrrkp
    itcrrkpicvoaejcodgtfqqtvkuqogxkuk
    vqtkowvgtgfvcrrkpicvoaejcodgtfqqt
    qpnavjkucpfqvjioqtg"
    

    练手之二 密码中出现次数最多的字母是?

    
    text = code
    
    alphabet = "abcdefghijklmnopqrstuvwxyz"
    
    def count_most(text):   #a-z遍历26字母表 
    
        bench,res = 0,sorted(text)
    
        for e in alphabet:
    
            #e_most是出现次数最多的字母,bench是出现总次数
    
            if res.count(e) > bench: 
    
                bench = res.count(e)
    
                e_most = e
    
        return e_most,bench
    
    print(count_most(text))
    

    本文由mdnice多平台发布

    相关文章

      网友评论

          本文标题:faro shuffle

          本文链接:https://www.haomeiwen.com/subject/bbszortx.html