Basic Google Code School Python Exercises

I don’t know if this is of interest to anyone but here are my Google Code School solutions to the basic python exercises string1.py and string2.py (my code in red):

string1.py
 #!/usr/bin/python -tt
 # Copyright 2010 Google Inc.
 # Licensed under the Apache License, Version 2.0
 # http://www.apache.org/licenses/LICENSE-2.0
# Google's Python Class
 # http://code.google.com/edu/languages/google-python-class/
# Basic string exercises
 # Fill in the code for the functions below. main() is already set up
 # to call the functions with a few different inputs,
 # printing 'OK' when each function is correct.
 # The starter code for each function includes a 'return'
 # which is just a placeholder for your code.
 # It's ok if you do not complete all the functions, and there
 # are some additional functions to try in string2.py.
 # A. donuts
 # Given an int count of a number of donuts, return a string
 # of the form 'Number of donuts: <count>', where <count> is the number
 # passed in. However, if the count is 10 or more, then use the word 'many'
 # instead of the actual count.
 # So donuts(5) returns 'Number of donuts: 5'
 # and donuts(23) returns 'Number of donuts: many'
 def donuts(count):
 if count <= 9:
 print 'Number of dounuts: %s' % count
 elif count >= 10:
 print 'Number of donuts: many'
 else:
 print 'That is not a valid integer.'
 return
 # B. both_ends
 # Given a string s, return a string made of the first 2
 # and the last 2 chars of the original string,
 # so 'spring' yields 'spng'. However, if the string length
 # is less than 2, return instead the empty string.
 def both_ends(s):
 if len(s) >= 3:
 fl = s[:2]
 ll = s[-2:]
 print fl + ll
 else:
 print ''
 return
 # C. fix_start
 # Given a string s, return a string
 # where all occurences of its first char have
 # been changed to '*', except do not change
 # the first char itself.
 # e.g. 'babble' yields 'ba**le'
 # Assume that the string is length 1 or more.
 # Hint: s.replace(stra, strb) returns a version of string s
 # where all instances of stra have been replaced by strb.
 def fix_start(s):
 fl = s[0]
 print s[0] + s[1:].replace(fl, '*')
 return
 # D. MixUp
 # Given strings a and b, return a single string with a and b separated
 # by a space '<a> <b>', except swap the first 2 chars of each string.
 # e.g.
 # 'mix', pod' -> 'pox mid'
 # 'dog', 'dinner' -> 'dig donner'
 # Assume a and b are length 2 or more.
 def mix_up(a, b):
 afc = a[:2] # Get the first two letters of A and assign to afc
 bfc = b[:2] # Get the first two letters of B and assign to bfc
 a = bfc + a[2:] # Append all but the first two characters of A to bfc
 # and assign it all to A
 b = afc + b[2:] # Append all but the first two characters of B to afc
 # and assign it all to B
 print '%s %s' % (a, b)
 return
 # Provided simple test() function used in main() to print
 # what each function returns vs. what it's supposed to return.
 def test(got, expected):
 if got == expected:
 prefix = ' OK '
 else:
 prefix = ' X '
 print '%s got: %s expected: %s' % (prefix, repr(got), repr(expected))
 # Provided main() calls the above functions with interesting inputs,
 # using test() to check if each result is correct or not.
 def main():
 print 'donuts'
 # Each line calls donuts, compares its result to the expected for that call.
 test(donuts(4), 'Number of donuts: 4')
 test(donuts(9), 'Number of donuts: 9')
 test(donuts(10), 'Number of donuts: many')
 test(donuts(99), 'Number of donuts: many')
print
 print 'both_ends'
 test(both_ends('spring'), 'spng')
 test(both_ends('Hello'), 'Helo')
 test(both_ends('a'), '')
 test(both_ends('xyz'), 'xyyz')
 print
 print 'fix_start'
 test(fix_start('babble'), 'ba**le')
 test(fix_start('aardvark'), 'a*rdv*rk')
 test(fix_start('google'), 'goo*le')
 test(fix_start('donut'), 'donut')
