python石头剪刀布游戏字典_Python算法之旅字典的狂舞之石头剪刀布

字典的狂舞之石头剪刀布

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

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

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

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

问题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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值