Exercise 6

A palindrome is a word that is spelled the same backward and forward, like “noon” and “redivider”. Recursively, a word is a palindrome if the first and last letters are the same and the middle is a palindrome.

You can use the first, last, and middle helper functions defined in Think Python, or do the string slices inside your function directly. Be sure to think about your base cases.

Write a function called is_palindrome that takes a string argument and returns True if it is a palindrome and False otherwise. Remember that you can use the built-in function len to check the length of a string.

Write some unit tests for your function (optionally using doctest) to show that it works as intended.

# Helper functions

def first(word):
    return word[0]
def last(word):
    return word[-1]
def middle(word):
    return word[1:-1]
# Palindrome Solution 1

def is_palindrome(word):
    if first(word)==last(word):
        if len(word)<=2:
            return True
        else:
            return is_palindrome (middle(word))
    else:
        return False
# Palindrome Solution 2

def is_palindrome(x):
    if len(x) >= 3:
        if x[0] == x[-1]:
            return is_palindrome(x[1:-1])
        else:
            return False
    elif x[0] == x[-1]:
        return True
    else:
        return False
# Palindrome Solution 3

def is_palindrome(x):
    """
>>> is_palindrome("cart")
False
>>> is_palindrome("bobob")
True
>>> is_palindrome("kayak")
True
    """
    for i in range(len(x)):
        if x == x[::-1]:
            return True
    return False
# Palindrome Solution 4

def is_pallindrome(string):
    string = string.lower()
    if len(string)>1:
        if string[0] == string[len(string)-1]:
            string = string[1:len(string)-1]
            return True
        if string[0] != string[len(string)-1]:
            return False
    return is_pallindrome(string)
# Palindrome Solution 5

def is_palindrome(s):
    """
    >>> is_palindrome("Go hang a salami Im a lasagna hog") # even palindrome
    True
    >>> is_palindrome("Ah Satan sees Natasha")
    True
    >>> is_palindrome("No melons no lemon") # odd palindrome
    True
    >>> is_palindrome("Now I see bees I lost") # not a palindrome
    False
    """
    s = s.strip().lower()
    if len(s) <= 1:
        return True
    if s[0] == s[len(s)-1]:
        return is_palindrome(s[1::len(s)-1])
    else:
        return False
# Palindrome Solution 6

def is_palindrome(word):
    flag = True
    if len(word) == 1:
        return True
    if len(word) < 3: #when len == 2
        return first(word) == last(word)
    return (first(word) == last(word) and is_palindrome(middle(word)))
# Palindrome Solution 7

def is_palindrome(WoRd):
    """ Returns True/False for if input is a palindrome.
    >>> is_palindrome('word')
    False
    >>> is_palindrome('racecar')
    True
    >>> is_palindrome('Racecar')
    True
    >>> is_palindrome('redivider')
    True
    >>> is_palindrome('l')
    True
    """
    word = WoRd.lower()
    if len(word) < 3:
        if first(word) == last(word):
            return True
        else:
            return False
    if len(word) >= 3:
        if first(word) == last(word):
            return is_palindrome(middle(word))
        else:
            return False
# Palindrome Solution 8

def palindrome(word):
    """
    Recursively looks through a string and determines if it is a palindrome.

    >>> palindrome('racecar')
    True

    >>> palindrome('abba')
    True

    >>> palindrome('palindrome')
    False

    """
    if len(word) < 2:
        return True
    elif word[0] == word[-1]:
        return palindrome(word[1:-1])
    return False
# Palindrome Solution 9

def is_palindrome(word):
    '''
>>> is_palindrome("redivider")
True
>>> is_palindrome("bob")
True
>>> is_palindrome("ttta")
False
>>> is_palindrome("aaaaaaa")
True

'''
    mid = middle(word)
    if first(word) == last(word):
        if mid[:] == mid[::-1]:
            return True
    return False
# Palindrome Solution 10

def is_palindrome(word):
    word_list = list(word)
    length = len(word_list)
    if length <= 2:
        return False
    elif length > 2:
        for letters in word_list:
            if word_list[0] == word_list[-1]:
                del(word_list[0])
                del(word_list[-1])
    if len(word_list)== 0:
        return True
    else:
        return False
# Palindrome Solution 11

