E foi grupal! :-))
Brincadeiras a parte, achei muito legal e produtivo. Então, coloco abaixo pra nosso registro o problema, o código a que chegamos e a avaliação. Estejam à vontade para contribuir:
Problema:
Amigo Secreto:
Entrar com uma lista de nomes e sair uma lista com pares.
Exemplos:
- Um dos nomes do par é aleatório.
- Um usuário não pode se “auto-sortear”.
- Uma pessoa não pode ser sorteada duas vezes.
Código: (vou mandar em anexo o arquivo)
- Entrada: Francival, Sebastião, Ézyo, Rogênio, Cléoson
- Saída: Sebastião tirou Francival; Francival tirou Rogênio; ...
#!/usr/bin/env python
# -*- encoding:utf-8 -*-
import unittest,random
#def ListarAmigos:
#TODO
def ListarAmigos(amigo1, amigo2):
return amigo1 == amigo2
def sorteio(amigos):
amigo=amigos[0]
amigosDisp=amigos[0:1]
num=random.randrange(len(
amigosDisp))
par = (amigo, amigosDisp[num])
print par
return par
class teste_amigos(unittest.TestCase):
def teste_igual(self):
self.assertEqual(ListarAmigos("Maria", "Joao"), False)
def teste_sorteio(self):
amigos=["dartanham","athos", "porthos", "aramis"]
listaPar = sorteio(amigos)
self.assertNotEqual(listaPar[0], listaPar[1])
# self.assertEqual(par[0], "dartanham")
# self.assertNotEqual(par[1], "dartanham")
unittest.main()
Avaliação:
Pontos positivos:
Pontos negativos:
- Entendimento da metodologia: foi bem proveitoso no sentido de conhecer a metodologia do Code Dojo na prática.
- Instalações: Sala, refrigeração, computador, a TV de 50 polegadas, tudo em cima e funcionando.
- Aprendizado da linguagem Python: Sempre se aprende algo de linguagem em situações assim.
- Foi divertido!!
- Problema mais simples: Por ser o nosso primeiro Code Dojo, poderia ter sido escolhido um problema mais simples. Bem, vou me defender: eu achei que este problema era simples! :-)
- Pouco conhecimento de Code Dojo e TDD: O fato de termos pouco conhecimento de como funciona um Code Dojo, e principalmente o desenvolvimento orientado a teste, nos fez perder algum tempo tentando entender como eles funcionavam.
- Intromissão do público no piloto e co-piloto: O pessoal que estava como público sem empolgava e dizia como o piloto deveria fazer isso ou aquilo. Normal, todos queriam ver o código pronto. Mas para os próximos, vamos tentar nos conter. :-)
Finalizando, gostaria de marcar o próximo Code Dojo para a próxima sexta-feira, 26/11/2010, no mesmo bat-horário e bat-local, ou seja, 15:00h. O problema deve ser com números decimais e romanos, mas não pesquisem antes senão não vai ter graça! Todo mundo de acordo?
Ah, e se alguém conseguir fazer o código deste problema, manda pra todo mundo!
Não consegui me conter e "resolvi resolver" (o_O) o problema do nosso Code Dojo. Envio o arquivo "amigos.py" em anexo com o código.O Sebastião, que manja de programação mas é modesto pra admitir :-), respondeu o seguinte:
A minha lógica (que eu peguei emprestado do Rogênio :-) ) foi a seguinte: eu pego a lista de entrada, "embaralho" ela, e depois crio os pares em seqüência, ou seja, o elemento[0] da lista "tira" o elemento[1], o elemento[1] "tira" o elemento[2] e assim por diante até o final da lista. Quando chega no final, o último elemento "tira" o primeiro elemento da lista fechando o ciclo. Assim, acho que resolvo o problema de ter número par ou impar de participantes, e também resolvo o problema de "sorteio recíproco".
Eu acrescentei um teste e eliminei outro: acrescentei um para ver se existem elementos repetidos lista, afinal de contas ninguém participa duas vezes do amigo secreto; e eliminei um (o teste " def teste_igual(self):" do código do e-mail anterior) que fiz de outra forma, ou seja, depois de formados os pares.
Pra facilitar os (muito aguardados) pitacos de vocês no código, colo-o abaixo:
#!/usr/bin/env pythondef nomeRepetido(lista):
# -*- encoding:utf-8 -*-
import unittest,random
"""
Verifica se a lista tem nomes repetidos.
"""
flag = True
tamLista = len(lista)
for i in range(tamLista - 1):
for j in range(1, tamLista):
if i < j:
if lista[i] == lista[j]:
flag = False
return flag
def sorteio(lista):
"""
Realiza o sorteio dos pares.
"""
random.shuffle(lista) # "Embaralha" a lista recebida
pares = {} # Cria um dicionário vazio onde serão armazenados os pares
i = 0
while i < len(lista):
amigo1 = lista[i]
if i == len(lista) - 1:
amigo2 = lista[0]
pares[amigo1] = amigo2
i = i + 1
continue
amigo2 = lista[i+1]
pares[amigo1] = amigo2
i = i + 1
return pares
def teste_repetido(self):
class teste_amigos(unittest.TestCase):
lista = ["D'Artagnan","Athos", "Porthos", "Aramis"]
self.assertEqual(nomeRepetido(
lista), True)
def teste_sorteio(self):
lista = ["D'Artagnan","Athos", "Porthos", "Aramis"]
listaPar = sorteio(lista)
for par in listaPar:
self.assertNotEqual(par, listaPar[par])
unittest.main()
Muito bom o código, gostei da função shuffle, eu não conhecia. E os testes ficaram bem legais.
Estou enviando uma outra forma de implementar as funções: http://pastebin.com/yjpVhCmu
Continua no próximo post...


0 comentários:
Postar um comentário