A document from MCS 260 Fall 2021, instructor David Dumas. You can also get the notebook file.

MCS 260 Fall 2021 Project 1

  • Course instructor: David Dumas

Instructions

Deadline is 6pm CDT on Friday September 17, 2021

Collaboration policy and academic honesty

This project must be completed individually. Seeking or giving aid on this assignment is prohibited; doing so constitutes academic misconduct which can have serious consequences. The only resources you are allowed to consult are the ones listed below. If you are unsure about whether something is allowed, ask. The course syllabus contains more information about the course and university policies regarding academic honesty.

Resources you are allowed to consult

  • Documents and videos posted to the course web page
  • Any of the optional textbooks listed on the course web page

Ask if you are unsure whether a resource falls under one of these categories.

What to do if you are stuck

Contact the instructor or your TA by email, in office hours, or on discord.

What to submit

The rest of this document describes a program mwdps.py you need to write and submit to Gradescope. That is the only file you need to submit for this project.

When to submit

The autograder will open on Monday, September 13. At that time it will be possible to submit your project. It's a good idea to submit a working but incomplete program as early as possible so you can see what the autograder report looks like.

The last version you submit before the project deadline is the one that will determine your score.

Defining the Mean With Digit Power (MWDP)

This section will explain a mathematical process that is used in the program you'll write.

Suppose n is a positive integer. For the purposes of this project, we use the term largest digit of n to refer the decimal digit appearing in n that has the largest value. For example

  • The largest digit of 100 is 1
  • The largest digit of 5284 is 8
  • The largest digit of 620 is 6
  • The largest digit of 1200000000 is 2

Also, we'll call the number of digits in a number n its length (again, for this project; this isn't standard terminology). For example:

  • The length of 100 is 3
  • The length of 8 is 1
  • The length of 5284 is 4
  • The length of 1200000000 is 10

Now, the essential definition:

Starting from a given integer n we define a new integer m as follows: Take the largest digit of n and call it d. Then, take the length of n and call it k. Then m is defined to be the result of adding n and d**k and then integer-dividing by 2. We call m the mean with digit power (MWDP) of n.

Here is an example:

  • Start with n = 5284
  • The largest digit is d=8
  • The length of n is k=4
  • d**k = 8**4 = 4096
  • The sum of 5284 and 4096 is 9380
  • Integer dividing 9380 by 2 gives m=4690

So if we start with the integer 5284, then its mean with digit power is 4690.

Defining the Mean With Digit Power Sequence

The MWDP starts with one integer and gives you another one. You can repeat this process again to get another integer, and so on.

That is, if we are given a starting integer $n_0$, we can define an infinite sequence of integers $n_i$ by the rule that $n_{i+1}$ is the mean with digit power of $n_{i}$. We call this the mean with digit power sequence (or MWDPS)

For example, if $n_0$ is 5284, then the first few terms of this sequence are: $$ 5284, 4690, 5625, 3460, 2378, 3237, 2819, ... $$ This means that the mean with digit power of 5284 is 4690, and the mean with digit power of 4690 is 5625, and so on.

The program you need to write: mwdps.py

Write a program called mwdps.py that asks the user for a positive integer n using the prompt Starting value:.

The program should then print the terms of the mean with digit power sequence starting with n, one per line.

If the program ever prints a term that already appeared earlier in the sequence, the program should detect that, print "looped" on the next line, and exit immediately.

Otherwise, if 100 terms of the sequence have been printed and all of them are distinct, then the program should print "maxiter" and exit.

Note that this means the last line of the program's output will always be either

maxiter

or

looped

Examples of expected output from the program

The test cases below show what output the program should produce when certain numbers are entered. Keep in mind that your program needs to work with any nonnegative integer, not just the ones shown here.

  • Test case where the user enters 5:
    Starting value: 5
    5
    5
    looped
    Remark: In this case the sequence is just 5,5,5,5,5,...
  • Test case where the user enters 321:
    Starting value: 321
    321
    174
    258
    385
    448
    480
    496
    612
    414
    239
    484
    498
    613
    414
    looped
  • Test case where the user enters 213687239:
    Starting value: 213687239
    213687239
    300553864
    217385796
    302403142
    151332643
    80705169
    61875945
    52461333
    27070474
    16417637
    11091219
    27068970
    35057845
    25917530
    34482125
    25629670
    34338195
    38692458
    40869589
    41958155
    42502438
    29639827
    36343274
    21054037
    13409419
    28228070
    22502643
    12091129
    27568925
    35307823
    26042519
    34544620
    18112118
    17444667
    11604734
    8684767
    5390959
    5086964
    4934966
    4858967
    4820968
    4801968
    4792468
    4787718
    3442435
    1760280
    1928716
    3355842
    2726497
    3754733
    2289138
    3536053
    1907994
    3345481
    2721316
    1772429
    3277699
    4030334
    2023359
    3403164
    1841550
    1969351
    3376160
    2099851
    3441410
    1728897
    3255933
    4019451
    4401210
    2208797
    3495883
    4139426
    4461197
    4622083
    3359617
    4071293
    4427131
    2625337
    1724440
    1273991
    3028480
    2562816
    2329984
    3556476
    2190009
    3486489
    4134729
    4458849
    4620909
    4701939
    4742454
    2782998
    3782983
    4282976
    4532972
    4657970
    4720469
    4751719
    4767344
    2795443
    maxiter

