From 5d9458a296e67e47e0b3fa983cb2228f42bb566b Mon Sep 17 00:00:00 2001 From: Dave Fugelso Date: Tue, 7 Oct 2014 13:05:31 -0700 Subject: [PATCH 1/5] Session One howework --- Students/Dave Fugelso/Session 1/breakme.py | 33 ++++++ Students/Dave Fugelso/Session 1/grid.py | 121 +++++++++++++++++++++ 2 files changed, 154 insertions(+) create mode 100644 Students/Dave Fugelso/Session 1/breakme.py create mode 100644 Students/Dave Fugelso/Session 1/grid.py diff --git a/Students/Dave Fugelso/Session 1/breakme.py b/Students/Dave Fugelso/Session 1/breakme.py new file mode 100644 index 00000000..761583bf --- /dev/null +++ b/Students/Dave Fugelso/Session 1/breakme.py @@ -0,0 +1,33 @@ +''' +In the break_me.py file write four simple Python functions: + +Each function, when called, should cause an exception to happen +Each function should result in one of the four common exceptions from our lecture. +for review: NameError, TypeError, SyntaxError, AttributeError + + +Use the Python standard library reference on Built In Exceptions as a reference +''' + +def nameErrorExample(): + t = somethingThatDoesntExist() + +def typeErrorExample (): + a = 'Hello, World!' + worlds = 1 + worlds = worlds + a + +def syntaxErrorExample (): +# a = 'some string' +# a.print() + pass + +import time +def attributeErroexample(): + t = time.time + b = t.newtime + +#nameErrorExample() +#typeErrorExample () +syntaxErrorExample () +attributeErroexample() \ No newline at end of file diff --git a/Students/Dave Fugelso/Session 1/grid.py b/Students/Dave Fugelso/Session 1/grid.py new file mode 100644 index 00000000..1753a208 --- /dev/null +++ b/Students/Dave Fugelso/Session 1/grid.py @@ -0,0 +1,121 @@ +''' + +Dave Fugelso + +Problem: + +Write a function that draws a grid like the following: + ++ - - - - + - - - - + +| | | +| | | +| | | +| | | ++ - - - - + - - - - + +| | | +| | | +| | | +| | | ++ - - - - + - - - - + +Hint: to print more than one value on a line, you can print a comma-separated sequence: print "+ -" + +If the sequence ends with a comma, Python leaves the line unfinished, so the value printed next appears on the same line. + +print "+", +print "-" +The output of these statements is "+ -". + +A print statement all by itself ends the current line and goes to the next line. + +Part 2: + +Write a function print_grid() that takes one integer argument and prints a grid like the picture above, BUT the size of the grid is given by the argument. + +For example, print_grid(11) prints the grid in the above picture. + +This problem is underspecified. Do something reasonable. + +Hints: + +A character is a string of length 1 + +s + t is string s followed by string t + +s * n is string s replicated n times + +Part 3: + +Write a function that draws a similar grid with three rows and three columns. + +(what to do about rounding?) + + + +''' + +def cellTopBottom(cells, size): + ''' + print cell top or botton, including the '+' + ''' + for columns in range (0, cells): + print '+', + for i in range (0, size): + print '-', + print '+' + +def printSide (cells, size): + ''' + Just do the sides, no '+' + ''' + + + for rows in range (0, size): + print '|', + for column in range (0, cells): + for spaces in range(0, size): + print ' ', + print '|', + print + +def fixed_grid(): + ''' + print a two by two grid like example above. + ''' + cells = 2 + size = 4 + + for rows in range(0, cells): + cellTopBottom(cells, size) + printSide (cells, size) + cellTopBottom(cells, size) + +def print_grid(size): + ''' + Take an argument and print a grid with a vartiable size + ''' + cells = 2 + + for rows in range(0, cells): + cellTopBottom(cells, size) + printSide (cells, size) + cellTopBottom(cells, size) + +def print_grid_variable_cells(cells, size): + ''' + Take an argument and print a grid with a variable size + Take an argument for number of cells + + Ah, by using cells and size for the cell size I completely missed the rounding portion of this problem. + If I did do iut the other way, I would have left off the right and bottom edges. + ''' + + for rows in range(0, cells): + cellTopBottom(cells, size) + printSide (cells, size) + cellTopBottom(cells, size) + +fixed_grid() +print_grid(4) +print_grid(5) +print_grid_variable_cells (3, 4) + From c491b4b1af26d3031638cb86c0f2711a9acf0a37 Mon Sep 17 00:00:00 2001 From: Dave Fugelso Date: Tue, 7 Oct 2014 18:17:33 -0700 Subject: [PATCH 2/5] Lightning Talk add --- Students/Dave Fugelso/Lightning Talk/one.py | 115 ++++++++++++++++ Students/Dave Fugelso/Lightning Talk/prime.py | 128 ++++++++++++++++++ .../Lightning Talk/puzzle listing.png | Bin 0 -> 42798 bytes Students/Dave Fugelso/Lightning Talk/two.py | 120 ++++++++++++++++ 4 files changed, 363 insertions(+) create mode 100644 Students/Dave Fugelso/Lightning Talk/one.py create mode 100644 Students/Dave Fugelso/Lightning Talk/prime.py create mode 100644 Students/Dave Fugelso/Lightning Talk/puzzle listing.png create mode 100644 Students/Dave Fugelso/Lightning Talk/two.py diff --git a/Students/Dave Fugelso/Lightning Talk/one.py b/Students/Dave Fugelso/Lightning Talk/one.py new file mode 100644 index 00000000..474ee472 --- /dev/null +++ b/Students/Dave Fugelso/Lightning Talk/one.py @@ -0,0 +1,115 @@ + +original = ''' +518659005232r583491410442e291745698219m421410443129o162080940635v32416189681e64832 +3758660l64832378918a291745692333r648323762540g324161887930e680739944367s22691331914 +3t129664756724p486242827755r648323758580i97248568173m486242846295e421410460783 +''' + +originalParsedText = ''' +518659005232 +r +583491410442 +e +291745698219 +m +421410443129 +o +162080940635 +v +32416189681 +e +648323758660 +l +64832378918 +a +291745692333 +r +648323762540 +g +324161887930 +e +680739944367 +s +226913319143 +t +129664756724 +p +486242827755 +r +648323758580 +i +97248568173 +m +486242846295 +e +421410460783 +''' + + +a = ''' +486242831895 +551075217947 +259329507176 +388994275884 +129664751092 +0 +615907574147 +32416188601 +259329512488 +615907584293 +291745691343 +648323773780 +194497138302 +97248563157 +453826655534 +615907594667 +64832376454 +453826635794 +388994273508 +''' + +#Code posted on Daniwe.com by a moderators named +# prime numbers are only divisible by unity and themselves +# (1 is not considered a prime number by convention) +def isprime(n): + '''check if integer n is a prime''' + # make sure n is a positive integer + n = abs(int(n)) + # 0 and 1 are not primes + if n < 2: + return False + # 2 is the only even prime number + if n == 2: + return True + # all other even numbers are not primes + if not n & 1: + return False + # range starts with 3 and only needs to go up the squareroot of n + # for all odd numbers + for x in range(3, int(n**0.5)+1, 2): + if n % x == 0: + return False + return True + +def solve(): + ''' + Find out which of the number above are prime + ''' + + b = a.split() + primes = list() + + for line in b: + i = int(line) + print 'checking', i, + if isprime(i): + print 'is prime' + else: + print 'is not prime' + + + + + + +solve() \ No newline at end of file diff --git a/Students/Dave Fugelso/Lightning Talk/prime.py b/Students/Dave Fugelso/Lightning Talk/prime.py new file mode 100644 index 00000000..f3b7b57b --- /dev/null +++ b/Students/Dave Fugelso/Lightning Talk/prime.py @@ -0,0 +1,128 @@ + +original = ''' +518659005232r583491410442e291745698219m421410443129o162080940635v32416189681e64832 +3758660l64832378918a291745692333r648323762540g324161887930e680739944367s22691331914 +3t129664756724p486242827755r648323758580i97248568173m486242846295e421410460783 +''' + +originalParsedText = ''' +518659005232 +r +583491410442 +e +291745698219 +m +421410443129 +o +162080940635 +v +32416189681 +e +648323758660 +l +64832378918 +a +291745692333 +r +648323762540 +g +324161887930 +e +680739944367 +s +226913319143 +t +129664756724 +p +486242827755 +r +648323758580 +i +97248568173 +m +486242846295 +e +421410460783 +''' + + +nums = ''' +486242831895 +551075217947 +259329507176 +388994275884 +129664751092 +0 +615907574147 +32416188601 +259329512488 +615907584293 +291745691343 +648323773780 +194497138302 +97248563157 +453826655534 +615907594667 +64832376454 +453826635794 +388994273508 +''' + +#Code posted on Daniwe.com by a moderators named +def isprime(n): + '''check if integer n is a prime''' + # make sure n is a positive integer + n = abs(int(n)) + # 0 and 1 are not primes + if n < 2: + return n, 'False' + # 2 is the only even prime number + if n == 2: + return 2, 'True' + # all other even numbers are not primes + if not n & 1: + return n/2, 'False' + # range starts with 3 and only needs to go up the squareroot of n + # for all odd numbers + for x in range(3, int(n**0.5)+1, 2): + if n % x == 0: + return n/x, 'False' + return n, 'True' + +def solve(): + ''' + Process a list of numbers and factor out the largest prime number in each. + Add 65 to the number left and convert to a character + ''' + + numbers = nums.split() + largestPrimesGone = list() + + for line in numbers: + i = int(line) + print 'checking', i + n, prime = isprime(i) + while prime == 'False' and n > 2: + print 'was not prime now checking', n + n, prime = isprime(n) + + print 'largest prime is ', n + if n != 0: + n = i / n + print 'new num is ', n + largestPrimesGone.append(n) + + + addr = '' + for line in largestPrimesGone: + print line + addr = addr + str(unichr(line+65)) + + + print addr + + + + + +solve() diff --git a/Students/Dave Fugelso/Lightning Talk/puzzle listing.png b/Students/Dave Fugelso/Lightning Talk/puzzle listing.png new file mode 100644 index 0000000000000000000000000000000000000000..94af86085295f0e50d8bc11f8c316e69bdbe3e87 GIT binary patch literal 42798 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 2: + print 'was not prime now checking', n + n, prime = isprime(n) + + print 'largest prime is ', n + if n != 0: + n = i / n + print 'new num is ', n + primes.append(n) + + + print 'List is ' + for n in primes: + print n + + + + +solve() \ No newline at end of file From 99265607fa4e471501acfe59a52088fe5b9b0561 Mon Sep 17 00:00:00 2001 From: Dave Fugelso Date: Thu, 9 Oct 2014 11:42:54 -0700 Subject: [PATCH 3/5] Ackermann module with unit tests included up to A(4,0) --- Students/Dave Fugelso/Session 2/Ackerman.py | 25 +++++++ Students/Dave Fugelso/Session 2/ack.py | 77 +++++++++++++++++++++ 2 files changed, 102 insertions(+) create mode 100644 Students/Dave Fugelso/Session 2/Ackerman.py create mode 100644 Students/Dave Fugelso/Session 2/ack.py diff --git a/Students/Dave Fugelso/Session 2/Ackerman.py b/Students/Dave Fugelso/Session 2/Ackerman.py new file mode 100644 index 00000000..8cfe852e --- /dev/null +++ b/Students/Dave Fugelso/Session 2/Ackerman.py @@ -0,0 +1,25 @@ +''' + +The Ackermann function, A(m, n), is defined: + +A(m, n) = + n+1 if m = 0 + A(m−1, 1) if m > 0 and n = 0 + A(m−1, A(m, n−1)) if m > 0 and n > 0. +See http://en.wikipedia.org/wiki/Ackermann_function. + +Create a new module called ack.py in a session02 folder in your student folder. In that module, write a function named ack that performs Ackermann’s function. + +Write a good docstring for your function according to PEP 257. +Ackermann’s function is not defined for input values less than 0. Validate inputs to your function and return None if they are negative. +The wikipedia page provides a table of output values for inputs between 0 and 4. Using this table, add a if __name__ == "__main__": block to test your function. + +Test each pair of inputs between 0 and 4 and assert that the result produced by your function is the result expected by the wikipedia table. + +When your module is run from the command line, these tests should be executed. If they all pass, print “All Tests Pass” as the result. + +Add your new module to your git clone and commit frequently while working on your implementation. Include good commit messages that explain concisely both what you are doing and why. + +When you are finished, push your changes to your fork of the class repository in GitHub. Then make a pull request and submit your assignment in Canvas. + +''' \ No newline at end of file diff --git a/Students/Dave Fugelso/Session 2/ack.py b/Students/Dave Fugelso/Session 2/ack.py new file mode 100644 index 00000000..576210e2 --- /dev/null +++ b/Students/Dave Fugelso/Session 2/ack.py @@ -0,0 +1,77 @@ +''' + +Dave Fugelso Python Course homework Session 2 Oct. 9 + +The Ackermann function, A(m, n), is defined: + +A(m, n) = + n+1 if m = 0 + A(m-1, 1) if m > 0 and n = 0 + A(m-1, A(m, n-1)) if m > 0 and n > 0. + + + + See http://en.wikipedia.org/wiki/Ackermann_funciton + +Create a new module called ack.py in a session02 folder in your student folder. + +In that module, write a function named ack that performs Ackermann's function. + + +Write a good docstring for your function according to PEP 257. +Ackermanns function is not defined for input values less than 0. Validate inputs to your function and return None if they are negative. +The wikipedia page provides a table of output values for inputs between 0 and 4. Using this table, add a if __name__ == "__main__": block to test your function. + +Test each pair of inputs between 0 and 4 and assert that the result produced by your function is the result expected by the wikipedia table. + +When your module is run from the command line, these tests should be executed. If they all pass, + + +print All Tests Pass as the result. + +Add your new module to your git clone and commit frequently while working on your implementation. Include good commit messages that explain concisely both what you are doing and why. + +When you are finished, push your changes to your fork of the class repository in GitHub. Then make a pull request and submit your assignment in Canvas. + +''' + +#Ackermann function +def ack(m, n): + ''' + Calculate the value for Ackermann's function for m, n. + ''' + + if m < 0 or n < 0: return None + + if m == 0: return n+1 + + if n == 0: return ack(m-1, 1) + + return ack (m-1, ack (m, n-1)) + + +if __name__ == "__main__": + ''' + Unit test for Ackermann function. Print table m = 0,4 and n = 0,4. + ''' + + #Print nicely + print 'm/n\t\t', + for n in range(0,5): + print n, '\t', + print '\n' + + for m in range (0,4): + print m,'\t', + for n in range(0,5): + print '\t', + print ack(m, n), + print + + # for the m = 4 row, just print the first one (n = 0) otherwise we hit a stack overflow (maximum resursion) + m = 4 + print m,'\t', + for n in range(0,1): + print '\t', + print ack(m, n), + print '\t-\t-\t-\t-' \ No newline at end of file From a5e552e7a2d6c9379897adfdc0a7a2bcfcd6b89f Mon Sep 17 00:00:00 2001 From: Dave Fugelso Date: Thu, 9 Oct 2014 15:15:07 -0700 Subject: [PATCH 4/5] Finished Fibonacci and Lucas series function with unit tests and explanations --- Students/Dave Fugelso/Session 2/Ackerman.py | 25 ------ Students/Dave Fugelso/Session 2/series.py | 98 +++++++++++++++++++++ 2 files changed, 98 insertions(+), 25 deletions(-) delete mode 100644 Students/Dave Fugelso/Session 2/Ackerman.py create mode 100644 Students/Dave Fugelso/Session 2/series.py diff --git a/Students/Dave Fugelso/Session 2/Ackerman.py b/Students/Dave Fugelso/Session 2/Ackerman.py deleted file mode 100644 index 8cfe852e..00000000 --- a/Students/Dave Fugelso/Session 2/Ackerman.py +++ /dev/null @@ -1,25 +0,0 @@ -''' - -The Ackermann function, A(m, n), is defined: - -A(m, n) = - n+1 if m = 0 - A(m−1, 1) if m > 0 and n = 0 - A(m−1, A(m, n−1)) if m > 0 and n > 0. -See http://en.wikipedia.org/wiki/Ackermann_function. - -Create a new module called ack.py in a session02 folder in your student folder. In that module, write a function named ack that performs Ackermann’s function. - -Write a good docstring for your function according to PEP 257. -Ackermann’s function is not defined for input values less than 0. Validate inputs to your function and return None if they are negative. -The wikipedia page provides a table of output values for inputs between 0 and 4. Using this table, add a if __name__ == "__main__": block to test your function. - -Test each pair of inputs between 0 and 4 and assert that the result produced by your function is the result expected by the wikipedia table. - -When your module is run from the command line, these tests should be executed. If they all pass, print “All Tests Pass” as the result. - -Add your new module to your git clone and commit frequently while working on your implementation. Include good commit messages that explain concisely both what you are doing and why. - -When you are finished, push your changes to your fork of the class repository in GitHub. Then make a pull request and submit your assignment in Canvas. - -''' \ No newline at end of file diff --git a/Students/Dave Fugelso/Session 2/series.py b/Students/Dave Fugelso/Session 2/series.py new file mode 100644 index 00000000..c9661d75 --- /dev/null +++ b/Students/Dave Fugelso/Session 2/series.py @@ -0,0 +1,98 @@ +''' +Dave Fugelso - UW Python Certification 10/09/2014 + +The Fibonacci Series is a numeric series starting with the integers 0 and 1. In this series, the next +integer is determined by summing the previous two. This gives us: + +0, 1, 1, 2, 3, 5, 8, 13, ... +Create a new module series.py in the session02 folder in your student folder. In it, add a function +called fibonacci. The function should have one parameter n. The function should return the nth value in the fibonacci series. + +Ensure that your function has a well-formed docstring + +The Lucas Numbers are a related series of integers that start with the values 2 and 1 rather than 0 and 1. +The resulting series looks like this: + + +2, 1, 3, 4, 7, 11, 18, 29, ... +In your series.py module, add a new function lucas that returns the nth value in the lucas numbers + +Ensure that your function has a well-formed docstring + +Both the fibonacci series and the lucas numbers are based on an identical formula. + +Add a third function called sum_series with one required parameter and two optional parameters. The required +parameter will determine which element in the series to print. The two optional parameters will have default values of 0 and 1 and will determine the first two values for the series to be produced. + +Calling this function with no optional parameters will produce numbers from the fibonacci series. Calling it +with the optional arguments 2 and 1 will produce values from the lucas numbers. Other values for the optional parameters will produce other series. + +Ensure that your function has a well-formed docstring + +Add an if __name__ == \"__main__\": block to the end of your series.py module. Use the block to write a series of assert +statements that demonstrate that your three functions work properly. + + +Use comments in this block to inform the observer what your tests do. + +Add your new module to your git clone and commit frequently while working on your implementation. Include good commit +messages that explain concisely both what you are doing and why. + +When you are finished, push your changes to your fork of the class repository in GitHub. Then make a pull request and submit your assignment in Canvas. +''' + +def fibonnacci (n): + ''' + Return the Nth value in the Fibonacci series. + Args: + n - Nth value + ''' + + # special cases at front of series + if n == 0: return 0 + if n == 1: return 1 + + #else let's calculate + a, b = 0, 1 + for seq in range (2, n): + a,b = b,a+b + return a+b + +def lucas (n): + ''' + Return the Nth value in the Lucas series. + Args: + n - Nth value + ''' + + # special cases at front of series + if n == 0: return 2 + if n == 1: return 1 + + #else let's calculate + a, b = 2, 1 + for seq in range (2, n): + a,b = b,a+b + return a+b + +if __name__ == "__main__": + ''' + perform unit tests for fibonacci and lucas funcitons. + ''' + + #Test the Fibinacci series: randomly selected 0, 1 5, 8 and 25 + assert fibonnacci (0)==0, 'Fibonnaci (0) is 0. Failed!' + assert fibonnacci (1)==1, 'Fibonnaci (1) is 1. Failed!' + assert fibonnacci (5)==5, 'Fibonnaci (5) is 5. Failed!' + assert fibonnacci (8)==21, 'Fibonnaci (8) is 21. Failed!' + assert fibonnacci (25)==75025, 'Fibonnaci (25) is 75025. Failed!' + + #Test lucas series: coose 0, 1, 6, 9, 26 + assert lucas(0)==2, 'Lucas(0) is 2. Failed!' + assert lucas(1)==1, 'Lucas(1) is 1. Failed!' + assert lucas(6)==18, 'Lucas(6) is 2. Failed!' + assert lucas(9)==76, 'Lucas(9) is 2. Failed!' + assert lucas(26)==271443, 'Lucas(26) is 2. Failed!' + + + \ No newline at end of file From 0e15c358d57b5615b2cb4467af29667c85f63405 Mon Sep 17 00:00:00 2001 From: Dave Fugelso Date: Fri, 10 Oct 2014 11:25:06 -0700 Subject: [PATCH 5/5] Added 'Passes 'All Tests Pass' to the bottom of ack. --- Students/Dave Fugelso/Session 2/ack.py | 4 +- Students/Dave Fugelso/Session 2/series.py | 56 ++++++++++++++++++++++- 2 files changed, 57 insertions(+), 3 deletions(-) diff --git a/Students/Dave Fugelso/Session 2/ack.py b/Students/Dave Fugelso/Session 2/ack.py index 576210e2..fe6ca666 100644 --- a/Students/Dave Fugelso/Session 2/ack.py +++ b/Students/Dave Fugelso/Session 2/ack.py @@ -74,4 +74,6 @@ def ack(m, n): for n in range(0,1): print '\t', print ack(m, n), - print '\t-\t-\t-\t-' \ No newline at end of file + print '\t-\t-\t-\t-' + + print 'All Tests Pass' \ No newline at end of file diff --git a/Students/Dave Fugelso/Session 2/series.py b/Students/Dave Fugelso/Session 2/series.py index c9661d75..8caeab06 100644 --- a/Students/Dave Fugelso/Session 2/series.py +++ b/Students/Dave Fugelso/Session 2/series.py @@ -74,7 +74,45 @@ def lucas (n): for seq in range (2, n): a,b = b,a+b return a+b - + +''' +Second solution. Just have lucas and fibonacci start a series function with differing start arguments. +''' + +def series (a, b, n): + ''' + Calculate the nth number in a series based on starting at a, b. + Args: + a - value for element 0 + b - value for element 1 + n - the series element wanted + ''' + + # special cases at front of series + if n == 0: return a + if n == 1: return b + + #else let's calculate + for seq in range (2, n): + a,b = b,a+b + return a+b + +def fibonacci_2(n): + ''' + Return the Nth value in the Fibonacci series. + Args: + n - Nth value + ''' + return series(0, 1, n) + +def lucas_2(n): + ''' + Return the Nth value in the Lucas series. + Args: + n - Nth value + ''' + return series(2, 1, n) + if __name__ == "__main__": ''' perform unit tests for fibonacci and lucas funcitons. @@ -87,12 +125,26 @@ def lucas (n): assert fibonnacci (8)==21, 'Fibonnaci (8) is 21. Failed!' assert fibonnacci (25)==75025, 'Fibonnaci (25) is 75025. Failed!' - #Test lucas series: coose 0, 1, 6, 9, 26 + #Test lucas series: choose 0, 1, 6, 9, 26 assert lucas(0)==2, 'Lucas(0) is 2. Failed!' assert lucas(1)==1, 'Lucas(1) is 1. Failed!' assert lucas(6)==18, 'Lucas(6) is 2. Failed!' assert lucas(9)==76, 'Lucas(9) is 2. Failed!' assert lucas(26)==271443, 'Lucas(26) is 2. Failed!' + #Test the Fibinacci series: randomly selected 0, 1 5, 8 and 25 + assert fibonnacci_2 (0)==0, 'Fibonnaci 2 (0) is 0. Failed!' + assert fibonnacci_2 (1)==1, 'Fibonnaci 2 (1) is 1. Failed!' + assert fibonnacci_2 (5)==5, 'Fibonnaci 2 (5) is 5. Failed!' + assert fibonnacci_2 (8)==21, 'Fibonnaci 2 (8) is 21. Failed!' + assert fibonnacci_2 (25)==75025, 'Fibonnaci 2 (25) is 75025. Failed!' + + # Test the second solutions + #Test lucas series: choose 0, 1, 6, 9, 26 + assert lucas_2(0)==2, 'Lucas 2 (0) is 2. Failed!' + assert lucas_2(1)==1, 'Lucas 2 (1) is 1. Failed!' + assert lucas_2(6)==18, 'Lucas 2 (6) is 2. Failed!' + assert lucas_2(9)==76, 'Lucas 2 (9) is 2. Failed!' + assert lucas_2(26)==271443, 'Lucas 2 (26) is 2. Failed!' \ No newline at end of file