2020-04
16

循环,循环

By xrspook @ 19:58:07 归类于: 扮IT

觉得自己虽然见过递归,但几乎不用,不逼着我我都不用,循环用得越来越遛。前两题我和参考答案得出的结论一致,最后一题,我觉得参考答案有问题。下面的都是我的脚本。下面要用到的words.txt在这里

Exercise 7:This question is based on a Puzzler that was broadcast on the radio program Car Talk: Give me a word with three consecutive double letters. I’ll give you a couple of words that almost qualify, but don’t. For example, the word committee, c-o-m-m-i-t-t-e-e. It would be great except for the ‘i’ that sneaks in there. Or Mississippi: M-i-s-s-i-s-s-i-p-p-i. If you could take out those i’s it would work. But there is a word that has three consecutive pairs of letters and to the best of my knowledge this may be the only word. Of course there are probably 500 more but I can only think of one. What is the word? Write a program to find it. Solution: http://thinkpython2.com/code/cartalk1.py.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
def double_letter(word):
    num = 0
    i = 0
    if len(word) >= 6:
        while i < len(word)-1:
            if word[i] == word[i+1]: 
                num = num + 1
                i = i + 2
            elif i > 2 and word[i-2] != word[i-3]:
                break
            else:
                i = i + 1
        if num == 3:
            print(word)
fin = open('words.txt')
n = 0
for line in fin:
    word = line.strip()
    double_letter(word)
# bookkeeper
# bookkeepers
# bookkeeping
# bookkeepings

Exercise 8: Here’s another Car Talk Puzzler: “I was driving on the highway the other day and I happened to notice my odometer. Like most odometers, it shows six digits, in whole miles only. So, if my car had 300,000 miles, for example, I’d see 3-0-0-0-0-0. “Now, what I saw that day was very interesting. I noticed that the last 4 digits were palindromic; that is, they read the same forward as backward. For example, 5-4-4-5 is a palindrome, so my odometer could have read 3-1-5-4-4-5. “One mile later, the last 5 numbers were palindromic. For example, it could have read 3-6-5-4-5-6. One mile after that, the middle 4 out of 6 numbers were palindromic. And you ready for this? One mile later, all 6 were palindromic! “The question is, what was on the odometer when I first looked?” Write a Python program that tests all the six-digit numbers and prints any numbers that satisfy these requirements. Solution: http://thinkpython2.com/code/cartalk2.py.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def is_palindrome(word):
    if word[::-1] == word:
        return True 
def test_palindrome(number):
    if is_palindrome(str(number)[2:]):
        if is_palindrome(str(number+1)[1:]):
            if is_palindrome(str(number+2)[1:1]):
                if is_palindrome(str(number+3)):
                    return True
for number in range(100000, 999999):
    if test_palindrome(number):
        print(number)
# 198888
# 199999

Exercise 9: Here’s another Car Talk Puzzler you can solve with a search: “Recently I had a visit with my mom and we realized that the two digits that make up my age when reversed resulted in her age. For example, if she’s 73, I’m 37. We wondered how often this has happened over the years but we got sidetracked with other topics and we never came up with an answer. “When I got home I figured out that the digits of our ages have been reversible six times so far. I also figured out that if we’re lucky it would happen again in a few years, and if we’re really lucky it would happen one more time after that. In other words, it would have happened 8 times over all. So the question is, how old am I now?” Write a Python program that searches for solutions to this Puzzler. Hint: you might find the string method zfill useful. Solution: http://thinkpython2.com/code/cartalk3.py.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
year = 99
meet = int(input('how many times have we met?(1-8): '))
print('mom born me at', '\t','my age', '\t',"mon's age")
for i in range(10, 80): # 假设你妈生你的最低年龄是10,最高年龄是80
    n = 0
    for age in range(1, year):
        if age < int(str(age).zfill(2)[::-1]) and int(str(age).zfill(2)[::-1]) - age == i:            
            # print(i, '\t\t', age, '\t\t', str(age).zfill(2)[::-1])             
            n = n + 1
            if n == meet:
                print(i, '\t\t', age, '\t\t', str(age).zfill(2)[::-1])
 
# how many times have we met?(1-8): 6
# mom born me at   my age          mon's age
# 18               57              75
# 27               58              85
# 36               59              95
 
