美文网首页
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