练习 9-7 寻找一个包含3组连续的成对字母的单词。例如单词committee,如果去掉字母i就是满足要求的,而单词Mississippi如果去掉字母i也是满足要求的。编写一个程序来找到它。
1 fin = open('words.txt')
2
3 def findThreeContinuous():
4 for line in fin:
5 word = line.strip()
6 index = 0
7 while(index+5 < len(word)):
8 if(word[index]==word[index+1])and(word[index+2]==word[index+3])and(word[index+4]==word[index+5]):
9 print word
10 index = index + 1
11
12 findThreeContinuous()
9-8 “有一天我正在高速公路上开车,碰巧注意到里程表。和大部分里程表一样,它显示6位整数的英里数。所以,例如我的车有300000英里里程,则会看到3-0-0-0-0-0。”
“那天我看到的里程数很有意思。我发现最后4位数是回文的;也就是说,他们无论是正序还是逆序看都一样。例如5-4-4-5是一个回文,所以我的里程表可能显示为3-1-5-4-4-5。”
“1英里之后,后5位数组成一个回文。例如,它可以是3-6-5-4-5-6。再过1英里,6位数的中间4位是一个回文。而接下来,你准备好了么?又1英里过去,所有的6位数都成了回文!”
“问题是,我第一次看里程表时,它的示数是多少?”
编写一个Python程序,检测全部6位数,并打印出可以满足上面这些要求的数字。
1 def is_pali(digit,start,length):
2 string = str(digit)[start:start+length]
3 return string == string[::-1]
4
5 def verify(digit):
6 return is_pali(digit,2,4)and is_pali(digit+1,1,5)and is_pali(digit+2,1,4)and is_pali(digit+3,0,6)
7
8 def findmileage():
9 for miles in range(100000,1000000):
10 if(verify(miles)):
11 print miles
12
13 findmileage()
14
练习 9-9 “最近我访问母亲家,并发现我的年龄的两位数正好是她的年龄的两位数的倒序。例如,如果她是73岁,我是37岁。我们好奇这种事情这些年来发生过几次。但很快我们的话题就偏转到其他地方,所以没有得到答案。”
”当我回家后,发现我们的年龄互为倒序的事情至今为止发生过6次。我也发现我们如果顺利的话接下几年还会在遇到一次,并且在那之后如果我们真的很幸运,还能再遇到一次。换句话说,它总共可能发生8次。所以问题是,我现在年龄多大?“
编写一个Python程序,为这个迷题搜索答案。
1 def str_fill(i, len):
2 return str(i).zfill(len)
3
4
5 def are_reversed(i, j):
6 return str_fill(i,2) == str_fill(j,2)[::-1]
7
8
9 def num_instances(diff, flag=False):
10 daughter = 0
11 count = 0
12 while True:
13 mother = daughter + diff
14 if are_reversed(daughter, mother) or are_reversed(daughter, mother+1 ):
15 count = count + 1
16 if flag:
17 print daughter, mother
18 if mother > 120:
19 break
20 daughter = daughter + 1
21 return count
22
23
24 def check_diffs():
25 diff = 10
26 while diff < 70:
27 n = num_instances(diff)
28 if n > 0:
29 print diff, n
30 diff = diff + 1
31
32 print 'diff #instances'
33 check_diffs()
34
35 print
36 print 'daughter mother'
37 num_instances(18, True)