Code style rules - IMPORTANT

Required header

The first three lines of your Python program must be comments in the following format:

# MCS 260 Fall 2021 Project 1
# Full Name
# Individual work declaration

In the second line, replace Full Name with your full name.

In the third line, replace Individual work declaration with a single full sentence, written in your own words, explaining that you completed the project individually and followed the rules in the syllabus and project description.

Use good variable names

You are expected to choose variable names that communicate a variable's purpose in a concise way, but without being too terse. Uninformative low-effort names like intvar or mystring are not acceptable. Single-letter variable names can be used, but sparingly, and should usually be avoided for lists or other complex data structures. Most of the time, a good variable name will be a single word, like total or sequence or step.

Use comments to explain, not to disable code

You are encouraged, but not required, to include comments that contain explanatory text.

Do not use comments to disable code that you don't want to run. Instead, remove such code before submitting.

How your project will be graded

Autograder: 40 points

The autograder tests your program and grades it based on its behavior. The following tests will be run:

  1. Was a file called mwdps.py submitted? (5 points)
  2. Does the Python interpreter accept the contents of mwdps.py as valid Python code? (5 points)
  3. When mwdps.py is run, does it start successfully and wait for user input? (5 points)
  4. When the program is given an integer as input, does it produce the expected output? (5 tests x 5 points per test = 25 points).
    • The five test integers used here will be different from the ones shown above.
    • Partial credit will be given on test cases using the following rubric.
      • 5 points is given if the output exactly matches the expected output.
      • 4 points is given if the first three lines of output after the input prompt match the first three numbers of the MWDPS for the requested number
      • 3 points is given if the first two lines of output after the input prompt match the first two numbers of the MWDPS for the requested number
      • 1 point is given if the line immediately following the input prompt consists of the starting number, and nothing else

Manual review: 5 points

I will review your code and look for adherence to the style guidelines given above, and examine your method of solving the problem. If I see that your program does not do what was requested in this document, but the error was not detected in the automated testing, a deduction may be given at this point. The scores assigned by the autograder will not be changed during manual review unless I discover some kind of intentional wrongdoing (such as an attempt to circumvent or reverse-engineer the autograder's operation).

Hints, tips, and warnings

Break the task into small parts

Try to find simpler programs that do something related to the project that you can write first. Get those working, and build up gradually to the full program described above.

For example, it might make sense to try writing code that can do the following things:

  • Compute the length of an integer
  • Compute the largest digit of an integer
  • Compute the MWDP of an integer
  • Compute the first 10 terms of the MWDP sequence starting from a given integer (or first 100 terms)
  • Compute terms of the MWDP sequence while also storing the ones computed so far in a list
  • Stop computing terms of the MWDP sequence if a term is found that was previously seen

Length and len

You can compute the length of a string or list in Python using len(). However, this function does not apply to integers, and in particular it will not let you compute the thing we've called the "length of an integer" above. If you call len() on an integer, you will get an error:

In [78]:
len(51)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-78-9bb4d3c3b12b> in <module>
----> 1 len(51)

TypeError: object of type 'int' has no len()

It is possible to compute the length (i.e. number of digits) of an integer using Python, but you'll need to do something slightly different.

Test locally

As you write your project, test it locally on your own computer or the lab computer you use for your work. That is, run it in powershell or Terminal and make sure it works. It is much harder to debug a broken program based solely on reports you get from the autograder compared to working with your local Python interpreter.

Revision history

  • 2021-09-11 Edit description of the manual review process to say that I might change autograder scores in cases of intentional wrongdoing
  • 2021-09-08 Fixed the 213687239 test case
  • 2021-09-07 Initial publication