Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

proposed solution - no tests (04) #1

Open
jsbueno opened this issue Dec 24, 2010 · 4 comments
Open

proposed solution - no tests (04) #1

jsbueno opened this issue Dec 24, 2010 · 4 comments
Labels

Comments

@jsbueno
Copy link

jsbueno commented Dec 24, 2010

Eu sei que não é a idéia do Dojo -- mas quando você fica sozinho emc asa, é igual palavra cruzada.

Anexo, minha implementação "0" aqui -

@jsbueno
Copy link
Author

jsbueno commented Dec 24, 2010

# -*- coding: utf-8 -*-
import random

"""Problema: Sorteio de amigo secreto.
Descrição:
  Entrada: uma lista de strings, onde cada string contém o nome e sobrenome de um participante
  Saída: o resultado do sorteio de amigo secreto.
  Regras: 1. Uma pessoa não pode presentear a si própria
          2. Duas pessoas da mesma família não podem se presentear
          3. Duas pessoas com o mesmo sobrenome são consideradas como pertencentes à mesma família
          4. Não é permitido fechar o ciclo de presenteados sem que todos já tenham recebido presentes. Ou seja, no caso mínimo de três pessoas (A, B e C), caso A presenteie B, B só poderá presentear C.
Data: 23/12/2010
"""

entrada = ["Joao Bueno", "Tiago Bueno", "Davi Bueno", "Andreia Cezar", "Caio Cezar", "Wilma Cezar", "Telma Oliveira", "Daniel Oliveira"]

class Amigo(object):
    def __init__(self, name):
        self.prename = name.split()[0]
        self.family = name.split()[-1]
        self.previous = None
        self.next = None
    def __getitem__(self, index):
        if index == 0:
            return self
        elif index > 0:
            next = self.next
            index -= 1
        else:
            next = self.previous
            index += 1
        if next is None:
            raise IndexError("End of List")
        return self.next.__getitem__(index)

    def __repr__(self):
        return u"<%s %s>" % (self.prename, self.family)

    __hash__ = __repr__

    def __iter__(self):
        next = self
        start = True
        while start or  (next is not None and next != self):
            start = False
            yield next
            next = next.next
    def __len__(self):
        next = self.next
        count = 1
        while next is not None and next != self:
            count += 1
            next = next.next
        return count

    def connect(self, other):
        #avoid recursion
        last = self
        while last.next is not None:
            last = last.next
        if last is other:
            return False
        if last.family == other.family:
            return False
        last.next = other
        other.previous = last
        return True


def sorteia(input_list):
    input = [Amigo(nome) for nome in input_list]
    output = input.pop(random.randrange(len(input)))
    while input:
        index = random.randrange(len(input))
        friend = input[index]
        if output.connect(friend):
            input.pop(index)
    friend.next = output
    output.previous = friend
    return output

print list(sorteia(entrada))

@jsbueno
Copy link
Author

jsbueno commented Dec 24, 2010

Como vocês podem ver, sobraramuns esqueletinhos -- não uso o "hash " nem o "previous" -- mas o Amigo acabou ficnado um tipo de objeto interessante. COm um pé em sequências, um pé em elementos de sequência -- o tipo de maluquice que eu gosto.

@rodolphoeck
Copy link
Member

Haha boa JS! Depois vou brincar um pouco com seu código.

Eu também fico com a mão coçando para chegar em casa e re-trabalhar no problema. Acho que seria legal se cada interessado fizesse um "branch" do repositório e desse submit da sua solução trabalhada em casa.

O foco do Dojo continua o mesmo: treinar as técnicas e os métodos, e não no problema em si. Por isso, o branch "master" manteria o código desenvolvido durante o encontro.
Após o Dojo, os interessados discutiriam sobre seus branches e soluções na lista do GruPy, o que acha?

@avelino
Copy link

avelino commented Dec 24, 2010

Parabens JS, value pela initiative. Curtis a ideia de responder o Dojo no Issues ao invest de faz fork, pelo menOs FICA centralisado para o pessoal.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

3 participants