def extendKey(key, msg):
  """Extend the keyword so it is at least as long as the message
  
  Parameters:
    key: a string object representing the key
    msg: a string object representing the message

  Return value:
    extendedKey, a string object

  Preconditions: No additional.
  Postconditions: len(extendedKey) >= len(msg)
  """
  extendedKey = key * (1 + (len(msg) // len(key)))
  assert len(extendedKey) >= len(msg)
  return extendedKey

def letterToNumber(letter):
  """Transform a letter into a number 0-25
  Parameter: letter, a character
  Return value: number, an integer
  Precondition: 'a' <= letter <= 'z'
  Postcondition: 0 <= number <= 25
  """
  assert 'a' <= letter <= 'z'
  number = ord(letter) - ord('a')
  assert 0 <= number <= 25
  return number

def addKeyToMsg(keyNumber, msgNumber):
  """Given numbers from the key and message, produce a number for 
  the encrypted message.
  Parameters:
    keyNumber, an integer
    msgNumber, an integer
  Return value: result, an integer
  Preconditions: 0 <= keyNumber <= 25, 0 <= msgNumber <= 25
  Postcondition: 0 <= result <= 25
  """
  assert 0 <= keyNumber <= 25
  assert 0 <= msgNumber <= 25
  return (keyNumber + msgNumber) % 26

def numberToLetter(number):
  """Transform a number back into a letter.
  Parameter: number, an integer
  Return value: letter, a character
  Precondition: 0 <= number <= 25
  Postcondition: 'a' <= letter <= 'z'
  """
  assert 0 <= number <= 25
  return chr(number + ord('a'))

if __name__=="__main__":
   msg = "helloyou"
   key = "dog"
   key = extendKey(key, msg)
   result = ''
   for i in range(len(msg)):
     msgNum = letterToNumber(msg[i])
     keyNum = letterToNumber(key[i])
     result += numberToLetter(addKeyToMsg(keyNum, msgNum))
   print(result)
