Question 1. Part (a) Part (b) December 2013 Final Examination Marking Scheme CSC 108 H1F. [13 marks] [4 marks] Consider this program:

Similar documents
PLEASE HAND IN UNIVERSITY OF TORONTO Faculty of Arts and Science

CSC148 Fall 2017 Ramp Up Session Reference

PLEASE HAND IN UNIVERSITY OF TORONTO Faculty of Arts and Science

PLEASE HAND IN UNIVERSITY OF TORONTO Faculty of Arts and Science

UNIVERSITY OF TORONTO Faculty of Arts and Science APRIL 2014 EXAMINATIONS. CSC 108 H1S Instructors: Campbell and Papadopoulou.

PLEASE HAND IN UNIVERSITY OF TORONTO Faculty of Arts and Science

Do not turn this page until you have received the signal to start. In the meantime, please read the instructions below carefully.

Student Number: Comments are not required except where indicated, although they may help us mark your answers.

PLEASE HAND IN UNIVERSITY OF TORONTO Faculty of Arts and Science

UNIVERSITY OF TORONTO SCARBOROUGH. December 2017 EXAMINATIONS. CSCA20H3 Duration 3 hours. Examination Aids: Instructor: Bretscher

PLEASE HAND IN UNIVERSITY OF TORONTO Faculty of Arts and Science

PLEASE HAND IN UNIVERSITY OF TORONTO Faculty of Arts and Science

UTORid: Lecture Section: (circle one): L0101 (MWF10) L0201 (MWF11) Instructor: Jacqueline Smith Jen Campbell

UNIVERSITY OF TORONTO SCARBOROUGH. Wnter 2016 EXAMINATIONS. CSC A20H Duration 2 hours 45 mins. No Aids Allowed

Student Number: Instructor: Brian Harrington

PLEASE HAND IN UNIVERSITY OF TORONTO Faculty of Arts and Science

Student Number: Comments are not required except where indicated, although they may help us mark your answers.

Question 1. December 2009 Final Examination Marking Scheme CSC 108 H1F

UNIVERSITY OF TORONTO Faculty of Arts and Science DECEMBER 2017 EXAMINATIONS. CSC 108 H1F Instructor(s): Campbell, Fairgrieve, and Smith

Question 1. Part (a) Part (b) Part (c) April 2015 Final Examination Solutions CSC 108 H1S. [16 marks] [3 marks]

Short Python function/method descriptions:

Do not turn this page until you have received the signal to start.

PLEASE HAND IN UNIVERSITY OF TORONTO Faculty of Arts and Science

Short Python function/method descriptions:

CSC A20H3 S 2011 Test 1 Duration 90 minutes Aids allowed: none. Student Number:

Do not turn this page until you have received the signal to start.

Do not turn this page until you have received the signal to start.

Do not turn this page until you have received the signal to start.

Good Luck! CSC207, Fall 2012: Quiz 1 Duration 25 minutes Aids allowed: none. Student Number:

