#!/usr/bin/python2.4 -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/

# 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':
            s = s + 'ing'
        else:
            s = s + 'ly'
    return s


# 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!

import re

def not_bad(s):
    notIdx = s.find('not')
    if notIdx != -1:
        badIdx = s.find('bad')
        if badIdx > notIdx:
            s = re.sub(r'not(.*)bad', 'good', s)
    return s

def other_not_bad(s):
  # +++your code here+++
  notLoc = s.find('not')
  badLoc = s.find('bad')

  if badLoc > notLoc:
    modified_s = s[:notLoc] + 'good' + s[badLoc+3:]
    return modified_s

  return s


# 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 cutByHalfWithParity(s):
    sLen = len(s)
    sHalf = sLen / 2
    
    sFront = ''
    sBack = ''
    
    if sLen %2 != 0:
        addition = 0
        if sLen > 2:
            addition += 1
        sFront = s[:sHalf + addition]
        sBack = s[sHalf + addition:]
    else:
        sFront = s[:sHalf]
        sBack = s[sHalf:]
    return (sFront, sBack)

def new_front_back(a, b):
    aTuple = cutByHalfWithParity(a)
    bTuple = cutByHalfWithParity(b)
    return aTuple[0] + bTuple[0] + aTuple[1] + bTuple[1]
    

def front_back(a, b):
    aLen = len(a)
    bLen = len(b)
    aHalf = aLen / 2
    bHalf = bLen / 2
    
    aFront = ''
    aBack = ''
    bFront = ''
    bBack = ''
    
    if aLen %2 != 0:
        addition = 0
        if aLen > 2:
            addition += 1
        aFront = a[:aHalf + addition]
        aBack = a[aHalf + addition:]
    else:
        aFront = a[:aHalf]
        aBack = a[aHalf:]
        
    if bLen %2 != 0:
        addition = 0
        if bLen > 2:
            addition += 1
        bFront = b[:bHalf + addition]
        bBack = b[bHalf + addition:]
    else:
        bFront = b[:bHalf]
        bBack = b[bHalf:]
    
    return aFront + bFront + aBack + bBack
    

# 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')
  test(new_front_back('abcd', 'xy'), 'abxcdy')
  test(new_front_back('abcde', 'xyz'), 'abcxydez')
  test(new_front_back('Kitten', 'Donut'), 'KitDontenut')
#
if __name__ == '__main__':
  main()
