Homework 4: Sequences, Mutability, Object-Oriented Programming
Due by 11:59pm on Thursday, July 21
Instructions
Download hw04.zip. Inside the archive, you will find a file called
hw04.py, along with a copy of the ok
autograder.
Submission: When you are done, submit with python3 ok
--submit
. You may submit more than once before the deadline; only the
final submission will be scored. Check that you have successfully submitted
your code on okpy.org. See Lab 0 for more instructions on
submitting assignments.
Using Ok: If you have any questions about using Ok, please refer to this guide.
Readings: You might find the following references useful:
Grading: Homework is graded based on correctness. Each incorrect problem will decrease the total score by one point. There is a homework recovery policy as stated in the syllabus. This homework is out of 2 points.
Required questions
Getting Started Videos
These videos may provide some helpful direction for tackling the coding problems on this assignment.
To see these videos, you should be logged into your berkeley.edu email.
Code Writing Questions
Q1: Merge
Write a function merge
that takes 2 sorted lists lst1
and lst2
,
and returns a new list that contains all the elements in the two lists
in sorted order.
Note: Try to solve this question using recursion instead of iteration.
def merge(lst1, lst2):
"""Merges two sorted lists.
>>> s1 = [1, 3, 5]
>>> s2 = [2, 4, 6]
>>> merge(s1, s2)
[1, 2, 3, 4, 5, 6]
>>> s1
[1, 3, 5]
>>> s2
[2, 4, 6]
>>> merge([], [2, 4, 6])
[2, 4, 6]
>>> merge([1, 2, 3], [])
[1, 2, 3]
>>> merge([5, 7], [2, 4, 6])
[2, 4, 5, 6, 7]
>>> merge([2, 3, 4], [2, 4, 6])
[2, 2, 3, 4, 4, 6]
"""
"*** YOUR CODE HERE ***"
Use Ok to test your code:
python3 ok -q merge
Q2: Remove Odd Indices
Complete the recursive function remove_odd_indices
, which takes in a list lst
and a boolean odd
, and returns a new list with elements removed at certain indices.
If odd
is True
, then the function should remove elements at odd indices; otherwise if odd
is False, then the function should remove
even indexed items.
Note: Remember that lists are zero-indexed; thus, the first element is at index 0, the second element is at index 1, etc. Also remember that you can put
not
in front of a boolean in order to get its opposite value.Important: Use recursion; the tests will fail if you use any loops (for, while).
def remove_odd_indices(lst, odd):
"""Remove elements of lst that have odd indices. Use recursion!
>>> s = [1, 2, 3, 4]
>>> t = remove_odd_indices(s, True)
>>> s
[1, 2, 3, 4]
>>> t
[1, 3]
>>> l = [5, 6, 7, 8]
>>> m = remove_odd_indices(l, False)
>>> m
[6, 8]
>>> remove_odd_indices([9, 8, 7, 6, 5, 4, 3], False)
[8, 6, 4]
>>> remove_odd_indices([2], False)
[]
>>> # Do not use while/for loops!
>>> from construct_check import check
>>> # ban iteration
>>> check(HW_SOURCE_FILE, 'remove_odd_indices',
... ['While', 'For'])
True
"""
"*** YOUR CODE HERE ***"
Use Ok to test your code:
python3 ok -q remove_odd_indices
Q3: Smart Fridge
The SmartFridge
class is used by smart
refrigerators to track which items are in the fridge
and let owners know when an item has run out.
The class internally uses a dictionary to store items,
where each key is the item name and the value is the current quantity.
The add_item
method should add the given quantity
of the given item and report the current quantity.
You can assume that the use_item
method will only be called on
items that are already in the fridge, and it should use up
the given quantity of the given item. If the quantity would fall to or below zero, it should only use up to the remaining quantity, and remind the owner to buy more of that item.
Finish implementing the SmartFridge
class definition
so that its add_item
and use_item
methods work as expected.
class SmartFridge:
""""
>>> fridgey = SmartFridge()
>>> fridgey.add_item('Mayo', 1)
'I now have 1 Mayo'
>>> fridgey.add_item('Mayo', 2)
'I now have 3 Mayo'
>>> fridgey.use_item('Mayo', 2.5)
'I have 0.5 Mayo left'
>>> fridgey.use_item('Mayo', 0.5)
'Oh no, we need more Mayo!'
>>> fridgey.add_item('Eggs', 12)
'I now have 12 Eggs'
>>> fridgey.use_item('Eggs', 15)
'Oh no, we need more Eggs!'
>>> fridgey.add_item('Eggs', 1)
'I now have 1 Eggs'
"""
def __init__(self):
self.items = {}
def add_item(self, item, quantity):
"*** YOUR CODE HERE ***"
def use_item(self, item, quantity):
"*** YOUR CODE HERE ***"
You may find Python's formatted string literals, or f-strings useful. A quick example:
>>> feeling = 'love' >>> course = '61A!' >>> f'I {feeling} {course}' 'I love 61A!'
Use Ok to test your code:
python3 ok -q SmartFridge
If you're curious about alternate methods of string formatting, you can also check out an older method of Python string formatting. A quick example:
>>> ten, twenty, thirty = 10, 'twenty', [30] >>> '{0} plus {1} is {2}'.format(ten, twenty, thirty) '10 plus twenty is [30]'
Q4: Vending Machine
In this question you'll create a vending machine that only outputs a single product and provides change when needed.
Create a class called VendingMachine
that represents a vending
machine for some product. A VendingMachine
object returns strings
describing its interactions. Remember to match exactly the strings in the doctests -- including punctuation and spacing!
Fill in the VendingMachine
class, adding attributes and methods as appropriate, such that its behavior matches the following doctests:
class VendingMachine:
"""A vending machine that vends some product for some price.
>>> v = VendingMachine('candy', 10)
>>> v.vend()
'Nothing left to vend. Please restock.'
>>> v.add_funds(15)
'Nothing left to vend. Please restock. Here is your $15.'
>>> v.restock(2)
'Current candy stock: 2'
>>> v.vend()
'Please update your balance with $10 more funds.'
>>> v.add_funds(7)
'Current balance: $7'
>>> v.vend()
'Please update your balance with $3 more funds.'
>>> v.add_funds(5)
'Current balance: $12'
>>> v.vend()
'Here is your candy and $2 change.'
>>> v.add_funds(10)
'Current balance: $10'
>>> v.vend()
'Here is your candy.'
>>> v.add_funds(15)
'Nothing left to vend. Please restock. Here is your $15.'
>>> w = VendingMachine('soda', 2)
>>> w.restock(3)
'Current soda stock: 3'
>>> w.restock(3)
'Current soda stock: 6'
>>> w.add_funds(2)
'Current balance: $2'
>>> w.vend()
'Here is your soda.'
"""
"*** YOUR CODE HERE ***"
Again, you may find it useful to use f-strings.
Use Ok to test your code:
python3 ok -q VendingMachine
Submit
Make sure to submit this assignment by running:
python3 ok --submit