Skip to content

Instantly share code, notes, and snippets.

@tarsisazevedo
Created May 19, 2011 01:53
Show Gist options
  • Select an option

  • Save tarsisazevedo/980011 to your computer and use it in GitHub Desktop.

Select an option

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
@rennerocha
Copy link
Copy Markdown

Como você definiu o teste da linha 9?

@tarsisazevedo
Copy link
Copy Markdown
Author

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

@rennerocha
Copy link
Copy Markdown

É... 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...

@rennerocha
Copy link
Copy Markdown

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)))])

@tarsisazevedo
Copy link
Copy Markdown
Author

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!

@tarsisazevedo
Copy link
Copy Markdown
Author

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

@rennerocha
Copy link
Copy Markdown

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 ;-)

@tarsisazevedo
Copy link
Copy Markdown
Author

tarsisazevedo commented May 19, 2011 via email

@douglascamata
Copy link
Copy Markdown

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!

@rennerocha
Copy link
Copy Markdown

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 :-)

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