# CS106A Exam Reference Reminder # [square brackets] denote functions listed here that we have not used yet # Exam questions will not depend on functions we have not used yet General functions: len() int() str() range() list() [sorted()] String functions: isalpha() isdigit() isspace() isupper() islower() find() upper() lower() [strip()] List functions: append() extend() pop() index() [insert()] SimpleImage: # read filename image = SimpleImage(filename) # create blank image image = SimpleImage.blank(width, height) # foreach loop for pixel in image: # range/y/x loop for y in range(image.height): for x in range(image.width): pixel = image.get_pixel(x, y) Canvas Draw canvas.draw_line(x1, y1, x2, y2) # x,y is upper left, optional color='red' parameter canvas.draw_rect(x, y, width, height) canvas.fill_rect(x, y, width, height) canvas.draw_oval(x, y, width, height) canvas.fill_oval(x, y, width, height) Grid 2D: grid = Grid.build([['row', '0'], ['row', '1']]) grid.width, grid.height - properties grid.in_bounds(x, y) - True if in bounds grid.get(x, y) - returns contents at that x,y, or None if empty grid.set(x, y, value) - sets new value into grid at x,y Read lines out of a text fie: with open(filename) as f: for line in f:
What 3 numbers print when the caller() function runs? This code runs without error.
def foo(x): x = x + 2 y = 0 return x def caller(): x = 2 y = 3 z = foo(y) print(x, y, z)
# Write 3 numbers here
Say we have a list of string id codes, and a matching list of ages. Each id code is in lowercase form and represents one person. The ids and ages lists are the same length, like this:
ids = ['qxj12aa', 'pr31x', 'Xxz93a', ...] ages = [ 19, 12, 21, ...]
So in the above example person 'qxj12aa' is 19 years old, person 'pr31x' is 12, and so on.
For this function, you are given both lists and one id, like 'Pr31X' and the question is: is this person legally able to vote? We'll say that someone can vote if their id is present in the ids list, and their age is at least 18. The ids in the list are in all lowercase form, but the id passed into the function may not be, such as 'Pr31X'. (Thanks to Brahm for creating this problem.)
def can_vote(ids, ages, id):
Given an image, create a new blank "out" image which is 2x as wide and the same height as the original. Create an upside down copy of the original image in the right half of the out image, leaving the left half of the out image untouched. Some boilerplate code is provided to start.
def right_down(filename): image = SimpleImage(filename) out = - your code here - for y in range(image.height): for x in range(image.width): pixel = image.get_pixel(x, y) pass
Reminder: the canvas draw_line function:
canvas.draw_line(x1, y1, x2, y2) - draws a line from x1,y1 to x2,y2
As on the Quilt homework, the function will take in the x,y width,height of a figure positioned on the canvas, and draw lines within that figure.
Given int n which is 2 or more, draw n lines, each starting on the left edge and ending at the lower right corner of the figure. The first line should start at the upper left corner, the last line should start at the lower left corner, with the other lines distributed evenly.
Here is a picture showing the figure boundaries in gray with n=4 lines
def draw(canvas, x, y, width, height, n): pass
Suppose there is a grid where every square is either a bubble
'r', or empty
Write code for a
bubble_up(grid, y) function that tries
to move every bubble in a row up one square as follows:
given a grid and an in-bounds y value. Look at every
square with that y. If the square contains a bubble
and the square above it is empty, move the bubble
up one square, changing its original square to be empty.
Here is an example run of
bubble_up(grid, y) for the row y=1 in Doctest format:
>>> grid = Grid.build([[None, 'r', 'b'], ['b', 'b', 'b']]) >>> bubble_up(grid, 1) [['b', 'r', 'b'], [None, 'b', 'b']]
def bubble_up(grid, y): pass
Given a string s.
Find the first
'+' in s.
'+' is guaranteed to be followed by 2 digits, such as in 'xx+12xx'. Return
the integer value of the 2 digits, 12 in this example.
If there is no
'+' in s, return -1.
def plus(s): pass
Find each up-hat char
'^' in s, using a
while True/find() structure.
is immediately followed by a "word"
made of zero or more digit or dot
a list of the digit/dot
words for each
so for example
'9bc^12xx^7.77') -> ['12', '7.77'] '^.1^.2^..' -> ['.1', '.2', '..'] 'x^x^2.3x^5' -> ['', '2.3', '5']
def parse_up(s): search = 0 result =  while True: pass
Solutions 2. 2 3 5 3. List Ops def can_vote(ids, ages, id): low = id.lower() if low in ids: index = ids.index(low) # Could write a loop to search, but .index() is easier age = ages[index] if age >= 18: return True return False 4. Otter Graphics def right_down(filename): image = SimpleImage(filename) out = SimpleImage.blank(image.width * 2, image.height) for y in range(image.height): for x in range(image.width): pixel = image.get_pixel(x, y) # The x,y complexity is concentrated in this line: out_pixel = out.get_pixel(image.width + x, image.height - 1 - y) out_pixel.red = pixel.red out_pixel.green = pixel.green out_pixel.blue = pixel.blue 5. Canvas Drawing def draw(canvas, x, y, width, height, n): for i in range(n): y_add = i/(n - 1) * (height - 1) # Draw from points going down left side, all to lower-right corner canvas.draw_line(x, y + y_add, x + width - 1, y + height - 1) 6. Grid def bubble_up(grid, y): """ >>> grid = Grid.build([[None, 'r', 'b'], ['b', 'b', 'b']]) >>> bubble_up(grid, 1) [['b', 'r', 'b'], [None, 'b', 'b']] """ # Look at every x for the given y for x in range(grid.width): if grid.get(x, y) == 'b': # Is the "up" square in bounds and empty? # (Could use in_bounds() for this) if y - 1 >= 0 and grid.get(x, y - 1) == None: grid.set(x, y - 1, 'b') grid.set(x, y, None) 7. Parse1 def plus(s): """ >>> plus('xx+12xx') 12 >>> plus('ab12+99z') 99 >>> plus('abc12') -1 """ plus = s.find('+') if plus != -1: substr = s[plus + 1:plus + 3] return int(substr) return -1 8. Parse2 def parse_up(s): """ >>> parse_up('9bc^12xx^7.77') ['12', '7.77'] >>> parse_up('^.1^.2^..') ['.1', '.2', '..'] >>> parse_up('x^x^2.3x^5') ['', '2.3', '5'] """ search = 0 result =  while True: pass uphat = s.find('^', search) if uphat == -1: break end = uphat + 1 while end < len(s) and (s[end].isdigit() or s[end] == '.'): end += 1 word = s[uphat + 1:end] result.append(word) search = end return result