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 stringstring.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) #输出结果

输出加密后的密文

"qpegwrqpcokfpkijvftgctayjkngkrqpfgtgfygcmcpfygctaqxgtocpacswckpvcpewtkqwuxqnwogqhhqtiqvgpnqtgyjkngkpqffgpgctnapcrrkpiuwffgpnavjgtgecogcvcrrkpicuqhuqogpgigpvnatcrrkpitcrrkpicvoaejcodgtfqqtvkuqogxkukvqtkowvgtgfvcrrkpicvoaejcodgtfqqtqpnavjkucpfqvjioqtg"

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

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相关推荐

  1. 加加减减的奥秘——从数学到魔术的思考(三)

    爱学习,勤思考:学数学,玩魔术 在前面两期的系列文章中,(见公众号历史消息或菜单)传送门: 加加减减的奥秘--从数学到魔术的思考(一) 加加减减的奥秘--从数学到魔术的思考(二) 我们已经从数学原理的 ...

  2. 关于洗牌的研究(六)——从数学到魔术之完美洗牌

    爱学习,勤思考:学数学,玩魔术.欢迎点击头部蓝字关注MatheMagician,这里有你要的奇迹! 写再前面:本系列作品由MathMagician独家首发,一共有七篇,从数学和魔术两个角度对日常生活中 ...

  3. 约瑟夫问题与魔术(九)——魔术《五重巧合之皇家同花顺》

    本文是<约瑟夫问题与魔术>系列作品的第九篇,之前的作品回顾请戳: 约瑟夫问题与魔术(八)--魔术<四重巧合之金刚> 约瑟夫问题与魔术(七)--魔术<The Austral ...

  4. 抽样方法,采样方法 shuffle

    20210114 def dataset_split(data):# 数据拆分 第二步try:# data = shuffle(data)# train = data.iloc[0:int(data. ...

  5. Spark Shuffle原理解析

    Spark Shuffle原理解析 一:到底什么是Shuffle? Shuffle中文翻译为"洗牌",需要Shuffle的关键性原因是某种具有共同特征的数据需要最终汇聚到一个计算节 ...

  6. Spark shuffle调优

    Spark shuffle是什么 Shuffle在Spark中即是把父RDD中的KV对按照Key重新分区,从而得到一个新的RDD.也就是说原本同属于父RDD同一个分区的数据需要进入到子RDD的不同的分 ...

  7. 2.27 MapReduce Shuffle过程如何在Job中进行设置

    一.shuffle过程 总的来说: *分区 partitioner *排序 sort *copy (用户无法干涉) 拷贝 *分组 group 可设置 *压缩 compress *combiner ma ...

  8. spark调优(一)-开发调优,数据倾斜,shuffle调优

    主要分为开发调优.资源调优.数据倾斜调优.shuffle调优几个部分. 开发调优和资源调优是所有Spark作业都需要注意和遵循的一些基本原则,是高性能Spark作业的基础:数据倾斜调优,主要讲解了一套 ...

  9. Map Reduce Shuffle

    在hadoop技术体系MapReduce中,Shuffle是比较重要的一个环节.对理解好Shuffle对往后的MapReduce调优将起到非常大的作用. 以下是我个人对MapReduce Shuffl ...

最新文章

  1. PCL点云特征描述与提取(3)
  2. 达人眼中的WINCE网络驱动
  3. 前端如何搭建一个成熟的脚手架
  4. 腾讯觅影:AI+医疗不光能诊断癌症,还可以很公益
  5. [NOI2012(bzoj2879)(vijos1726)]美食节 (费用流)
  6. 运行Lattice Diamond时报错 License checkout failed的解决方法
  7. Ubuntu 对比度调节
  8. Verilog 常规数据定义
  9. Oracle SQL语句优化【4】之使用SQL优化工具
  10. 说说自己,向前看远些,路还要走下去的
  11. 移动光猫(吉比特TEWA-272G)进入高级管理界面的简单方法
  12. Android 视频缩放/放大
  13. oracle查询一年的第几周,Oracle--计算某一日期为一年中的第几周
  14. WebSphere如何重启服务
  15. MathType如何编辑大三角形符号
  16. # ** Error: ../tb/bfm/bfm_tb_ddr3/bfm_tb_ddr3.v(186): Illegal task output argument.
  17. 电子行报告:从海外龙头发展历程看国内半导体设备企业投资价值
  18. Win10 添加虚拟打印机
  19. 怎么复制window上的内容到linux,怎样将文件从window系统复制到远程linux系统上
  20. 【GA TSP】基于matlab遗传算法求解旅行商问题【含Matlab源码 1337期】

热门文章

  1. 回馈 LAND 拥有者支持,SAND 新年空投活动来啦
  2. Qt OpenGL(二十)——Qt OpenGL 核心模式版本
  3. 158_百度输入法如何sj打出当前时间戳
  4. javassist编程指南(一)
  5. 下载的文件为什么会误报病毒?
  6. 电商运营年度报告怎么做?看这篇文章就够了
  7. 第三章 基本数据类型
  8. Radmin远程管理全解析
  9. (转载) VS编译duilib项目时候的错误解决方法整理
  10. react fetch请求