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

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 -1

def 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 random

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 '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!!!'

    原文作者:shenpengjianke
    原文地址: https://blog.csdn.net/shenpengjianke/article/details/26623757
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