def is_palindrome(word):
    forward = word
    backward = word[::-1]
    if forward == backward:
        return True
    return False
# Palindrome Solution 12

def palindrome(a):
    """
    Returns Boolean assignment True or False to determine if word is palindrome.

    >>> palindrome('DogGOD')
    True
    >>> palindrome('RACE car')
    True
    >>> palindrome('allen')
    False
    >>> palindrome('PAul ruvOLo')
    False
    >>> palindrome('stanley YELnats')
    True
    """
    a = a.lower() #converts all characters in a to lowercase
    a = a.rstrip() #strips all spaces from a
    if len(a) <= 1:
        return True
    elif first(a) != last(a):
        return False
    return palindrome(middle(a))

#what do you know, it works
#fun with palindromes
palindrome('Borrow or Rob') #a moral dilemma
palindrome('Murder for a jar of red rum') #creepiest childhood game
palindrome('Yo Banana Boy') #it's Gabe
palindrome('satan oscillate my metallic sonatas') #that's unfortunate
palindrome('SolO GIGOLOS') #I am having altogether to much fun with this
palindrome('dammit Im mad')#lol not really but I bet whoever's reading this is
True

Exercise 6.4

A number $a$ is a power of $b$ if it is divisible by $b$ and $a/b$ is a power of $b$. Write a function called is_power that takes parameters a and b and returns True if a is a power of b. Note: you will have to think about the base case.

# is_power solution 1

def is_power(a, b):
     if a < b:
        return False
     if a == b:
        return True
     else:
        return is_power(a / b, b)
# is_power solution 2

def is_power(a,b):
    if a == b:
        return True
    elif a > b:
        if a%b == 0:
            return is_power(a//b,b)
        else:
            return False
    else:
        return False
# is_power solution 3

def is_power(a,b):
    if a>b:
        if a%b == 0:
            return True
        if a%b != 0:
            return False
    return is_power(a/b,b)
# is_power solution 4

def is_power(a,b):
    if a is b:
        return True
    elif a%b == 0:
        return is_power(a//b,b)
    else:
        return False
# is_power solution 5

def is_power(a,b):
    """
    >>> is_power(4,2)
    True
    >>> is_power(3,2)
    False
    """
    if a == 1:
        return True
    return a%b == 0 and is_power(a/b, b)
# is_power solution 6

def is_power(a,b):
    """returns whether a is a power of b.
    doctests test for a is zeroeth power, a is first power, a is nth power, and a is not power.
    >>> is_power(1, 70)
    True
    >>> is_power(5, 5)
    True
    >>> is_power(128, 2)
    True
    >>> is_power(132, 2)
    False
    """
    if a == 1:
        return True
    elif a % b == 0:
        return is_power(a//b,b)
    else:
        return False
# is_power solution 7

def is_power(a,b):
    """ Returns True/False for if a is a power of b.
    >>> is_power(3,2)
    True
    >>> is_power(1,5)
    True
    >>> is_power(6,6)
    True
    >>> is_power(2,0)
    False
    >>> is_power(6,1)
    False
    >>> is_power(6,3)
    False
    """
    if a == 0 or b == 0:
        return False
    elif b == 1:
        if a == 1:
            return True
        else:
            return False

    if a==1 or (a/b)==1:
        result = True
    elif a % b == 0 and a!=0:
        result = is_power((a//b),b)
    else:
        result = False

    return result
# is_power solution 8

def is_power(a, b):
    """
    Returns if A is a power of b.

    >>> power(10, 2)
    False

    >>> power(32, 2)
    True

    """
    if not (a % b == 0):
        return False
    if a//b == 1:
        return True
    else:
        return power(a//b, b)
# is_power solution 9

def is_power(a,b):
    if a == b:
        return True
    test1 = a%b
    a = a//b
    if test1 == 0 and is_power(a,b):
        return True
    else:
        return False
# is_power solution 10

def is_power(a, b):
    if a % b == 0:
        if (a//b) % b == 0:
            return True
    return False
# is_power solution 11

def is_power(a, b):
    if a%b != 0:
        return False
    else:
        return True
    c = a//b
    return is_power(c, b)
# is_power solution 12

def is_power(a,b):
    if a%b == 0:
        if a == b:
            return True
        a = a//b
        return is_power(a,b)
    else:
        return False