-
-
Save tarsisazevedo/980011 to your computer and use it in GitHub Desktop.
from unittest import TestCase | |
import math | |
class FatorialDeN(TestCase): | |
def test_soma_do_resultado_do_fatorial_de_10(self): | |
self.assertEquals(27, soma_do_fatorial_de_n(n=10)) | |
def test_soma_do_resultado_do_fatorial_de_100(self): | |
self.assertEquals(648, soma_do_fatorial_de_n(n=100)) | |
def soma_do_fatorial_de_n(n): | |
fatorial_n = math.factorial(n) | |
resultado = 0 | |
for numero in str(fatorial_n): | |
resultado += int(numero) | |
return resultado |
entao, primeiro eu validei com 10, pois eu tinha todos os dados no euler
depois que os testes passaram com 10, eu rodei com 100, e assumi que estava certo! xD
É... não foi um TDD de verdade :-) Na verdade vários problemas do Euler eu acho que não dá para fazer com TDD, pois o teste é a resposta esperada...
Ao invés de fazer a função 'fatorial_de_n', você pode usar o método math.factorial da biblioteca padrão :-) Fica mais bonito.
Minha solução em duas linhas:
import math
print sum([ int(x) for x in list(str(math.factorial(n)))])
Acho que nesse caso pode se dizer que foi tdd. porque primeiro defini a funçao e fiz funcionar com o caso que eu tinha, 10 no exemplo. Depois de definida a formula é só aplica-la aos demais casos e pronto! Matematica é linda!
Obrigado renne, atualizei pro math.factorial. Boa contribuiçao.
Só nao troquei pra list comprehension porque fica meio ilegivel e nesse caso nao precisa de performance :D
Ilegível???? Para mim uma list comprehension atualmente é mais legível que uma função de 5 linhas :-) Mas eu entendo o seu ponto de vista ;-)
Sugiro a seguinte função pra calcular o fatorial:
def fatorial(n):
return reduce(lambda x, y: x*y, range(1,n+1))
Acho que ela vai propiciar uma performance bem maneira. Se combinar com o list comprehension que o @rennerocha sugeriu então, ficará ótimo!
Douglas,
A biblioteca padrão já possui a função math.factorial. Com certeza a performance dela já foi otimizada, então não vejo válido usar uma função lambda neste caso. Isso sim eu acho que reduz a legibilidade :-)
Como você definiu o teste da linha 9?