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