美文网首页算法
Python算法之旅字典的狂舞之石头剪刀布

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

作者: 巧若拙 | 来源:发表于2020-01-14 21:02 被阅读0次

    字典的狂舞之石头剪刀布

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

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

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

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


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

    相关文章

      网友评论

        本文标题:Python算法之旅字典的狂舞之石头剪刀布

        本文链接:https://www.haomeiwen.com/subject/xdzaactx.html