CIS192: Python Programming Data Types & Comprehensions Harry Smith University of Pennsylvania September 6, 2017 Harry Smith (University of Pennsylvani

CIS192 Python Programming

Strings are actually 'objects' Strings

Chapter 1 Summary. Chapter 2 Summary. end of a string, in which case the string can span multiple lines.

CIS192 Python Programming

CIS192 Python Programming

Python Programming: Lecture 2 Data Types

CIS192 Python Programming

\n is used in a string to indicate the newline character. An expression produces data. The simplest expression

CPD for GCSE Computing: Practical Sheet 6 February 14

Lecture no

Overview of List Syntax

Python: Short Overview and Recap

CSC 108H1 F 2009 Test 1 Duration 35 minutes Aids allowed: none. Student Number:

CIS192 Python Programming

Python Mini Lessons last update: May 29, 2018

UNIVERSITY OF TORONTO SCARBOROUGH. Fall 2015 EXAMINATIONS. CSC A20H Duration 3 hours. No Aids Allowed

Python review. 1 Python basics. References. CS 234 Naomi Nishimura

18.1. CS 102 Unit 18. Python. Mark Redekopp

Types, lists & functions

You may not share any information or materials with classmates during the exam and you may not use any electronic devices.

Final Exam(sample), Fall, 2014

Python allows variables to hold string values, just like any other type (Boolean, int, float). So, the following assignment statements are valid:

>>> print( X ) [0,1,2,3] def mystery(l):??

MULTIPLE CHOICE. Chapter Seven

CSC 108H1 F 2010 Test 1 Duration 45 minutes Aids allowed: none. Student Number:

LISTS WITH PYTHON. José M. Garrido Department of Computer Science. May College of Computing and Software Engineering Kennesaw State University

Babu Madhav Institute of Information Technology, UTU 2015

CSC148 Recipe for Designing Classes

CS 1301 Exam 1 Fall 2010

Sequences and iteration in Python

Question 1. CSC 120H1 F Midterm Test Solutions Fall 2017

Using Objects and Images in Python

Introduction to programming using Python

Sequence Types FEB

Module 3: Strings and Input/Output

Module 08: Searching and Sorting Algorithms

ICS 31 UC IRVINE. ############## YOUR UCINET #### K E Y #### ############## Second Midterm YOUR NAME YOUR STUDENT ID (8 DIGITS)

6. Data Types and Dynamic Typing (Cont.)

Module 07: Efficiency

Introduction to Python! Lecture 2

Basic Scripting, Syntax, and Data Types in Python. Mteor 227 Fall 2017

CPE 112 Spring 2015 Exam II (100 pts) March 4, Definition Matching (8 Points)

CS1114 Spring 2015 Test ONE ANSWER KEY. page 1 of 8 pages (counting the cover sheet)

Do not turn this page until you have received the signal to start. In the meantime, please read the instructions below carefully.

CS 1110 Prelim 1 October 15th, 2015

Midterm 1 Review. Important control structures. Important things to review. Functions Loops Conditionals

Python debugging and beautification

Introduction to Python

MEIN 50010: Python Data Structures

Topic 5: Higher Order Functions

Topic 5: Higher Order Functions

Python I. Some material adapted from Upenn cmpe391 slides and other sources

CS 1110 Final, December 17th, Question Points Score Total: 100

Try and Error. Python debugging and beautification

Lecture #15: Generic Functions and Expressivity. Last modified: Wed Mar 1 15:51: CS61A: Lecture #16 1

Python Tutorial. CS/CME/BioE/Biophys/BMI 279 Oct. 17, 2017 Rishi Bedi

(CC)A-NC 2.5 by Randall Munroe Python

Strings. Upsorn Praphamontripong. Note: for reference when we practice loop. We ll discuss Strings in detail after Spring break

CS150 Sample Final. Name: Section: A / B

Variable and Data Type 2

Data Structures. Dictionaries - stores a series of unsorted key/value pairs that are indexed using the keys and return the value.

List Mutation (Module 4) Accumulative Recursion (Module 5) Efficiency (Module 7) Searching & Sorting (Module 8) Dictionaries (Module 9)

Variable and Data Type I

Question 1. Part (a) Functions [2 marks] def make_a_wish(): print("happy Halloween") make_a_wish() Part (b) Loops and Lists [3 marks]

Iterators & Generators

Last Name: First: Netid: Section. CS 1110 Final, December 17th, 2014

Basic Python Revision Notes With help from Nitish Mittal

CS 116 Fall 2016 Review Notes Created By: Rina Dong

A first look at string processing. Python

Abstract Data Types. CS 234, Fall Types, Data Types Abstraction Abstract Data Types Preconditions, Postconditions ADT Examples

Transcription:

Question 1. Part (a) [4 marks] Consider this program: [13 marks] def square(x): (number) -> number Write what this program prints, one line per box. There are more boxes than you need; leave unused ones blank. LINE C: 5 print( LINE A:, x) x = x * x print( LINE B:, x) return x if name == main : x = 5 print( LINE C:, x) square(x) print( LINE D:, x) square(x + 1) print( LINE E:, x) Solution: LINE A: 5 LINE B: 25 LINE D: 5 LINE A: 6 LINE B: 36 LINE E: 5 Part (b) [3 marks] Consider this program: list1 = [ hat, glove, scarf ] list2 = list1[:] list2.append( mitt ) list3 = list2 list3[1] = boot Write what this program prints, one line per box. [ hat, glove, scarf ] [ hat, boot, scarf, mitt ] [ hat, boot, scarf, mitt ] print(list1) print(list2) print(list3) Page 1 of 17 cont d...

Part (c) [4 marks] Consider this function: def returns_what(x): (int) -> object if x ** 2 <= 100: if x % 4 == 2: return "six" elif not x + 5 > 2: return x - 34 else: if x < 0 and abs(x) > 3: return False else: return x / 10 In the table below are 4 calls to function returns_what. Beside each call, write the value returned by the call and that value s type. Call Return Value Return Type returns_what(20) returns_what(10) returns_what(3) returns_what(-100) Part (d) [2 marks] Consider this code: def f1(x, y): (int, int) -> int print( In f1, x, y) return x * y Write what this program prints, one line per box. There are more boxes than you need; leave unused ones blank. In f2 1 2 In f1 3 4 In f1 3 12 36 def f2(x, y): (int, int) -> int print( In f2, x, y) return x + y if name == main : print(f1(f2(1, 2), f1(3, 4))) Page 2 of 17 cont d...

Question 2. [8 marks] This question has you write the bodies of two functions. Complete each function according to its docstring. Part (a) [3 marks] Note: you will most likely not need all of the space on this page. def sum_squares(l): (list of list of number) -> list of number Return a list where each item is the sum of the squares of the items from the corresponding sublist of L. >>> sum_squares([[1, 2, 3], [7], [], [-8, 1]]) [14, 49, 0, 65] result = [] for inner_list in L: sum = 0 for item in inner_list: sum += item * item result.append(sum) return result Page 3 of 17 cont d...

Part (b) [3 marks] def sum_squares_mutate(l): (list of list of number) -> NoneType Replace each sublist of L with a single integer that is the sum of the squares of the sublist s items. >>> L = [[1, 2, 3], [7], [], [-8, 1]] >>> sum_squares_mutate(l) >>> L [14, 49, 0, 65] for i in range(len(l)): sum = 0 for item in L[i]: sum += item * item L[i] = sum Part (c) [2 marks] You almost certainly have duplicate code between your two functions. Write a helper function that you could have used to eliminate that duplicate code. Do not rewrite your functions for parts (a) and (b). Page 4 of 17 cont d...

Question 3. [3 marks] This str method may be helpful for answering this question: isalpha(...) S.isalpha() -> bool Return True if all characters in S are alphabetic and there is at least one character in S, False otherwise. Consider this code. The while expression is missing. Write it so that the function does what the docstring says it should. def get_valid_password(min): (int) -> str Precondition: min >= 1 Repeatedly ask a user to input a password until they enter one that is at least min characters long and that contains at least one non-alphabetic character. Return the resulting password. while len(password) < min or not password.isalpha(): Page 5 of 17 cont d...

Question 4. [9 marks] A permutation of a list is a list that has all the same items but possibly in a different order. Function is_permutation takes two lists and returns True iff its arguments are permutations of each other. Part (a) [4 marks] In the table below, we have outlined three test cases for is_permutation. Add four more test cases chosen to test the function as thoroughly as possible. Note: there are more than four good answers to choose from. Test Case Description list1 list2 Return Value empty lists [] [] True identical single item lists [ A ] [ A ] True different single item lists [1] [2] False longer permutation [1, 2, 3] [3, 1, 2] True no common items [1, 2, 3] [4, 5, 6] False doubled but not perm [1, 2, 2] [2, 1, 1] False some common [1, 2, 3] [2, 1, 4] False Part (b) [5 marks] Write the function body. (You do not need to add examples to the docstring.) def is_permutation(list1, list2): (list, list) -> bool Return True iff list1 is a permutation of list2. # algorithm 1 (make 2 copies sort them and compare list1_copy = list1[:] list1_copy.sort() list2_copy = list2[:] list2_copy.sort() return list1_copy == list2_copy # algorithm 2 (make copy of list2, remove each item from list1 in it) # Dan: this is buggy list2_copy = list2[:] for item in list1: if item in list2_copy: list2_copy.remove(item) else: Page 6 of 17 cont d...

return False return True Page 7 of 17 cont d...

Question 5. [10 marks] In Assignment 3, you worked with SQuEaL tables represented by dictionaries where each key is a string representing the name of a column and each value is a list of strings representing the items in that column from the top row to the bottom. Part (a) [2 marks] Complete function num_rows below according to its docstring. def num_rows(table): (dict of {str: list of str}) -> int Precondition: all table columns have the same number of rows. Return the number of rows in table. >>> t = { b.0 : [ g, i, k ], b.1 : [ h, j, l ]} >>> num_rows(t) 3 random_key = list(table1.keys())[0] return len(table[random_key]) Part (b) [8 marks] Another way to represent the contents of a table would be to use a tuple of two lists. The first one is a list of lists where each inner list is the contents of a row, and the second one is a list of column names indicating the order in which the data is stored in each row in the first list. For example, the table shown below on the left is represented by both the dictionary and the tuple to the right. Notice that the column order in the tuple representation is unpredictable, because dictionaries are not ordered. { country : [ GB, FR, CA ], age : [ 34, 21, 19 ], country age brand brand : [ b1, b2, b3 ]} GB 34 b1 FR 21 b2 CA 19 b3 ( [[ GB, b1, 34 ], [ FR, b2, 21 ], [ CA, b3, 19 ]], [ country, brand, age ] ) On the next page, complete function convert_to_row_lists. It takes a SQuEaL table represented by a dictionary (as we did in A3) and returns the tuple of two lists representation. You may call function num_rows even if you were not able to correctly complete it. Page 8 of 17 cont d...

def convert_to_row_lists(table): (dict of {str: list of str}) -> tuple of (list of list of str, list of str) Return a representation of table where each row is a list of strings. The columns are sorted alphabetically by column name. >>> t = { B : [ b1, b2 ], A : [ a1, a2 ]} >>> convert_to_row_lists(t) [[ a1, b1 ], [ a2, b2 ]] tablekeys = list(table.keys()) row_list = [] for i in range(num_rows(table)): row = [] for key in tablekeys: row.append(table[key][i]) row_list.append(row) return (row_list, tablekeys) Page 9 of 17 cont d...

Question 6. [5 marks] Part (a) [1 mark] The list below is shown after each pass of a sorting algorithm. [7, 1, 4, 5, 2, 6, 3] # intial list [1, 4, 5, 2, 6, 3, 7] # after one pass [1, 4, 2, 5, 3, 6, 7] # after two [1, 2, 4, 3, 5, 6, 7] # after three [1, 2, 3, 4, 5, 6, 7] # after four Which sorting algorithm is being executed? (circle one) (a) bubble sort (b) selection sort (c) insertion sort Part (b) [1 mark] The list below is shown after each pass of a sorting algorithm. [7, 1, 4, 5, 2, 6, 3] # initial list [1, 7, 4, 5, 2, 6, 3] # after one pass [1, 2, 4, 5, 7, 6, 3] # after two [1, 2, 3, 5, 7, 6, 4] # after three [1, 2, 3, 4, 7, 6, 5] # after four [1, 2, 3, 4, 5, 6, 7] # after five Which sorting algorithm is being executed? (circle one) (a) bubble sort (b) selection sort (c) insertion sort Part (c) [1 mark] List [6, 5, 2, 3, 7, 1, 4] is being sorted using insertion sort. Fill in the blanks to show the list after the next two passes. After one pass: [6, 5, 2, 3, 7, 1, 4] After two passes: [5, 6, 2, 3, 7, 1, 4] After three passes: After four passes: Part (d) [1 mark] Some number of iterations of selection sort have been performed on a list, resulting in this list: [1, 2, 4, 5, 3, 8, 7, 6, 9] What is the maximum number of passes that could have been performed so far? 2 Part (e) [1 mark] What additional piece of information do you know about the sorted section during selection sort that you don t know during insertion sort? Solution: that the items are in their action spot. Page 10 of 17 cont d...

Question 7. [10 marks] Each code fragment in the table below operates on list L, which has length k where k is very large at least in the tens of thousands. For each fragment, give an expression in terms of k for how many times cheers! is printed, and circle whether the behaviour is constant, linear, quadratic or something else. Code How many times is cheers! printed? Complexity (circle one) for i in range(len(l)): constant print( cheers! ) 2k linear for item in L: quadratic print( cheers! ) something else for item in L[10:]: constant print( cheers! ) 10-k linear quadratic something else i = 0 constant while i < len(l) linear print( cheers! ) 10 quadratic i = i + len(l) // 10 something else for item in L[1000:2000]: constant print( cheers! ) 1000 linear quadratic something else for i in range(len(l)) constant for item in L[:i]: linear print( cheers! ) k (k-1) / 2 quadratic something else Page 11 of 17 cont d...

Question 8. [12 marks] Some people have wine cellars where they store bottles of wine. In this question, you will develop two classes to keep track of the kinds of wine in a cellar, how many bottles of each kind there are, and whether the person likes or dislikes each kind of wine. Here is the header and docstring for class Wine. class Wine: Information about a type of wine in our wine cellar, including the name, how many bottles there are, and whether the wine is liked. Part (a) [2 marks] Complete method init for class Wine. Note: you will most likely not need all of the space on this page. def init (self, name, num): (Wine, str, int) -> NoneType Record that there are num bottles of a wine named name. Assume that we like it. >>> w = Wine( Painter Bridge, 6) >>> w.name Painter Bridge >>> w.num_left 6 >>> w.like_it True self.name = name self.num_left = num self.like_it = True Page 12 of 17 cont d...

Part (b) [2 marks] Here is the header, type contract, and description for method drink in class Wine. Add an example that creates a Wine object, drinks one of the bottles, and verifies that there is now one fewer bottle of that Wine. Also write the body of the method. def drink(self): (Wine) -> NoneType Precondition: there is at least 1 bottle left. Record that we drank one bottle of this Wine. >>> w = Wine( Painter Bridge, 6) >>> w.drink() >>> w.num_left 5 Part (c) self.num_left = self.num_left - 1 [3 marks] Write an eq method in class Wine that allows us to compare two Wine objects to see if a wine is already in a cellar. Consider two wines equal if they have the same name. Follow the function design recipe. def eq (self, other): (Wine, Wine) -> bool Return whether this Wine and other are the same. >>> w1 = Wine( Painter Bridge, 6) >>> w2 = Wine( Painter Bridge, 6) >>> w3 = Wine( Fuzion Shiraz Malbec, 2) >>> w1 == w2 True >>> w1 == w3 False return self.name == other.name Note: For the rest of this question, you should assume that there is a str method in class Wine that that returns strings of this form: Wine(Painter Bridge, 3, True) Page 13 of 17 cont d...

class WineCellar: Information about the bottles of wine in a wine cellar. Part (d) [1 mark] Complete method init in class WineCellar: def init (self): (WineCellar) -> NoneType Create a WineCellar with an empty wine list. >>> cellar = WineCellar() >>> cellar.wine_list [] self.wine_list = [] Part (e) [3 marks] Complete method add in class WineCellar. Hints: value in lst evaluates to True when value is equal to an item in lst. Also, lst.index(value) returns the index of value in lst. If you need more space for this question, please use page 16 and note here that you have done so. def add(self, wine): (WineCellar) -> NoneType If wine is not already in this WineCellar, add it. Otherwise, increase the number of bottles in the equivalent Wine object that is already in the cellar. >>> cellar = WineCellar() >>> cellar.add(wine( Painter Bridge, 6)) >>> cellar.add(wine( Painter Bridge, 5)) >>> len(cellar.wine_list) 1 >>> str(cellar.wine_list[0]) Wine(Painter Bridge, 11, True) if wine in self.wine_list: w = self.wine_list[self.wine_list.index(wine)] w.num_left += wine.num_left else: self.wine_list.append(wine) Page 14 of 17 cont d...

Part (f) [3 marks] Complete method get_wines_to_replace in class WineCellar: def get_wines_to_replace(self): (WineCellar) -> list of Wine Return a list of the wines that need replacing: the ones where there are 0 bottles left and that are liked. >>> cellar = WineCellar() >>> cellar.add(wine( Painter Bridge, 0)) >>> cellar.add(wine( Santa Alicia, 1)) >>> cellar.add(wine( Cesari Amarone, 0)) >>> w = Wine( Fuzion Shiraz Malbec, 0) >>> cellar.add(w) >>> w.like_it = False >>> res = cellar.get_wines_to_replace() >>> len(res) 2 >>> str(res[0]) == Wine(Painter Bridge, 0, True) True >>> str(res[1]) == Wine(Cesari Amarone, 0, True) True res = [] for wine in self.wine_list: if wine.number == 0 and wine.like_it: res.append(wine) return res Page 15 of 17 cont d...

Short Python function/method descriptions: builtins : input([prompt]) -> str Read a string from standard input. The trailing newline is stripped. The prompt string, if given, is printed without a trailing newline before reading. abs(x) -> number Return the absolute value of x. int(x) -> int Convert x to an integer, if possible. A floating point argument will be truncated towards zero. len(x) -> int Return the length of the list, tuple, dict, or string x. max(iterable) -> object max(a, b, c,...) -> object With a single iterable argument, return its largest item. With two or more arguments, return the largest argument. min(iterable) -> object min(a, b, c,...) -> object With a single iterable argument, return its smallest item. With two or more arguments, return the smallest argument. print(value,..., sep=, end= \n ) -> NoneType Prints the values. Optional keyword arguments: sep: string inserted between values, default a space. end: string appended after the last value, default a newline. open(name[, mode]) -> file open for reading, writing, or appending Open a file. Legal modes are "r" (read), "w" (write), and "a" (append). range([start], stop, [step]) -> list-like-object of int Return the integers starting with start and ending with stop - 1 with step specifying the amount to increment (or decrement). If start is not specified, the list starts at 0. If step is not specified, the values are incremented by 1. dict: D[k] --> object Produce the value associated with the key k in D. del D[k] Remove D[k] from D. k in d --> bool Produce True if k is a key in D and False otherwise. D.get(k) -> object Return D[k] if k in D, otherwise return None. D.keys() -> list-like-object of object Return the keys of D. D.values() -> list-like-object of object Return the values associated with the keys of D. D.items() -> list-like-object of tuple of (object, object) Return the (key, value) pairs of D, as 2-tuples. file open for reading: F.close() -> NoneType Close the file. F.read() -> str Read until EOF (End Of File) is reached, and return as a string. F.readline() -> str Read and return the next line from the file, as a string. Retain newline. Return an empty string at EOF (End Of File). Page 16 of 17 End of Marking Scheme

F.readlines() -> list of str Return a list of the lines from the file. Each string ends in a newline. list: x in L --> bool Produce True if x is in L and False otherwise. L.append(x) -> NoneType Append x to the end of the list L. L.index(value) -> int Return the lowest index of value in L. L.insert(index, x) -> NoneType Insert x at position index. L.pop() -> object Remove and return the last item from L. L.remove(value) -> NoneType Remove the first occurrence of value from L. L.reverse() -> NoneType Reverse *IN PLACE*. L.sort() -> NoneType Sort the list in ascending order. str: x in s --> bool Produce True if and only if x is in s. str(x) -> str Convert an object into its string representation, if possible. S.count(sub[, start[, end]]) -> int Return the number of non-overlapping occurrences of substring sub in string S[start:end]. Optional arguments start and end are interpreted as in slice notation. S.find(sub[, i]) -> int Return the lowest index in S (starting at S[i], if i is given) where the string sub is found or -1 if sub does not occur in S. S.index(sub) -> int Like find but raises an exception if sub does not occur in S. S.isdigit() -> bool Return True if all characters in S are digits and False otherwise. S.lower() -> str Return a copy of the string S converted to lowercase. S.lstrip([chars]) -> str Return a copy of the string S with leading whitespace removed. If chars is given and not None, remove characters in chars instead. S.replace(old, new) -> str Return a copy of string S with all occurrences of the string old replaced with the string new. S.rstrip([chars]) -> str Return a copy of the string S with trailing whitespace removed. If chars is given and not None, remove characters in chars instead. S.split([sep]) -> list of str Return a list of the words in S, using string sep as the separator and any whitespace string if sep is not specified. S.strip() -> str Return a copy of S with leading and trailing whitespace removed. S.upper() -> str Return a copy of the string S converted to uppercase. Page 17 of 17 End of Marking Scheme