CMU 15-112: Fundamentals of Programming and Computer Science
Extra Practice for Unit 5 (Due never) Code Tracing (CT) and Reasoning Over Code (ROC) Exercises


These problems will help you prepare for test 2. They are optional and you are encouraged to collaborate when working on them.
Code Tracing (CT)
What will each of these print?

  1. Trace #1:
    Median TA Time: 1:46. Mean TA Time: 1:52. Your Test Time: 3:30.
    import copy def ct1(L): a = L b = copy.copy(L) c = copy.deepcopy(L) b[1][1] = c[0][0] c[1].append(b[1][0]) a[0] = b[1] a[0][0] += b.pop()[0] return a,b,c L = [[1],[2,5]] for val in ct1(L): print(val) print(L)

  2. Trace #2:
    Median TA Time: 2:04. Mean TA Time: 2:04. Your Test Time: 4:00.
    def ct2(a): a[1] = "foo" a[0], a[2] = a[2], a[0] print(a) b = a b.extend([42, "wow" ]) b.pop() print(b) c = [] + b c[1:-1] = ["Hello" , "World" ] return c lst = [15, "1" , "twelve" ] print(ct2(lst)) print(lst)

  3. Trace #3:
    Median TA Time: 1:42. Mean TA Time: 1:41. Your Test Time: 3:30.
    import copy def ct3(L): a = L b = copy.copy(L) c = copy.deepcopy(L) b[0] = a[1] * a[1][0] a[0][0] += a.pop()[0] b[1] = c[0] return b # Be careful to get the brackets and commas right! L = [[1],[2],[3]] print(ct3(L)) print(L)

  4. Trace #4:
    Median TA Time: 2:04. Mean TA Time: 1:58. Your Test Time: 4:00.
    import copy def ct4(L): a = L b = copy.copy(L) c = copy.deepcopy(L) a[0] = b[1] b[1][1] = c[0] c[1].append(b[1]) a[0][0] += (b[1].pop())[0] return (a,b,c) # Be careful to get the brackets and commas right! for val in ct4([[1],[2,5]]): print(val) # prints 3 lines

  5. Trace #5:
    Median TA Time: 4:31. Mean TA Time: 4:38. Your Test Time: 9:00.
    import copy def ct5(a): b = a (a, c, d) = (b + [b[0]], copy.copy(b), copy.deepcopy(b)) d[1] = b[0] c[1] = d[0] b = b[0:1] + b[1:] b[0] = [3,4] a[0] += [5] c[1][0] = 1 + b[0][1] a[0][0] = 6 + d[1][0] for (s,L) in (("a",a), ("b",b), ("c",c), ("d",d)): print(s,L) a = [list(range(2-i)) for i in range(2)] print("start:", a) ct5(a) print("end:", a)

Reasoning Over Code (ROC)
Find values for the parameters so the functons return True:

  1. RC #1 of 4:
    def rc1(n): assert((isinstance(n, int)) and (100 <= n <= 999)) (n, r, c) = (n//100, n//10%10, n%10) L = [([0] * c) for row in range(r)] # note col is the outer loop for col in range(c): for row in range(r): L[row][col] = n n += 1 return ((L[0][2] - L[0][0] == 10) and (sum([len(R) for R in L]) == 20) and (sum(L[0]) == 42)) print(rc1(42)) # replace 42 with answer

  2. RC #2 of 4:
    def rc2(n): assert(isinstance(n, int) and (n > 0)) (d, total) = (0, 0) while (total < 100): (d, total) = (d+1, 0) a = [d] * d b = [a] * d # note: bad way to make a 2d list for i in range(d): for j in range(d): total += b[i][j] return (n == d) print(rc2(42)) # replace 42 with answer

  3. RC #3 of 4:
    def rc3(n): a = [[(r+c) for c in range(n)] for r in range(n)] b = [a[i][i] for i in range(n)] return (sum(b) == 20) print(rc3(42)) # replace 42 with answer

  4. RC #4 of 4:
    def rc4(L): assert(sorted(L) == sorted(range(len(L)))) result = [] for i in range(len(L)): m = L[i] for j in range(i, len(L)): if (L[j] > m): m = L[j] result.append(m) return (result == [3, 3, 2, 1]) print(rc4(42)) # replace 42 with answer