# CMU 15-112 Summer 2018: Fundamentals of Programming and Computer Science Homework 3 (Due Fri 25-May, at 5pm)

• This assignment is SOLO. This means you may not look at other student's code or let other students look at your code for these problems. See the syllabus for details.

• To start:
1. Create a folder named 'week1'
3. Edit hw3.py using Pyzo
4. When you are ready, submit hw3.py to Autolab. For this hw, you may submit up to 20 times (which is way more than you should require), but only your last submission counts.
• Do not use lists, or recursion in this assignment.
• Do not hardcode the test cases in your solutions.

1. mostFrequentLetters(s) [35pts]
Write the function mostFrequentLetters(s), that takes a string s, and ignoring case (so "A" and "a" are treated the same), returns a lowercase string containing the letters of s in most frequently used order. (In the event of a tie between two letters, follow alphabetic order.) So:
```   mostFrequentLetters("We Attack at Dawn")
```
returns "atwcdekn". Note that digits, punctuation, and whitespace are not letters! Also note that seeing as we have not yet covered lists, sets, maps, or efficiency, you are not expected to write the most efficient solution. (And you should not use lists, sets, or maps in your solution. Do not use sorted() or .sort() either.) Finally, if s does not contain any alphabetic characters, the result should be the empty string ("").

Background: for this problem, a "gradebook" is a multiline string where each row contains a student's name (one word, all lowercase) followed by one or more comma-separated integer grades. A gradebook always contains at least one student, and each row always contains at least one grade. Gradebooks can also contain blank lines and lines starting with the "#" character, which should be ignored.

With this in mind, write the function bestStudentAndAvg(gradebook), that takes a gradebook and finds the student with the best average (ignoring the case where there is a tie) and returns a string of that student's name followed by a colon (":") followed by his/her average (rounded using the provided roundHalfUp). For example, here is a test case:
```gradebook = """
# ignore  blank lines and lines starting  with  #'s
wilma,91,93
fred,80,85,90,95,100
betty,88
"""
```
Note: you most likely will want to use both s.split(",") and s.splitlines() in your solution.

3. patternedMessage(message, pattern) [35 pts]
Write the function patternedMessage(message, pattern) that takes two strings, a message and a pattern, and returns a string produced by replacing the non-whitespace characters in the pattern with the non-whitespace characters in the message (where any leading or trailing newlines in the pattern are first removed). As a first example:

 call result ```patternedMessage("Go Pirates!!!", """ *************** ****** ****** *************** """) ``` ```GoPirates!!!GoP irates !!!GoP irates!!!GoPira ```

Here, the message is "Go Pirates!!!" and the pattern is a block of asterisks with a few missing in the middle. Notice how the whitespace in the pattern is preserved, but the whitespace in the message is removed. Again, note that any leading or trailing newlines in the pattern are removed.

Here is another example:

 call result ```patternedMessage("Three Diamonds!",""" * * * *** *** *** ***** ***** ***** *** *** *** * * * """) ``` ``` T h r eeD iam ond s!Thr eeDia monds !Th ree Dia m o n ```

Hint: While you may solve this how you wish, our sample solution did not use replace in any way. Instead, we started with the empty string, and built up the result character by character. How did we determine the next character? Using both the message and the pattern in some way...

And here is one last example, just for fun:

```patternedMessage("Go Steelers!",
"""
oooo\$\$\$\$\$\$\$\$\$\$\$\$oooo
oo\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$o
oo\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$o         o\$   \$\$ o\$
o \$ oo        o\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$o       \$\$ \$\$ \$\$o\$
oo \$ \$ '\$      o\$\$\$\$\$\$\$\$\$    \$\$\$\$\$\$\$\$\$\$\$\$\$    \$\$\$\$\$\$\$\$\$o       \$\$\$o\$\$o\$
'\$\$\$\$\$\$o\$     o\$\$\$\$\$\$\$\$\$      \$\$\$\$\$\$\$\$\$\$\$      \$\$\$\$\$\$\$\$\$\$o    \$\$\$\$\$\$\$\$
\$\$\$\$\$\$\$    \$\$\$\$\$\$\$\$\$\$\$      \$\$\$\$\$\$\$\$\$\$\$      \$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$
\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$    \$\$\$\$\$\$\$\$\$\$\$\$\$    \$\$\$\$\$\$\$\$\$\$\$\$\$\$  '\$\$\$
'\$\$\$'\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$     '\$\$\$
\$\$\$   o\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$     '\$\$\$o
o\$\$'   \$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$       \$\$\$o
\$\$\$    \$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$' '\$\$\$\$\$\$ooooo\$\$\$\$o
o\$\$\$oooo\$\$\$\$\$  \$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$   o\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$
\$\$\$\$\$\$\$\$'\$\$\$\$   \$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$     \$\$\$\$'
''''       \$\$\$\$    '\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$'      o\$\$\$
'\$\$\$o     '\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$'\$\$'         \$\$\$
\$\$\$o          '\$\$'\$\$\$\$\$\$'           o\$\$\$
\$\$\$\$o                                o\$\$\$'
'\$\$\$\$o      o\$\$\$\$\$\$o'\$\$\$\$o        o\$\$\$\$
'\$\$\$\$\$oo     '\$\$\$\$o\$\$\$\$\$o   o\$\$\$\$'
'\$\$\$\$\$oooo  '\$\$\$o\$\$\$\$\$\$\$\$\$'
'\$\$\$\$\$\$\$oo \$\$\$\$\$\$\$\$\$\$
'\$\$\$\$\$\$\$\$\$\$\$
\$\$\$\$\$\$\$\$\$\$\$\$
\$\$\$\$\$\$\$\$\$\$'
'\$\$\$'
""")
```

Returns this:

```                          GoSteelers!GoSteeler
s!GoSteelers!GoSteelers!GoS
teelers!GoSteelers!GoSteelers!GoS         te   el er
s ! Go        Steelers!GoSteelers!GoSteelers!GoSteel       er s! GoSt
ee l e rs      !GoSteeler    s!GoSteelers!    GoSteelers       !GoSteel
ers!GoSte     elers!GoSt      eelers!GoSt      eelers!GoSt    eelers!G
oSteele    rs!GoSteele      rs!GoSteele      rs!GoSteelers!GoSteeler
s!GoSteelers!GoSteelers    !GoSteelers!G    oSteelers!GoSt  eele
rs!GoSteelers!GoSteelers!GoSteelers!GoSteelers!GoSteel     ers!
GoS   teelers!GoSteelers!GoSteelers!GoSteelers!GoSteelers     !GoSt
eele   rs!GoSteelers!GoSteelers!GoSteelers!GoSteelers!GoSt       eele
rs!    GoSteelers!GoSteelers!GoSteelers!GoSteelers!Go Steelers!GoSteele
rs!GoSteelers  !GoSteelers!GoSteelers!GoSteelers!GoS   teelers!GoSteelers
!GoSteelers!G   oSteelers!GoSteelers!GoSteelers!Go     Steel
ers!       GoSt    eelers!GoSteelers!GoSteelers!G      oSte
elers     !GoSteelers!GoSteelers!         GoS
teel          ers!GoSteel           ers!
GoSte                                elers
!GoSte      elers!GoSteele        rs!Go
Steelers     !GoSteelers!   GoStee
lers!GoSte  elers!GoSteeler
s!GoSteele rs!GoSteel
ers!GoSteele
rs!GoSteeler
s!GoSteeler
s!GoS```