# how many times have we met?(1-8): 8
# mom born me at   my age          mon's age
# 18               79              97
 
# mom born me at   my age          mon's age
# 18               2               20
# 18               13              31
# 18               24              42
# 18               35              53
# 18               46              64
# 18               57              75
# 18               68              86
# 18               79              97
# 27               3               30
# 27               14              41
# 27               25              52
# 27               36              63
# 27               47              74
# 27               58              85
# 27               69              96
# 36               4               40
# 36               15              51
# 36               26              62
# 36               37              73
# 36               48              84
# 36               59              95
# 45               5               50
# 45               16              61
# 45               27              72
# 45               38              83
# 45               49              94
# 54               6               60
# 54               17              71
# 54               28              82
# 54               39              93
# 63               7               70
# 63               18              81
# 63               29              92
# 72               8               80
# 72               19              91
2020-04
16

在死去活来中成长

By xrspook @ 10:03:58 归类于: 烂日记

昨天晚上,在做那些文字游戏的时候,我做到了好像怎么费劲就轻而易举地把题目做出来了,只需要几分钟到十几分钟。从写脚本到测试成功,整个过程没有状况,甚至写完脚本后,所有东西下面红色波浪线都没有。通常,我都会习惯忘记在句子的结束加上冒号。Python要求必须严格缩进,多了少了都不行,而且使用缩进必须用一样的方式,通常必须要求用4个空格。习惯了用VSCode以后,我会设置缩进为4个空格,当我在上一行回车之后,如果上面是冒号,下一行就会自动缩进4个空格。但如果某段代码不是我写的,而是从某个地方复制过来的,就可能会出现状况。所以为了避免这种无聊的出错,我把所有占位符都显示出来。比如空格,也比如tab。大概对其他人来说,写代码就应该是行云流水的。知道自己要实现的功能是什么,知道自己应该用什么方法,然后按照思路按部就班。调试这种东西没有个尽头,没有说用了某些方法测试就能一定保证调试完以后程序没有任何的bug。只能做到尽可能少bug,不可能做到完全没有bug。不知道从什么时候开始,我觉得不把话说死非常重要。

昨天我终于体验到云流水般写代码,是因为在行云流水之前我已经纠结过好几个小时。在行云流水之后,我也遇到了命令行的光标卡在那里,不显示程序有错误,但是程序也不进行下去。如果我进入了死循环,程序出不来,Python会提示我上面已经进行了超过994行,别浪浪费大家精力了。之前我已经见识过了。而昨晚我遇到的是光标停在那里,没有任何提示。脚本那里也没有任何红色波浪线,说明语法是对的,起码静态语法没问题。当我再次看到脚本的时候,发现原来是我在用while进行循环迭代的时候,没有设置改变条件的东西,于是while的循环就停在那里了。在我构想那个循环的时候,其实我是设定好增量条件的。我的脑子已经准备好了,但我的手指并没有把增量条件敲上去,所以就出现了之前死在了终端的状况。我不知道光标死在了终端我还能做些什么,反正我的处理方式是把终端关了。光标停在那里,输入什么都没有反应,又或许如果我在单独的CMD命令行里搞那个的话,我可以用某些什么方式从那里跳出来。只是我现在不知道该做些什么。因为我是在VScode的测试,所以我简单地把那个终端的窗口关掉,重开一个就好。

还记得,在大学里学习C语言的时候,其实我不怎么喜欢用while这个东西循环,我更喜欢用for。拿Python跟C语言比,我觉得后者需要我们在写代码的时候更加仔细严谨。比如花括号这种东西绝对不能省。也比如某个对象在使用之前必须先声明,不只要说明它存在,而且要确定好那是一个什么类型的东西。在循环控制方面,C语言一开始就必须得想好所有。相对而言,Python很自由。昨天我突然发现原来in这个东西可以让if这种语句也具备循环的功能。在实现某个功能的时候,我用了两个for嵌套,而参考答案只用了一个for和一个if,出来的结果完全是一样的。我在两个for里还得加个if做判断,相对参考答案而言,显然就有点臃肿了。

我明明知道做习题会让我死去活来,但是一定程度上,我却在享受那种征服未知的刺激。

© 2004 - 2024 我的天 | Theme by xrspook | Power by WordPress