<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 Q1
In this question, you'll write some basic functions.
A
Write a function add_index that adds an amount to each element of a list equal to the index of that element in the list, plus an optional offset.
input
Step1:  B
Write a function, remove_odds, which deletes all the odd numbers from a list of numbers.
input
Step2:  C
Write a function, is_palindrome, which determines whether or not a list is a palindrome.
input
Step3:  D
Write a function strip_n that chops a certain number of elements off the front and back of a list.
input
<ASSISTANT_TASK:>
Python Code:
i1 = [1, 2, 3]
a1 = [1, 3, 5]
assert set(a1) == set(add_index(i1))
i2 = [0, 0, 0, 9, 10, 11]
o2 = 12
a2 = [12, 13, 14, 24, 26, 28]
assert set(a2) == set(add_index(i2, o2))
Explanation: Q1
In this question, you'll write some basic functions.
A
Write a function add_index that adds an amount to each element of a list equal to the index of that element in the list, plus an optional offset.
input: 2 arguments. Required argument is a list of numbers. Optional argument (default: 0) is the offset that is added to each element, in addition to the value of the element's index.
output: the same list of numbers, which each element incremented by its index value
For example, add_index([1, 2, 3]) should return [1, 3, 5]. Another example: add_index([1, 2, 3], 5) should return [6, 8, 10].
You cannot use any built-in or imported functions.
End of explanation
i1 = [1, 2, 3]
a1 = [2]
assert set(a1) == set(remove_odds(i1))
i2 = [0, 0, 0, 9, 10, 11]
a2 = [0, 0, 0, 10]
assert set(a2) == set(remove_odds(i2))
Explanation: B
Write a function, remove_odds, which deletes all the odd numbers from a list of numbers.
input: 1 argument, a list of numbers
output: the same list of numbers, but with all the odd elements stripped out
For example, remove_odds([1, 2, 3, 4, 5]) should return [2, 4]. 0 counts as even.
You cannot use any built-in or imported functions.
End of explanation
i1 = [1, 2, 1]
assert is_palindrome(i1)
i2 = [1, 1, 2, 1]
assert not is_palindrome(i2)
i3 = [1, 2, 3, 4, 5, 4, 3, 2, 1]
assert is_palindrome(i3)
i4 = [1, 2, 3, 4, 5, 5, 4, 3, 2, 1]
assert is_palindrome(i4)
i5 = [1, 2, 3, 4, 5, 5, 4, 3, 2]
assert not is_palindrome(i5)
Explanation: C
Write a function, is_palindrome, which determines whether or not a list is a palindrome.
input: 1 argument, a list
output: a boolean, True if the input list is a palindrome, False otherwise
Recall a palindrome is typically a word or sequence of words that reads identically forwards as backwards.
For example, is_palindrome([1, 2, 1]) would return True, but is_palindrome([1, 1, 2, 1]) would return False.
You cannot use any built-in or imported functions.
End of explanation
i1 = [1, 2, 3]
n1 = 1
a1 = [2]
assert set(a1) == set(strip_n(i1, n1))
i2 = [1, 2, 3, 4]
n2 = 2
a2 = []
assert set(a2) == set(strip_n(i2, n2))
i3 = [1, 2, 3, 4, 5]
n3 = 3
try:
    strip_n(i3, n3)
except ValueError:
    assert True
else:
    assert False
Explanation: D
Write a function strip_n that chops a certain number of elements off the front and back of a list.
input: 2 arguments, a list of numbers, and the number of list elements to remove from the front and back of the list
output: 1 list, the modified input list with specified number of leading and tailing elements removed
If the number of elements specified to strip from the list is infeasible--for example, asking to chop 3 elements off the front and back of a 1-element list--raise a ValueError.
For example, strip_n([1, 2, 3], 1) should return [2].
You cannot use any built-in functions or additional imports.
End of explanation
<END_TASK>