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

# Exercícios extras

# G. verbing
# Dada uma string, caso seu comprimento seja pelo menos 3,
# adiciona 'ing' no final
# Caso a string já termine em 'ing', acrescentará 'ly'.
def verbing(s):
    if len(s) >= 3:
        if s[-3:] == 'ing':
            return s + 'ly'
        else:
            return s + 'ing'
    return s

# H. not_bad
# Dada uma string, procura a primeira ocorrência de 'not' e 'bad'
# Se 'bad' aparece depois de 'not' troca 'not' ... 'bad' por 'good'
# Assim 'This dinner is not that bad!' retorna 'This dinner is good!'
def not_bad(s):
    local_bad = s.find('bad')
    local_not = s.find('not')
    if local_bad > local_not:
        s = s[:local_not] + 'good' + s[local_bad + 3:]
        return s
    else:
        return s


# I. inicio_final
# Divida cada string em dois pedaços.
# Se a string tiver um número ímpar de caracteres
# o primeiro pedaço terá um caracter a mais,
# Exemplo: 'abcde', divide-se em 'abc' e 'de'.
# Dadas 2 strings, a e b, retorna a string
#  a-inicio + b-inicio + a-final + b-final
def inicio_final(a, b):
    a_inicio = ''
    b_inicio = ''
    a_final = ''
    b_final = ''
    if len(a) % 2 == 0:
        a_inicio = a[:(len(a) // 2)]
        a_final = a[(len(a) // 2):]
    else:
        a_inicio = a[:(len(a) + 1) // 2]
        a_final = a[(len(a) + 1) // 2:]

    if len(b) % 2 == 0:
        b_inicio = b[:(len(b) // 2)]
        b_final = b[(len(b) // 2):]
    else:
        b_inicio = b[:(len(b) + 1) // 2]
        b_final = b[(len(b) + 1) // 2:]


    return a_inicio + b_inicio + a_final + b_final


# J. zeros finais
# Verifique quantos zeros há no final de um número inteiro positivo
# Exemplo: 10010 tem 1 zero no fim e 908007000 possui três
def zf(n):
    n = str(n)
    contador = 0
    for x in range(-1, -len(n), -1):
        if '0' in n[x]:
            contador += 1
        else:
            return contador
    return contador


# K. conta 2
# Verifique quantas vezes o dígito 2 aparece entre 0 e n-1
# Exemplo: para n = 20 o dígito 2 aparece duas vezes entre 0 e 19
def conta2(n):
    contador = 0

    for x in range(0, n):
        strx = str(x)
        lenx = len(strx)
        for i in range(lenx):
            if '2' in strx[i]:
                contador += 1
    return contador


# L. inicio em potencia de 2
# Dado um número inteiro positivo n retorne a primeira potência de 2
# que tenha o início igual a n
# Exemplo: para n = 65 retornará 16 pois 2**16 = 65536
def inip2(n):
    n = str(n)
    for x in range(1, 1000):
        potencia = 2**x
        potencia = str(potencia)
        if n in potencia[:len(n)]:
            return x

    return


def test(obtido, esperado):
    if obtido == esperado:
        prefixo = ' Parabéns!'
    else:
        prefixo = ' Ainda não'
    print('%s obtido: %s esperado: %s' % (prefixo, repr(obtido), repr(esperado)))


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('inicio_final')
    test(inicio_final('abcd', 'xy'), 'abxcdy')
    test(inicio_final('abcde', 'xyz'), 'abcxydez')
    test(inicio_final('Kitten', 'Donut'), 'KitDontenut')

    print()
    print('zeros finais')
    test(zf(10100100010000), 4)
    test(zf(90000000000000000010), 1)

    print()
    print('conta 2')
    test(conta2(20), 2)
    test(conta2(999), 300)
    test(conta2(555), 216)

    print()
    print('inicio p2')
    test(inip2(7), 46)
    test(inip2(133), 316)
    test(inip2(1024), 10)


if __name__ == '__main__':
    main()