Python算法之旅字典的狂舞之石头剪刀布

作者 : 开心源码 本文共2272个字,预计阅读时间需要6分钟 发布时间: 2022-05-13 共228人阅读

字典的狂舞之石头剪刀布

小美:阿福,你玩过石头剪刀布游戏吗?

阿福:这是什么问题?谁还能没玩过石头剪刀布?要知道它可是一种世界闻名的猜拳游戏。它起源于中国,而后传到日本、朝鲜等地,随着亚欧贸易的不断发展它传到了欧洲,到了近现代逐步风靡世界。简单明了的规则(石头打剪刀,布包石头,剪刀剪布),使得石头剪刀布游戏没有任何规则漏洞可钻,单次玩法比拼运气,多回合玩法比拼心理博弈,使得石头剪刀布这个古老的游戏同时拥有“意外”与“技术”两种特性,深受世界人民喜爱。

小美:哟,你还知道的挺多。那你会编写程序和电脑玩石头剪刀布游戏吗?

阿福:这个应该不难,不就是几条分支语句吗?我今天就让你看看我扎实的基本功。


问题1:

函数功能:根据游戏规则和甲乙玩家出拳情况,输出石头剪子布游戏的结果。

函数名:rock_paper_scissors(s1:str,s2:str)->str

参数表:s1,s2– 字符串,分别表示甲乙两个人的出拳,只可能取值在{“石头”,”剪刀”,”布”}中。

返回值:字符串,存储了游戏结果,只可能取值在{“甲胜”,”乙胜”,”平局”}中。

示例1:s1=”石头”,s2=”剪刀”,返回”甲胜”;

示例2:s1=”石头”,s2=”布”,返回”乙胜”;

示例3:s1=”石头”,s2=”石头”,返回”平局”。


代码1:

defrock_paper_scissors(s1:str, s2:str)->str:

??? if s1 == s2:

??????? ans = “平局”

??? elif (s1 == “石头” and s2 == “剪刀” or

????????? s1 == “剪刀” and s2 == “布” or

????????? s1 == “布” and s2 == “石头”):?

??????? ans = “甲胜”

??? else:

??????? ans = “乙胜”

??? return ans

小美:嗯,程序的确符合算法要求,思路也还算清晰。但你不觉得代码有点长吗?

阿福:这还长?

小美:是啊,特别是那个elif语句,里面条件表达式太长了,and和or交织在一起,这样容易出错。

阿福:那倒是。不过也没办法,它就是要分成3种情况来判断。难道你有更好的方法?

小美:哈哈,初中生要向小学生请教了!我给你点提醒吧:利用Python里面的字典数据结构。

阿福:字典?我知道字典,它是用键值对存储元素的一种数据结构。但是它跟这道题目如同没什么关系啊。

小美:瞧瞧你这脑回路,亏你还知道键值对!我问你,本题中的出拳名称是不是各不相同,而且可以用字符串来存储?

阿福:是啊,我刚才就是这样做的。各不相同、字符串。。。。。。。哦,我明白了!我们可以使用出拳名称来作为字典元素的键,而后每种拳法的天敌作为其对应的值。例如R[“石头”]=”布”,表示”石头”的天敌是”布”,这样即可以直接利用字典的键值对来确定出拳的输赢关系了。

小美:总算开窍了。

阿福:没错,小美,今天从你这学到一招。现在我把代码写出来,你看看对不对。


代码2:

def rock_paper_scissors(s1:str,s2:str)->str:

??? #用字典存储各种手法的天敌关系

??? R= {“石头”:”布”, “剪刀”:”石头”, “布”:”剪刀”}

???if s1 == R[s2]: #s1是s2的天敌

???????ans = “甲胜”

???elif s2 == R[s1]:?

???????ans = “乙胜”

???else:

???????ans = “平局”

return ans


知识小贴士:

字典是一种可变容器模型,可存储任意类型对象,具备极快的查找速度。字典的每个元素都是一个键值对,其值可以取任何数据类型,但键必需是唯一且不可变的,如字符串,数字或者元组,这种结构类型也称之为映射。


古老师:哎呀,不好心思来晚了。学如逆水行舟,不进则退。阿福你要努力啊,不然就要被小学生超过了。不过你们今天使用的方法有点意思,利用字典的键值对,可以直接设置两个对象的关系,避免复杂的条件判断,的确是处理配对类问题的好方法。这样吧,我今天也不教新东西了,就给你们提供一个拓展练习,巩固一下今天的内容吧。


问题2:

碱基链配对:脱氧核糖核酸(DNA)由两条互补的碱基链以双螺旋的方式结合而成。而构成DNA的碱基共有4种,分别为腺瞟呤(A)、鸟嘌呤(G)、胸腺嘧啶(T)和胞嘧啶(C)。我们知道,在两条互补碱基链的对应位置上,A总是和T配对,G总是和C配对。你的任务就是根据一条单链上的碱基序列,给出对应的互补链上的碱基序列。

函数功能:根据输入的一条单链上的碱基序列,给出对应的互补链上的碱基序列。

函数名:match(chain:str)-> str

参数表:chain– 字符串,表示一条碱基链。这个字符串只含有大写字母A、T、G、C。

返回值:一个只含有大写字母A、T、G、C的字符串,为与输入的碱基链互补的碱基链。

示例1:chain=’ATATGGATGGTGTTTGGCTCTG’,返回’TATACCTACCACAAACCGAGAC’。


彩蛋:

阿福:小美啊,古老师出的这个题目和你出给我的几乎一模一样,我就不做重复的练习了。今天的话题是你挑起来的,这个光荣而艰巨的任务就交给你吧。

小美:不就是为4种碱基设置配对关系吗?这有何难!看我的。


代码3:

def match(chain:str) -> str:

??? #用字典存储各种碱基的配对关系

??? R= {‘A’:’T’, ‘T’:’A’, ‘G’:’C’, ‘C’:’G’}

??? a= []

???for c in chain:

???????a.append(R[c])

???return ”.join(a)

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » Python算法之旅字典的狂舞之石头剪刀布

发表回复