第9章文字游戏部分习题

练习 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)






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值