CS61A Project2 Cat 不完全吐槽

本人是初学者,如果有误欢迎指正.本意是想记录自己的学习,并且稍微提炼翻译一下project的要点,写一下自己遇到的问题.一个检测打字速度相关的程序.    "*** YOUR CODE HERE **

Project2 Cat

声明:

本人是初学者,如果有误欢迎指正.本意是想记录自己的学习,并且稍微提炼翻译一下project的要点,写一下自己遇到的问题.

规则:

一个检测打字速度相关的程序.

代码编写:

01:

    "*** YOUR CODE HERE ***"

    for i in range(len(paragraphs)):

        if i <= k and not select(paragraphs[i]):

            k += 1

    if k >= len(paragraphs):

        return ''

    else:

        return paragraphs[k]

主要是注意当k指向的地址不含有元素时,最好单独讨论.

For循环内的逻辑是:i遍历,k增长,如果select返回的值一直都是true,那么k最后就和最大的i相等.

02:

1. 标点符号,大小写不影响判断结果

2. 与任意一个相符就行

"*** YOUR CODE HERE ***"

def helper(x):

    for i in split(remove_punctuation(lower(x))):

        for j in subject:

            if i == j:

                return True

    return False

return helper

把给的三个函数全套上,记得split要在最外层,因为lower和remove函数的形参都是一个字符串,split会把一个字符串分成多个.

03:

1. 一个单词算一个元素,元素之间用空格区分,只要有一个字符不相同就算整个元素错误,为精准度贡献的值为0.0

2. 符号也算在单词中,大小写敏感

(实际上直接使用split就包含了所有情况了,不要用lower和remove函数即可)

    "*** YOUR CODE HERE ***"

    i , j = 0 , 0

    sum = 0

    while i < len(typed_words) and j < len(source_words):

        if typed_words[i] == source_words[j]:

            sum += 100.0

        i += 1

        j += 1

    if len(typed_words) == 0 and len(source_words) == 0:

        return 100.0

    elif len(typed_words) == 0:

        return 0.0

    else:

        return sum / len(typed_words)

# END PROBLEM 3

不知道有没有优化的方法.单独考虑了两者长度都为零和前者长度为零的情况,,防止除零的发生.当然仅是针对我这个算法(加起来再除长度),不过暂时没有去想别的更好的方法了.

一一对应是关键.

04:

    # BEGIN PROBLEM 4

    "*** YOUR CODE HERE ***"

    speed = len(typed)/5*60/elapsed

    return speed

# END PROBLEM 4

 

没什么好说的,注意一下计算公式就行

05:

1. 如果在word_list中有跟typed_word相同的单词,那么直接返回这个单词(易忽略)

2. 如果word_list中有多个单词有着一样的最小difference,那么返回最左边的那个

    "*** YOUR CODE HERE ***"

    for x in word_list:

        if typed_word == x:

            return x

    min_diff , j = diff_function(typed_word , word_list[0] , limit) , 0

    record = 0

    i = 0

    while i < len(word_list):

        temp = diff_function(typed_word , word_list[i] , limit)

        if min_diff > temp:

            min_diff = temp

            record = i

        i += 1

    if min_diff > limit:

        return typed_word

    else:

        return word_list[record]

# END PROBLEM 5

对max,min的语法还比较生疏,所以索性用循环解决了.算是常规题目,写过就还好,如果第一次遇见类似的题目可能会卡住.

06:

    # BEGIN PROBLEM 6

    a , b = len(typed) , len(source)

    def helper1(x , limit , total):

        if x >= min(a , b):

            total += abs(a - b)

            return total

        elif typed[x] != source[x]:

            total += 1

        if total > limit:

            return total  

        return helper1(x + 1 , limit , total)

    return helper1(0 , limit , 0)

    assert False, 'Remove this line'

# END PROBLEM 6

使用recursion的一集,实话说目前为止我感觉recursion的优势就是简洁+装逼,写起来是真的难.有点数列递推的味道.这题要说什么诀窍我也没有,就凭感觉来写的.

07:

这是我目前为止唯一卡住(一卡就是六七小时+,我去**的)and一点思路都没有的题目,也是我千辛万苦解决之后最想问候出题人的一题.要想解决这题,你需要:

1. 熟练使用递归函数

2. 熟悉动态规划(这道题叫做”编辑距离”,具体可以b站找视频看)

3. 在递归函数中加入限制次数,能够及时跳出函数.

代码如下:

    if not typed: # Base cases should go here, you may add more base cases as needed.

        # BEGIN

        "*** YOUR CODE HERE ***"

        return len(source)

        # END

    # Recursive cases should go below here       

    if not source: # Feel free to remove or add additional cases

        # BEGIN

        "*** YOUR CODE HERE ***"

        return len(typed)

        # END

    if limit < 0:

        return limit + 1

    if typed[-1] == source[-1]:

        return minimum_mewtations(typed[:-1] , source[:-1] , limit)

    else:

        add = minimum_mewtations(typed[:-1] , source , limit - 1) + 1 # Fill in these lines

        remove = minimum_mewtations(typed , source[:-1] , limit - 1) + 1

        substitute = minimum_mewtations(typed[:-1] , source[:-1] , limit - 1) + 1

        # BEGIN

        "*** YOUR CODE HERE ***"

        return min(add , remove , substitute , limit + 1)

        # END

如果你觉得看不懂,不是你的问题,你需要先学”编辑距离”(或者叫莱文斯坦距离),一般是使用for循环解决的,然后你再根据for循环修改成递推函数的形式,就是我们的最终代码了.

如果你卡了很久,没关系,这里有个人卡了一天,我不说是谁.

(optional跳过)

08:



需要注意的是,此函数传入的typed和source不再是一个字符串,而是由多个字符串组成的数组.

09:

 

需要去了解一下创建一个二维数组的方法.其他的理解题意即可

10:

 

需要熟悉二维数组的创建,记录最小值并使用的操作,其余的理解好题意就行.

 

总结:

相比hog,难度感觉要上升一些,不过上升的方面是要用比较多不熟的知识点(特别是递归函数和对数组的操作),作为一个初学者,第一次求助了ai,发现ai真的对学习很有帮助,在此强烈推荐各位使用.

附一份我的求助ai记录:

 

可以看到,整个提问的过程还是比较长的,一方面ai解释得十分详细易懂,另一方面我自己也就着一个又一个的问题提问.将整个知识点搞明白.