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之间的偶数。
![](https://img.haomeiwen.com/i184712/ee3fa2a35e2e4354.png)
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多平台发布
网友评论