Think about a function print_street_at_height(elements, height)
that produces a single line of output: the street at the specified height. For example, again consider this street, with heights shown in a column on the right:
height +-------------------------------+ | | 7 | xxxxx | 6 | xxxxx | 5 | * xxxxx | 4 | *** xxxxx | 3 | ***** xxxxx | 2 | | xxxxx | 1 | | xxxxx ~ ~ | 0 +-------------------------------+The call
print_street_at_height(..., 0)
would print this line:
| | xxxxx ~ ~ |The call
print_street_at_height(..., 2)
would print this line:
| ***** xxxxx |Thus, calling
print_street_at_height
with a series of descending heights would produce the rendering, excluding the top and bottom borders.
Think about having Building
, Park
, and EmptyLot
classes. Give each class an at_height
method that returns a string that is the text for that element at the specified height. Example: (blank lines added for clarity)
>>> b = Building(3,4,"x") # NOTE: this is not the same building that's shown above! >>> b.at_height(0) 'xxx' >>> b.at_height(4) ' '
Next, consider this:
>>> s = [EmptyLot(5,"_"), Building(3,4,"x"), Park(7,"*")] >>> h = 0 >>> s[0].at_height(h) + s[1].at_height(h) + s[2].at_height(h) ' xxx | ' >>> h = 2 >>> s[0].at_height(h) + s[1].at_height(h) + s[2].at_height(h) ' xxx ***** '
Combining the ideas of (1) and (2) leads to this:
>>> s = [EmptyLot(5,"_"), Building(3,4,"x"), Park(7,"*")] >>> print_street_at_height(s, 5) >>> print_street_at_height(s, 4) * >>> print_street_at_height(s, 3) xxx *** >>> print_street_at_height(s, 2) xxx ***** >>> print_street_at_height(s, 1) xxx | >>> print_street_at_height(s, 0) xxx |
Note: The version of print_street_at_height
used above output a newline after the text to make for a clear example but in practice you may find that having print_street_at_height
output a newline creates problems.