print
 print 'mix_up'
 test(mix_up('mix', 'pod'), 'pox mid')
 test(mix_up('dog', 'dinner'), 'dig donner')
 test(mix_up('gnash', 'sport'), 'spash gnort')
 test(mix_up('pezzy', 'firm'), 'fizzy perm')
 # Standard boilerplate to call the main() function.
 if __name__ == '__main__':
 main()

And this is the second one:

string2.py
# Copyright 2010 Google Inc.
# Licensed under the Apache License, Version 2.0
# http://www.apache.org/licenses/LICENSE-2.0
# Google's Python Class
# http://code.google.com/edu/languages/google-python-class/
# Additional basic string exercises
# D. verbing
# Given a string, if its length is at least 3,
# add 'ing' to its end.
# Unless it already ends in 'ing', in which case
# add 'ly' instead.
# If the string length is less than 3, leave it unchanged.
# Return the resulting string.
def verbing(s):
 if len(s) >= 3:
 if s[-3:] == 'ing':
 print s + 'ly'
 else:
 print s + 'ing'
 else:
 print s
 return
# E. not_bad
# Given a string, find the first appearance of the
# substring 'not' and 'bad'. If the 'bad' follows
# the 'not', replace the whole 'not'...'bad' substring
# with 'good'.
# Return the resulting string.
# So 'This dinner is not that bad!' yields:
# This dinner is good!
def not_bad(s):
 wnot = s.find('not') # Find the index of not
 wbad = s.find('bad') # Find the index of bad
 if wnot < wbad: # if the index of not is lower 
 # than the index of bad...
 wbad += 3 # Add 3 to the index of bad
 print s.replace(s[wnot:wbad], 'good') # and replace everything between
 # wnot and wbad with 'good'
 else:
 print s # else print the string.
 return
# F. front_back
# Consider dividing a string into two halves.
# If the length is even, the front and back halves are the same length.
# If the length is odd, we'll say that the extra char goes in the front half.
# e.g. 'abcde', the front half is 'abc', the back half 'de'.
# Given 2 strings, a and b, return a string of the form
# a-front + b-front + a-back + b-back
def front_back(a, b):
 fa = ''
 fb = ''
 ba = ''
 bb = ''
 la = len(a)
 lb = len(b)
 if la % 2 == 0:
 eveninta = la / 2
 fa = a[:eveninta]
 ba = a[-eveninta:]
 else: 
 oddintba = la / 2
 oddintfa = oddintba+ 1
 fa = a[:oddintfa]
 ba = a[-oddintba:] if lb % 2 == 0:
 evenintb = lb / 2
 fb = b[:evenintb]
 bb = b[-evenintb:]
 else: 
 oddintbb = lb / 2
 print 'this ' + str(oddintbb)
 oddintfb = oddintbb + 1
 fb = b[:oddintfb]
 bb = b[-oddintbb:]
 print fa + fb + ba + bb
 return
# Simple provided test() function used in main() to print
# what each function returns vs. what it's supposed to return.
def test(got, expected):
 if got == expected:
 prefix = ' OK '
 else:
 prefix = ' X '
 print '%s got: %s expected: %s' % (prefix, repr(got), repr(expected))

# main() calls the above functions with interesting inputs,
# using the above test() to check if the result is correct or not.
def main():
 print 'verbing'
 test(verbing('hail'), 'hailing')
 test(verbing('swiming'), 'swimingly')
 test(verbing('do'), 'do')
print
 print 'not_bad'
 test(not_bad('This movie is not so bad'), 'This movie is good')
 test(not_bad('This dinner is not that bad!'), 'This dinner is good!')
 test(not_bad('This tea is not hot'), 'This tea is not hot')
 test(not_bad("It's bad yet not"), "It's bad yet not")
print
 print 'front_back'
 test(front_back('abcd', 'xy'), 'abxcdy')
 test(front_back('abcde', 'xyz'), 'abcxydez')
 test(front_back('Kitten', 'Donut'), 'KitDontenut')
if __name__ == '__main__':
 main()

So there are my solutions.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s