Python入门经典——编程项目(三)

来源:互联网 发布:网络词草根是什么意思 编辑:程序博客网 时间:2024/05/29 04:10

1. DNA 排序

    DNA排序指确定DNA分子中的腺嘌呤、胸腺嘧啶、胞嘧啶和鸟嘌呤碱基的顺序、标准表示法的基础使用其首字母(ATCG),所以DNA是用4个字符构成的字符串。DNA字符串可能会有百万个单位(字符)长。

    子串匹配(substring matching)是一个过程,确定一个较短的字符串(子串)是否包含在一个较长的字符串中。子串匹配在从片段重构未知的DNA串和在已知的DNA串中寻找感兴趣的子串等应用中都起着重要作用。

    Python提供了find(subsring,start,end)字符串方法,返回子串的最小索引位置(整数在start≤index≤end范围内)。start和end参数是可选的,在这个联系中,要求输入它们。如果没有找到子串,则返回-1.

(a)不使用find字符串方法,编写函数,实现与find字符串方法相同的功能。由于函数不是字符串方法,一次要搜索的字符串必须作为第一个参数。函数的最终格式将是:find(someString,subString,start,end)。

(b)生物学的研究人员需要找到所有子串的位置,而不只是第一次出现的位置,编写名为multiFind(someSrting,subString,start,end)的函数,不返回整数索引,而是返回字符串,其中包含用逗号分隔的零个或多个索引位置。在此例中,该字符串将包含代表整数索引的数字。如果没有找到子串,则返回空串。可以使用前面自己编写的find方法。

def find(someStr, subStr, start = 0, end = 'max'):    if end == 'max':        end = len(someStr)    index = start    for char in someStr[start: end]:         if char == subStr[0] and someStr[index:index+len(subStr)] == subStr:             return index         index += 1             return -1def multiFind(someStr, subStr, start=0, end='max'):    if end == 'max':        end = len(someStr)        index = start    indexStr = ''    indexList = []    indexListCopy = []    for char in someStr[start:end]:        result = str(find(someStr, subStr, index,end))        if result != '-1':            indexList.append(result)        index += 1    for i in indexList:        if i not in indexListCopy:            indexListCopy.append(i)    indexStr = ''.join(indexListCopy)            return indexStr


2. 豆堆

        我们要玩的游戏称为《豆堆》。游戏开始(现在堆里有16颗豆子)时,有两个玩家。每个玩家都可以从堆中的16颗豆子中取出1颗、2颗或者3颗豆子。每个玩家在每回合中必须从堆中取出一定数目的豆子。玩家轮流取出豆子,取到最后一颗豆子的玩家是输家。

        每个玩家用一个函数表示,因此将有两个函数。每个函数都接受一个参数,表示目前豆子的数目,并返回player函数轮流执行后剩余的豆子数目、在player函数的操作后,函数输出豆子的数目。

        此外还需要住程序。主程序将豆堆中豆子数量初始化为16,然后交替调用第一个player函数和第二个player函数,知道某个玩家取到最后一颗豆子时结束。主函数输出谁是输家,然后退出。

(a)编写简单的player函数,例如总是取出一颗豆子。它不是很有趣,但可以用来测试程序。

(b)现在做有趣的部分。比如“smart player”函数,与其他玩家比较,看谁能获胜

测试代码:

import randomdef player_human(n):    print '-'*26    print 'In human process:'    while(1):        guess_human = int(raw_input('The human guess is: '))        if 1 <= guess_human <= 3:            break        else:            print 'The input must greater than 0 and less than 4!'    print 'The remaining is', (n - guess_human)    return (n - guess_human)def player_computer(n):    print '-' * 26    print 'In computer process:'    guess_computer = random.randint(1,3)    print 'The computer guess is:',guess_computer    print 'The remaining is', (n - guess_computer)    return n - guess_computer    def main():    computer_win = False    total = 16    while(1):       total =  player_human(total)       if total <= 0:           computer_win = True           break       total = player_computer(total)       if total <= 0:           computer_win = False           break            if computer_win:        print 'Computer Win!!!'    else:        print 'Human Win!!!'

这是一个Take-Away Games,强烈推荐大家先看一看这篇英语论文,介绍的比中文翻译强太多了:

http://www.math.ucla.edu/~tom/Game_Theory/Contents.html

要想电脑必胜,电脑必须是后手。代码部分只修改了player_computer()函数

Smart Player版本:

def player_human(n):    print '-'*26    print 'In human process:'    while(1):        guess_human = int(raw_input('The human guess is: '))        if 1 <= guess_human <= 3:            break        else:            print 'Input Error!'    print 'The remaining is', (n - guess_human)    return (n - guess_human)def player_computer(n):    print '-' * 26    print 'In computer process:'    guess_computer = n % 4    print 'The computer guess is:',guess_computer    print 'The remaining is', (n - guess_computer)    return n - guess_computer    def main():    computer_win = False    total = 16    print 'The total beans is', total    print 'The input should greater than 0 and less than 4'    while(1):       total =  player_human(total)       if total <= 0:           computer_win = False           break       total = player_computer(total)       if total == 0:           computer_win = True           break            if computer_win:        print 'Computer Win!!!'    else:        print 'Human Win!!!'

0 0