Skip to content

Instantly share code, notes, and snippets.

@henriquebastos
Created June 6, 2017 03:16
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save henriquebastos/65066bb84d6ff211fd628647cb1bbad7 to your computer and use it in GitHub Desktop.
Save henriquebastos/65066bb84d6ff211fd628647cb1bbad7 to your computer and use it in GitHub Desktop.
Exercício muito doido sugerido pelo River
def decomp(num):
"""decomp(120) == (100, 20)"""
base = 10 ** (len(str(num))-1)
divisor, resto = divmod(num, base)
return divisor * base, resto
def radicais(resto):
while resto > 0:
base, resto = decomp(resto)
yield base
def extenso(num):
d = {
1: 'um', 2: 'dois', 3: 'três', 4: 'quatro', 5: 'cinco',
6: 'seis', 7: 'sete', 8: 'oito', 9: 'nove',
10: 'dez', 11: 'onze', 12: 'doze', 13: 'treze', 14: 'quatorze', 15: 'quinze',
16: 'dezesseis', 17: 'dezessete', 18: 'dezoito', 19: 'dezenove',
20: 'vinte', 30: 'trinta', 40: 'quarenta', 50: 'cinquenta',
60: 'sessenta', 70: 'setenta', 80: 'oitenta', 90: 'noventa',
100: 'cento'
}
if num == 100:
return 'cem'
elif num == 0:
return 'zero'
return ' e '.join((d[r] for r in radicais(num)))
if __name__ == '__main__':
assert decomp(120) == (100, 20)
assert decomp(121) == (100, 21)
assert list(radicais(120)) == [100, 20]
assert list(radicais(121)) == [100, 20, 1]
assert extenso(0) == 'zero'
assert extenso(1) == 'um'
assert extenso(2) == 'dois'
assert extenso(10) == 'dez'
assert extenso(20) == 'vinte'
assert extenso(21) == 'vinte e um'
assert extenso(29) == 'vinte e nove'
assert extenso(30) == 'trinta'
assert extenso(31) == 'trinta e um'
assert extenso(40) == 'quarenta'
assert extenso(41) == 'quarenta e um'
assert extenso(100) == 'cem'
assert extenso(101) == 'cento e um'
assert extenso(120) == 'cento e vinte'
assert extenso(121) == 'cento e vinte e um'
@davinirjr
Copy link

Minha versão de ontem, quando tava desesperado no Telegram:

def extenso(num):
    def decompor(num):
        centena, dezena = divmod(num, 100)
        dezena, unidade = divmod(dezena, 10)
        return centena, dezena, unidade

    centena, dezena, unidade = decompor(num)

    centenas = {
        0: '',
        1: 'cem' if dezena == 0 and unidade == 0 else 'cento',
        2: 'duzentos',
        3: 'trezentos',
        4: 'quatrocentos',
        5: 'quinhentos',
        6: 'seiscentos',
        7: 'setecentos',
        8: 'oitocentos',
        9: 'novecentos',
    }

    dezenas = {
        0: '',
        1: 'dez' if unidade == 0 else '',
        2: 'vinte',
        3: 'trinta',
        4: 'quarenta',
        5: 'cinquenta',
        6: 'sessenta',
        7: 'setenta',
        8: 'oitenta',
        9: 'noventa',
    }

    unidades = {
        0: 'zero' if centena == 0 and dezena == 0 else '',
        1: 'um' if dezena != 1 else 'onze',
        2: 'dois' if dezena != 1 else 'doze',
        3: 'três' if dezena != 1 else 'treze',
        4: 'quatro' if dezena != 1 else 'quatorze',
        5: 'cinco' if dezena != 1 else 'quinze',
        6: 'seis' if dezena != 1 else 'dezesseis',
        7: 'sete' if dezena != 1 else 'dezessete',
        8: 'oito' if dezena != 1 else 'dezoito',
        9: 'nove' if dezena != 1 else 'dezenove',
    }

    palavras = []
    palavras.append(centenas[centena])
    palavras.append(dezenas[dezena])
    palavras.append(unidades[unidade])

    return ' e '.join([palavra for palavra in palavras if palavra])

assert extenso(100) == 'cem'
assert extenso(121) == 'cento e vinte e um'
assert extenso(111) == 'cento e onze'
assert extenso(11) == 'onze'
assert extenso(33) == 'trinta e três'
assert extenso(7) == 'sete'

@joaopcanario
Copy link

joaopcanario commented Jun 14, 2017

Os casos de 11 a 19 e 111 a 119 estão falhando, ou seja, quando a dezena é um número entre 10 e 20. Eu implementei uma solução nesse gist para quem quiser conferir. =)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment