Homework 8

Due Tuesday 14-Mar, at 10:00pm


To start

  1. Create a folder named hw8
  2. Create a new file hw8.py in that folder
  3. Edit hw8.py and add the functions and some testcases as required
  4. When you have completed and fully tested hw8, submit hw8.py to Gradescope. For this hw, you may submit up to 15 times, but only your last submission counts.

While you may submit to Gradescope as often as you like for this assignment, some questions are not autograded, so you will be responsible for testing your code and making sure it meets the problem requirements.

Some important notes

  1. This homework is solo. You may not collaborate or discuss it with anyone outside of the course, and your options for discussing with other students currently taking the course are limited. See the academic honesty policy for more details.
  2. After you submit to Gradescope, make sure you check your score. If you aren’t sure how to do this, then ask a CA or Professor.
  3. There is no partial credit on Gradescope testcases for autograded problems. Your Gradescope score is your Gradescope score.
  4. Read the last bullet point again. Seriously, we won’t go back later and increase your Gradescope score for any reason. Even if you worked really hard and it was only a minor error…
  5. Do not hardcode the test cases in your solutions.
  6. We are not giving you any starter code this week. That means you need to create your file from scratch and include your own testcases. For writing testcases, follow the style of testcases uses in the previous homeworks.
  7. Remember the course’s academic integrity policy. Solving the homework yourself is your best preparation for exams and quizzes; cheating or short-cutting your learning process in order to improve your homework score will actually hurt your course grade long-term.

Limitations

Do not use recursion this week. The autograder (or a manual CA review later) will reject your submission entirely if you do.

A Note About Style Grading

Like in the previous assignments, we will be grading your code based on whether it follows the 15-112 style guide. We may deduct up to 10 points from your overall grade for style errors. We highly recommend that you try to write clean code with good style all along, rather than fixing your style issues at the end. Good style helps you code faster and with fewer bugs. It is totally worth it. In any case, style grading already started, so please use good style from now on!

Problems

  1. invertDictionary(d) [25 pts]
    Write the function invertDictionary(d) that takes a dictionary d that maps keys to values and returns a dictionary of its inverse, that maps the original values back to their keys. One complication: there can be duplicate values in the original dictionary. That is, there can be keys k1 and k2 such that (d[k1] == v) and (d[k2] == v) for the same value v. For this reason, we will in fact map values back to the set of keys that originally mapped to them. So, for example:
    assert(invertDictionary({1:2, 2:3, 3:4, 5:3}) == {2:set([1]),3:set([2,5]), 4:set([3])})
    Also, you may assume that the values in the original dictionary are all immutable, so that they are legal keys in the resulting inverted dictionary.

  2. destinationCity(paths) [15 pts]
    You are given a dictionary paths, where paths[cityA] = cityB means there exists a direct path going from cityA to cityB. Return the destination city, that is, the city without any path outgoing to another city. It is guaranteed that the paths form a line without any loop, therefore, there will be exactly one destination city. Consider the following examples:
    paths = { 'London': 'New York', 'New York': 'Lima', 'Lima': 'Sao Paulo' }
    The destination city is "Sao Paulo". Starting at any city you will reach "Sao Paulo" city which is the destination city. For instance, starting at "London" city, our trip consist of: "London" -> "New York" -> "Lima" -> "Sao Paulo".
    paths = { 'B' : 'C', 'D' : 'B', 'C' : 'A' }
    All possible trips are:
    "D" -> "B" -> "C" -> "A". "B" -> "C" -> "A". "C" -> "A". "A".
    Clearly the destination city is "A".

  3. groupAnagrams(S) [20 pts]
    Given a list of strings S, group the anagrams together. Two strings are anagrams if each can be reordered into the other. Treat "a" and "A" as the same letters (so "Aba" and "BAA" are anagrams). The function should return a list of groups, in any order. Each group is a set of strings where all the strings are anagrams of each other. Some examples:
    S = ["eat","tea","tan","ate","nat","bat"]
    groupAnagrams(S) will group the strings in the following way:
    [{"bat"},{"nat","tan"},{"ate","eat","tea"}]
    S = ["own", "read", "dare", "eat", "now", "stop", "now", "spot", "15112", "tea"]
    groupAnagrams(S) will group the strings in the following way:
    [{"own", "now"}, {"read","dare"}, {"eat","tea"}, {"stop", "spot"}, {"15112"}]
    The order of the groups in the returned list is not important. The size of S will be large, therefore you should avoid using lists operations as much as possible, otherwise your solution will be too slow and will timeout. We expect that your code processes an input of 30K words in less than a minute.

  4. movieAwards(oscarResults) [20 pts]
    Write the function movieAwards(oscarResults) that takes a set of tuples, where each tuple holds the name of a category and the name of the winning movie, then returns a dictionary mapping each movie to the number of the awards that it won. For example, if we provide the set:
    { ("Best Picture", "The Shape of Water"), ("Best Actor", "Darkest Hour"), ("Best Actress", "Three Billboards Outside Ebbing, Missouri"), ("Best Director", "The Shape of Water"), ("Best Supporting Actor", "Three Billboards Outside Ebbing, Missouri"), ("Best Supporting Actress", "I, Tonya"), ("Best Original Score", "The Shape of Water") }
    the program should return:
    { "Darkest Hour" : 1, "Three Billboards Outside Ebbing, Missouri" : 2, "The Shape of Water" : 3, "I, Tonya" : 1 }

    Note: Remember that sets and dictionaries are unordered! For the example above, the returned set may be in a different order than what we have shown, and that is ok.

  5. containsPythagoreanTriple(a) [20 pts]
    Write the function containsPythagoreanTriple(a) that takes a list of positive integers and returns True if there are 3 values (a,b,c) anywhere in the list such that (a,b,c) form a Pythagorean Triple, where: $$a^2 + b^2 == c^2$$ So [1,3,6,2,5,1,4] returns True because of (3,4,5) are in the list, and $$3^2 + 4^2 == 5^2$$

    A naive solution would be to check every possible triple (a,b,c) in the list. You'll have to do better than that.