#
Homework 3

*Due at 11:59:59 pm on Sunday, 9/25/2020.*

## Instructions

Download hw03.zip. Inside the archive, you will find starter files for the questions in this homework, 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 this article for more instructions on okpy and submitting assignments.

**Readings:** This homework relies on following references:

## Questions

### Question 1: Nonzero

Write a function that takes in a list and returns the first nonzero entry.

```
def nonzero(lst):
""" Returns the first nonzero element of a list
>>> nonzero([1, 2, 3])
1
>>> nonzero([0, 1, 2])
1
>>> nonzero([0, 0, 0, 0, 0, 0, 5, 0, 6])
5
"""
"*** YOUR CODE HERE ***"
```

Use OK to test your code:

`python3 ok -q nonzero`

### Question 2: Contains N

Write a function that takes in a list and a number, and returns whether or not the list contains the value n.

```
def has_n(lst, n):
""" Returns whether or not a list contains the value n.
>>> has_n([1, 2, 2], 2)
True
>>> has_n([0, 1, 2], 3)
False
>>> has_n([], 5)
False
"""
"*** YOUR CODE HERE ***"
```

Use OK to test your code:

`python3 ok -q has_n`

### Question 3: Deep List

Implement the function `deep_list`

, which takes in a list, and returns a new list which contains only elements of the original list that are also lists. Use a list comprehension.

```
def deep_list(seq):
"""Returns a new list containing elements of the original list that are lists.
>>> seq = [49, 8, 2, 1, 102]
>>> deep_list(seq)
[]
>>> seq = [[500], [30, 25, 24], 8, [0]]
>>> deep_list(seq)
[[500], [30, 25, 24], [0]]
>>> seq = ["hello", [12, [25], 24], 8, [0]]
>>> deep_list(seq)
[[12, [25], 24], [0]]
"""
"*** YOUR CODE HERE ***"
```

Use OK to test your code:

`python3 ok -q deep_list`

### Question 4: Total Price

Implement the function `total_price`

, which takes in a list of prices of individual products and needs to find the total price. Unfortunately, any product that is priced greater than or equal to $20 has a 50 percent tax, so include that in the final price.

Try to do this in one line!

Cast your final answer to an **integer** to avoid floating point precision errors. For example, if `x`

contains your final answer, `return int(x)`

!

```
def total_price(prices):
"""
Finds the total price of all products in prices including a
50% tax on products with a price greater than or equal to 20.
>>> total_price([5, 20, 30, 7])
87
>>> total_price([8, 4, 3])
15
>>> total_price([10, 100, 4])
164
"""
"*** YOUR CODE HERE ***"
```

Use OK to test your code:

`python3 ok -q total_price`

### Question 5: arange

Implement the function `arange`

, which behaves just like np.arange(start, end, step) from Data 8. You only need to support positive values for step.

```
def arange(start, end, step=1):
"""
arange behaves just like np.arange(start, end, step).
You only need to support positive values for step.
>>> arange(1, 3)
[1, 2]
>>> arange(0, 25, 2)
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24]
>>> arange(999, 1231, 34)
[999, 1033, 1067, 1101, 1135, 1169, 1203]
"""
"*** YOUR CODE HERE ***"
```

Use OK to test your code:

`python3 ok -q arange`

### Question 6: Coordinates

Implement a function `coords`

, which takes a function, a sequence, and
an upper and lower bound on output of the function. `coords`

then
returns a list of x, y coordinate pairs (lists) such that:

- Each pair contains
`[x, fn(x)]`

- The x coordinates are the elements in the sequence
- Only pairs whose y coordinate is within the upper and lower bounds (inclusive)

See the doctests for examples.

One other thing: your answer can only be *one line long*. You should
make use of list comprehensions!

```
def coords(fn, seq, lower, upper):
"""
>>> seq = [-4, -2, 0, 1, 3]
>>> def fn(x):
... return x**2
>>> coords(fn, seq, 1, 9)
[[-2, 4], [1, 1], [3, 9]]
"""
"*** YOUR CODE HERE ***"
```

Use OK to test your code:

`python3 ok -q coords`

## Optional Practice Question

### Question 7: Adding matrices

To practice, write a function that adds two matrices together using list comprehensions. The function should take in two 2D lists of the same dimensions. Try to implement this in one line!

```
def add_matrices(x, y):
"""
>>> matrix1 = [[1, 3],
... [2, 0]]
>>> matrix2 = [[-3, 0],
... [1, 2]]
>>> add_matrices(matrix1, matrix2)
[[-2, 3], [3, 2]]
"""
"*** YOUR CODE HERE ***"
```

Use OK to test your code:

`python3 ok -q add_matrices`