1. Each of the following attempt to make a 2 by 2 matrix of 1s. State for each one whether we would have aliasing problems, i.e. running m[0][0] = 10 after constructing the matrix would change more than one entry. a. m = [[1, 1], [1, 1]] b. m = [[1, 1]]*2 c. m = [] for i in range(2): m.append([1, 1]) d. row = [] for i in range(2): row.append(1) m.append(row) m.append(row) e. m = [[1]*2, [1]*2] 2. Draw the resulting memory diagram (i.e. objects and references) after the following statements are executed: a = 10 b = [1, 2, 3, 4, 5] c = a d = c 3. Write a function apply_every_other that takes two parameters as input, a list and a function, f. Your function return a new list where f has been applied to every other element in in list, starting with the first element. >>> apply_every_other([-1, -2, -3, -4], abs) [1, 3] 4. Consider a state space where state the starting state 's' has next states [a, b, c] and state 'a' has next states [s, d, e]. Assuming the goal state exists somewhere further down in the state space is DFS guaranteed to find the goal state? Is BFS guaranteed to find the goal state?