Mr. K's CodingBat Problem-Answers

Exercise groups:
Looping Numbers
Looping over digits
Strings and Loops

Looping Numbers
sumFromZeroToN def sumFromZeroToN(n):
  if n < 0:
    return 0
  answer = 0
  for i in range(1,n+1):
    answer += i
  return answer

# or you can use a mathematical formula (but don't)
sumAtoB def sumAtoB(a,b):
  if a > b:
    return 0
  answer = 0
  for i in range(a,b+1):
    answer += i
  return answer
fiveSumFromZeroToN def fiveSumFromZeroToN(n):
  if n < 0:
    return 0
  answer = 0
  for i in range(5,n+1,5):
    answer += i
  return answer
specialSumInclusive def specialSumInclusive(n):
  answer = 0
  for q in range(1,n+1):
    if q%3 == 0 or q%5 == 0:
      answer += q
  return answer
specialSumExclusive def specialSumExclusive(n):
  answer = 0
  for i in range(n+1):
    if i%5 == 0 and i%7==0:
      answer += i
  return answer
sumOfFirstNSquares def sumOfFirstNSquares(n):
  answer = 0
  for i in range(n+1):
    answer += i*i
  return answer
sumSquaresBetween # Straightforward way:
def sumSquaresBetween(a,b):
  answer = 0
  for i in range(a,b+1):
    if isPerfectSquare(i):
      answer += i
  return answer

def isPerfectSquare(n):
  return int(n**.5) == n**.5

# -----------------------
# or a faster way:

def sumSquaresBetween(a,b):
  answer = 0
  i = int(a**.5)  # may be too small
  while True:
    sq = i*i
    if a <= sq <= b:
      answer += sq
    if sq > b:
      break
    i+=1
  return answer
sumOfPowers # Straightforward way:
def sumOfPowers(n):
  answer = 0
  for x in range(2,n+1):
    a = x
    # test if a is a power of 2
    while a > 1:
      a = a / 2.0
    if a == 1:
      answer += x
  return answers

# ------------------------
# or a faster way:
def sumOfPowers(n):
  answer = 0
  if n < 2:
    return 0
  exp = 1
  while True:
    power2 = 2 ** exp
    if power2 <= n:
      answer += power2
    else:
      break
    exp += 1
  return answer
Looping over digits
sumDigits def sumDigits(n):
  n = abs(n)
  answer = 0
  while n > 0:
    answer += n%10 #add in the ones digit
    n //= 10
  return answer

# ---------------------
# or, using the string representation of n

def sumDigits(n):
  n = abs(n)
  answer = 0
  for c in str(n):
    answer += int(c)
  return answer
countDigits def countDigits(n):
  c = abs(n)
  return len(str(c))
countOddDigits def countOddDigits(n):
  n = abs(n)
  answer = 0
  for c in str(n):
    if int(c)%2 == 1:
      answer += 1
  return answer
countPrimeDigits def countPrimeDigits(n):
  answer = 0
  s = str(abs(n))
  for c in s:
    if c in '2357':
      answer += 1
  return answer
Strings and Loops
countLetter def countLetter(string,letter):
  answer = 0
  for c in string:
    if c == letter:
      answer += 1
  return answer
findLetter def findLetter(original,letter):
  for i in range(len(original)):
    if original[i] == letter:
      return i
  return -1
findWord def findWord(original,word):
  q = len(word)
  for i in range(len(original)):
    if original[i:i+q] == word:
      return i
  return -1
countWord def countWord(original,word):
  if word not in original:
    return 0
  q = len(word)
  answer = 0
  for i in range(len(original)):
    if original[i:i+q] == word:
      answer += 1
  return answer
isVowel # re-use findLetter() from above

def isVowel(s):

  return len(s)==1 and findLetter('aeiouAEIOU',s) != -1
countVowels # re-use isVowel() from above

def countVowels(s):

  answer = 0
  for c in s:
    if isVowel(c):
      answer += 1
  return answer
noVowels # re-use isVowel() from above

def noVowels(s):

  answer = ''
  for c in s:
    if not isVowel(c):
      answer += c
  return answer
isConsonant # re-use isVowel() from above
def isConsonant(c):

  return len(c) == 1 and isAlpha(c) and not isVowel(c)

def isAlpha(c):
  return ('a' <= c <= 'z') or ('A' <= c <= 'Z')