Section #5: String Parsing, Drawing, & Main


Written by Juliette Woodrow, Anna Mistele, John Dalloul, Elyse Cornwall, and Ashlee Kupor


This week in section, you will gain practice with drawing and parsing strings with while loops. Download the starter project above to code and test your own solutions - we've also provided a few helpful Doctests.

Stanford Flag

You have been hired by Stanford to create a digital version of their new flag. It consists of two patches, which you'll code up separately, before writing a function to assemble a flag out of both patches.

Ray Patch

First, we'll design the "ray patch", which represents the sunny California climate. We will write a function draw_ray_patch(canvas, left, top, width, height, num_rays) that takes in a canvas, and draws a ray patch of size (width, height) starting from location (left, top) on the canvas. The ray will consist of num_rays lines originating from the bottom right of the patch, and spreading evenly across the top of the patch. Here's what a ray patch with 4 rays looks like (the dashed box is added to illustrate the width and height of the patch):

the ray patch with four rays, which has four black lines that end in the bottom right of the patch, 
          and begin at the top of the patch, evenly spaced across the top of the patch. The image is annotated
          to indicate that the patch starts at coordinate (left, down) and has width and height given by the 
          variables width and height.

Stripe Patch

Next, we'll design the "stripe patch", which consists of horizontal stripes in Stanford's colors: red and green. We will write a function draw_stripe_patch(canvas, left, top, width, height, num_stripes) that takes in a canvas, and draws a striped patch of size (width, height) starting from location (left, top) on the canvas. There will be num_stripes horizontal stripes (rectangles) drawn across the patch, all of equal width. Alternate between red and green, starting with a red stripe at the top of the canvas. Below is what a stripe patch with 9 stripes looks like. Hint: First, figure out how to calculate the height of each stripe, using integer division.

the stripe patch with nine horizontal stripes, alternating red and green starting with red.
          Like the image above, this one is annotated
          to indicate that the patch starts at coordinate (left, down) and has width and height given by the 
          variables width and height.

Draw Flag

Finally, we'll put three patches together to create our Stanford flag. We'll have two stripe patches on either side, with a ray patch in the middle. Implement the function draw_flag(canvas, width, height, num_rays, num_stripes) that takes in a canvas to draw on and its width and height. For each ray patch, we should draw num_rays lines. For each stripe patch, we should draw num_stripes stripes. The picture below is what it should look like if we call draw_flag(canvas, 900, 500, 9, 4). Hint: Think about the two patch functions you just wrote, and what parameters they need.

The Stanford flag with canvas size 900 x 500. It consists of one row of three patches; two stripe patches on either side of
          a ray patch. Following from the examples above, this example Stanford flag has 4 rays in its ray patch, and 9 stripes in its stripe patch.

Test your code in the PyCharm project by running python3 stanford_flag.py or py stanford_flag.py


Parse Hashtag

Implement a function, parse_hashtag(s), which takes in a string s representing a single tweet and returns the hashtag within the tweet. For this problem, each input string will have only one hashtag, or none at all. A hashtag can be defined as a string of 1 or more alphanumeric characters immediately following a # character. A single hashtag ends at the first non-alphanumeric character following the #. You can check if a character ch is alphanumeric by doing if is ch.alnum(). If there are no hashtags (no #), return the empty string. Here are a few examples of calling our function:

        
parse_hashtag('I love the new #Stanford flag') -> 'Stanford'
parse_hashtag('Go #ClassOf2023!') -> 'ClassOf2023'
parse_hashtag('Nothing to see here') -> ''