Teetering on the Edge
Consider the teeter-totters below, otherwise known as seesaws.
Let’s assume that four staff members (Analysia, Bernardo, Christie, and Diana) want to teeter (i.e., sit) on these totters, and let’s further assume that Analysia weighs 30kg, Bernardo weighs 35kg, Christie weighs 25kg, and Diana weighs 30kg. Is it possible to arrange the staff in some way on the teeter-totter such that it would be balanced? The answer is yes: with Analysia and Diana on one side, and Bernardo and Christie on the other, each side of the teeter-totter would have 60kg of weight on it.
Now let’s imagine we add a fifth staff member: Elijah, who weighs 50kg. Can the teeter-totter be balanced now? Again, yes. With Bernardo and Elijah on one side, and with Analysia, Christie, and Diana on the other, each side of the teeter-totter has 85kg of weight on it, even though the two sides don’t have the same number of staff.
Equivalently, we can consider a list in Python “balanceable” if it is possible to permute its elements and put an imaginary fulcrum between two elements such that the sum of elements on the left side of the fulcrum is equal to the sum of the elements on the right half of the fulcrum.
For example,
a = [9, 26, 2, 19]
is balanceable, because we could rearrange the elements of a
to be [9, 19, 2, 26]
and place the fulcrum between a[1]
and a[2]
and the sum of the elements on each side of the fulcrum would be 28
. (Note that other arrangements of the elements of a
are possible as well.) Similarly,
b = [1, 2, 3, 9, 3]
is also balanceable, because we could, for instance, rearrange the elements of b
to be [9, 3, 3, 1, 2]
and place the fulcrum between b[0]
and b[1]
, in which case the sum of the elements on each side of the fulcrum would be 9
. Note that the list is balanceable even though the number of elements on each side of the fulcrum is different, with one element on the left and four elements on the right.
By contrast, note that
c = [19, 8, 12]
is not balanceable. There is no way to permute the elements of c
and place a fulcrum between any two of them and have the list be balanced.
Questions
For each of the below questions, you may assume that all elements of input lists will be nonnegative integers.
-
(1 point.) Is the list
[5, 5]
balanceable? -
(1 point.) Is the list
[1, 0, 1, 0, 1, 0]
balanceable? -
(1 point.) Is the list
[3, 4, 5, 6, 8]
balanceable? -
(2 points.) Identify at least two potential features or properties of a list of items that would allow you to relatively quickly determine that the list is not balanceable.
-
(8 points.) Implement in
teetering.py
, in Python, a function calledbalanceable
that accepts one parameter: alist
of integers callednumbers
. The function should returnTrue
ifnumbers
is balanceable andFalse
otherwise. You may assume thatlen(numbers)
is positive and greater than or equal to 2. You may write additional helper functions if you wish, but yourbalanceable
function must be prototyped as described above.
In addition to submitting this subquestion using the instructions contained in the “How to Submit” section of the Test, you must also:
- Include your definition of the
balanceable
function in a file calledteetering.py
(importing any libraries necessary to run your code), and - Submit
teetering.py
by runningsubmit50 cs50/problems/2020/summer/test/teetering
.