Exercise 01 comprises three small Python programs you will complete the implementation of:
- A good vibes fortune cookie
- A little logical puzzle
- A vaccine calculator
Each of the three programs is somewhat more involved than the last. Start early!
- 5% early EC if final submission before: Saturday 2/6 at 11:59pm EST
- 3% early EC if final submission before: Sunday 2/7 at 11:59pm EST
- Deadline: Monday 2/8 at 11:59pm EST
0. Pull the skeleton code
You will find the starter files needed by “pulling” from the course workspace repository. Before beginning, be sure to:
- Be sure you are in your course workspace. Open the file explorer and you should see your work for the course. If you do not, open your course workspace through File > Open Recent.
- Open the Source Control View by clicking the 3-node (circles) graph (connected by lines) icon in your sidebar or opening the command palatte and searching for Source Control.
- Click the Ellipses in the Source Control pane and select “Pull” from the drop-down menu. This will begin the pulling process from the course repository. It should silently succeed.
- Return to the File Explorer pane and open the
exercisesdirectory. You should see it now contains another directory named
ex01. If you expand that directory, you should see the starter files for the three Python programs in this exercise.
Part 1. Fortune Cookie
After pulling the skeleton code, above, you can find the starter code for Fortune Cookie in the file
Your program is expected to print three lines. The first line of output must be the message
Your fortune cookie says.... The second line of output is random and will be discussed further following the example. The third line of output must be the message
Now, go spread positive vibes!. An example of running this program a few times is shown below.
$ python -m exercises.ex01.fortune_cookie Your fortune cookie says... A beautiful, smart, and loving person will be coming into your life. Now, go spread positive vibes! $ python -m exercises.ex01.fortune_cookie Your fortune cookie says... Your life will be happy and peaceful. Now, go spread positive vibes! $ python -m exercises.ex01.fortune_cookie Your fortune cookie says... Soon life will become more interesting. Now, go spread positive vibes!
Python has a standard
random library for producing pseudo-random numbers, which is great for our purposes. In the skeleton code, we have already imported a function named
randint for you from the
random library. You can use this function to generate a random
int value within some range of possible numbers. You can play around with
randint by starting an interactive Python REPL and importing it as shown in the skeleton code:
$ python Python 3.9.1 (tags/v3.9.1:1e5d33e, Dec 7 2020, 17:08:21) [MSC v.1927 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> from random import randint >>> print(randint(1, 10)) 8 >>> print(randint(50, 100)) 76 >>> print(randint(1, 2)) 1 >>> print(randint(1, 2)) 2 >>> type(randint(1, 10)) <class 'int'> >>> quit()
The numbers your examples produce will be random and different from the example shown above. Notice the
randint function takes two input arguments, both
int expressions separated by a comma, and evaluates to a single
int value that is a random
int between and inclusive of the two input arguments.
Since the evaluation of a call to
randint is an
int, you can use a variable declaration and assignment statement in your program to store the randomized result. Then, using that variable and nested
if/else conditional statements, you should print one of at least four messages at random.
You can choose any random fortune messages you would like for your program!
For full credit on this part of the assignment, beyond the requirements the autograder scores, you must:
- Only make one call to
randintand store the result in a variable
- Use nested
if/elseconditional statements within
elseblocks to control which fortune is printed. In other words, do not use four linear, unrelated
ifstatements. For an example of this, consider modifying the structure demonstrated in Lesson 7’s opening example.
Part 2. Tar Heel Arithmetic
The next program involves a small logical and arithmetic puzzle. The starter code is found in
tar_heels.py. You should
prompt the user for an integer and respond with the following logic:
- When evenly divisible by 2, print “TAR”.
- When evenly divisible by 7, print “HEELS”.
- When evenly divisible by both 2 and 7, print “TAR HEELS” instead of just “TAR” or “HEELS”
- When none of the above conditions are met, print “CAROLINA”
Consider the following demo:
$ python -m exercises.ex01.tar_heels Enter an int: 5 CAROLINA $ python -m exercises.ex01.tar_heels Enter an int: 8 TAR $ python -m exercises.ex01.tar_heels Enter an int: 21 HEELS $ python -m exercises.ex01.tar_heels Enter an int: 28 TAR HEELS
- Consider how making use of the arithmetic remainder operator and the equality operator can allow you to write a boolean expression to determine whether an integer is evenly divisible by some number or not.
- You will need to think carefully about the ordering of your logic, boolean operators, and the rules of
if/elsestatements in order to successfully implement the required logic.
Part 3. Vaccine Calculator
At the current rate of vaccinations, on what date will 80% of the population have received two vaccine shots? Let’s write a program to find out!
vaccine_calc.py program will take a few specific inputs, such as these which approximate where the United States is at on February 3rd, 2021.
$ python -m exercises.ex01.vaccine_calc Population: 330000000 Doses administered: 32780860 Doses per day: 1319981 Target percent vaccinated: 80 We will reach 80% vaccination in 375 days, which falls on February 13, 2022.
Notice we can plug in numbers for other populations, as well, such as North Carolina’s.
$ python -m exercises.ex01.vaccine_calc Population: 10500000 Doses administered: 1142903 Doses per day: 43000 Target percent vaccinated: 80 We will reach 80% vaccination in 364 days, which falls on February 02, 2022.
North Carolina is ahead of the national, but it’s clear we still need to dial up the vaccination rate to bring an end to this pandemic more quickly.
Finally, here is a mock data set for simple calculations you can test your formulas with:
$ python -m exercises.ex01.vaccine_calc Population: 100 Doses administered: 50 Doses per day: 2 Target percent vaccinated: 50 We will reach 50% vaccination in 25 days, which falls on February 28, 2021.
The “model” you will use in this calculator will be very naive relative to the more robust vaccination calculators you will find on-line. However, it is still a useful exercise in taking inputs from users and performing arithmetic calculations that go between multiple data types: ints, floats, and even dates! Your
vaccine_calc.py will introduce you to two new data types,
datetime for modeling a date, and
timedelta for modeling a timespan (such as 14 days or 1 hour and 30 minutes). Don’t worry, we will explain what you need to know shortly.
The model will make the following assumptions:
- Constant number of doses administered per day
- Ignores the pipeline problem of a second dose following the first by one month. We will assume every two doses fully vaccinates one person.
Your calculator should prompt the user for the following integer inputs:
- Population - the total number of people under consideration
- Doses administered - the total number of vaccine doses already given to the population (remember: 2x doses covers 1x person in the population)
- Doses per day - the total number of vaccine doses given each calendar day moving forward (remember: assume this is constant)
- Target percent vaccinated - an
intinput, out of 100, that represents the total percent of population your calculation is targetting (remember: unless doses administered is 0, some amount of progress toward this target has already been achieved)
The output of your calculator should be formatted as shown in the examples above. You will need to concatenate a string to produce the final output.
bool are data types, so are
timedelta. These types are not considered “built-in”, though, and must be imported as shown in the skeleton code of your exercise. These are powerful types which have capabilities beyond our needs, so the following examples will show you what you need to know in order to create your calculator. You are encouraged to play around with these examples in an interactive Python REPL:
$ python Python 3.9.1 (tags/v3.9.1:1e5d33e, Dec 7 2020, 17:08:21) [MSC v.1927 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> from datetime import datetime, timedelta >>> today: datetime = datetime.today() >>> print(today.strftime("%B %d, %Y")) February 03, 2021 >>> one_day: timedelta = timedelta(1) >>> tomorrow: datetime = today + one_day >>> print(tomorrow.strftime("%B %d, %Y")) February 04, 2021 >>> fortnight: timedelta = timedelta(7 + 7) >>> future: datetime = today + fortnight >>> print(future.strftime("%B %d, %Y")) February 17, 2021 >>> quit()
Let’s break down what transpired:
from datetime import datetime, timedelta- This statement imports the definitions of the types
timedelta. This step is taken care of for you already in the skeleton code. We will discuss importing in more depth soon.
today: datetime = datetime.today()- This statement establishes a variable named
todaywhose time is a
datetimetype has a special method, also named
today, which when called will evaluate to the current date and time of your computer.
today.strftime("%B %d, %Y")- The
todayobject has a method named
strftime, short for “string format (a) time”, because it is a
datetimeobject. This method evaluates to a
datetimeobject with what are called format codes. The
%Bformat code gives you the name of the month, the
%dformat code is the day of month, and
%Yis the 4-digit year. These are the only format codes you will need for this assignment, but if you are curious of what other codes exist, here is the official documentation with the complete list.
one_day: timedelta = timedelta(1)- This statement establishes a variable named
one_daywhose type is
timedelta. The expression
timedelta(1)constructs a new
timedeltaobject representing the duration of 1 day.
tomorrow: datetime = today + one_day- This statement establishes a variable named
tomorrow, of type
datetime, that is assigned the result of adding
today, which is today’s date, with
one_day, which represents a timespan of a complete day. You can perform addition and subtraction with
timedeltaobjects in order to calculate dates offset by some time span.
tomorrow.strftime("%B %d, %Y")- Once again, producing a
strrepresentation of a
datetimeobject. Notice the result is the day after the earlier example.
fortnight: timedelta = timedelta(7 + 7)- Similar to the previous construction of a
timedeltaobject, this time around notice the argument is an
intexpression. Hint: It could also be an
intvariable access expression! A fortnight is 14 days.
future: datetime = today + fortnight- Just like the previous example, except this one is calculating a date 14 days after today.
With that, you should be able to do the date calculations needed.
Hint: Before you begin!
Before you attempt to write this program you are encouraged to write down the steps you would take to calculate the number of days remaining yourself. Try and derive a series of formulaic steps, broken down step-by-step, before you attempt to write this as a Python program.
In your program you will need to convert between
float and back again in some places. When you convert from
float back to an
int, please use the built-in
Choose meaningful variable names (not just
x2, etc) that are descriptive of their purpose. For example, if you were writing a weather program and had a variable that represented the current temperature outside, choosing a name like
current_temperature is significantly easier to understand than a name like
Break your solution down into steps where necessary to avoid single lines of code becoming overly complex and obtuse.
3. Make a Backup Checkpoint “Commit”
As you make progress on this exercise, making backups is encouraged.
- Open the Source Control panel (Command Palette: “Show SCM” or click the icon with three circles and lines on the activity panel).
- Notice the files listed under Changes. These are files you’ve made modifications to since your last backup.
- Move your mouse’s cursor over the word Changes and notice the + symbol that appears. Click that plus symbol to add all changes to the next backup. You will now see the files listed under “Staged Changes”.
- If you do not want to backup all changed files, you can select them individually. For this course you’re encouraged to back everything up.
- In the Message box, give a brief description of what you’ve changed and are backing up. This will help you find a specific backup (called a “commit”) if needed. In this case a message such as, “Progress on Exercise 1” will suffice.
- Press the Check icon to make a Commit (a version) of your work.
- Finally, press the Ellipses icon (…), look for “Pull/Push” submenu, and select “Push to…”, and in the dropdown select your backup repository.
4. Submit to Gradescope for Grading
Login to Gradescope and select the assignment named “EX01 - Variables and Logic.”. You’ll see an area to upload a zip file. To produce a zip file for autograding, return back to Visual Studio Code.
If you do not see a Terminal at the bottom of your screen, open the Command Palette and search for “View: Toggle Integrated Terminal”.
Type the following command (all on a single line):
python -m tools.submission exercises/ex01
In the file explorer pane, look to find the zip file named “21.mm.dd-hh.mm-exercises-ex01.zip”. The “mm”, “dd”, and so on, are timestamps with the current month, day, hour, minute. If you right click on this file and select “Reveal in File Explorer” on Windows or “Reveal in Finder” on Mac, the zip file’s location on your computer will open. Upload this file to Gradescope to submit your work for this exercise.
Autograding will take a few moments to complete. For this exercise there will be 10 points manually graded for style – using meaningful variable names and
snake_case. If there are issues reported, you are encouraged to try and resolve them and resubmit. If for any reason you aren’t receiving full credit and aren’t sure what to try next, come give us a visit in office hours!