Encontrando assento disponível com programação funcional

6 views
Skip to first unread message

Luciano de Souza

unread,
Aug 6, 2022, 7:04:29 PM8/6/22
to Python Brasil
Caros,

Comecei a estudar programação funcional com Python, então, queria uma
ajuda para resolver um problema utilizando esta abordagem.

Um sujeito vai ao cinema. É inteiramente antissocial. Não se sentará ao
lado de quem quer que seja. Ainda há assentos vagos na seguinte fileira:

seats = [0, 1, 0, 0, 0, 1, 0]

Dado que 1 é assento ocupado e 0 assento desocupado, temos apenas um
assento em que pode sentar, aquele de índice 3, pois está vazio, bem
como também seus adjacentes.

Também não se sentará em qualquer das extremidades porque não quer
incomodar-se com o movimento dos corredores.

Não é difícil imaginar um começo. Precisamos de uma função que retorne
“verdadeiro” caso os assentos à esquerda, no centro e à direita estejam
vazios.

is_confortable = lambda left, center, right: left == center == right == 0

Se fizesse “is_confortable(seats[2], seats[3], seats[4])“, teria “True”
como resposta porque seats[3] é o único assento que cumpre o requisito.

Devemos passar is_confortable para um map retornando uma lista em que
apenas se tenha True na terceira posição.

choices = [False, False, False, True, False, False, False]

Bastaria fazer “choices.index(True)” e obteria 3 como resposta, sendo
este o número de índice do assento que cumpre o requisito.

Uma primeira tentativa seria:

Choices = map(is_confortable, seats)

Não, não funcionará porque is_confortable requer três argumentos e
somente um foi passado.

O iterável “seats” corresponde ao segundo parâmetro da função, isto é,
os assentos que estão ao centro. Devo passar dois outros iteráveis.

Choices = map(is_confortable, lefts, seats, rights)

Como encontrar os iteráveis lefts e rights? Se usasse while ao invés de
map, teria a variável position e bastaria fazer position -1 para o
assento anterior e position + 1 para o posterior.

Mas tendo a premissa de que gostaria de resolver o problema com a
abordagem funcional, isto é, utilizando lambda, map, filter e reduce,
como poderia obter tais iteráveis?

E se o meu raciocínio não tiver sido o melhor para a abordagem
funcional, qual seria aquele que me levaria ao assento número 3?

Agradeço por qualquer ajuda e desejo a todos e a todas um super bom dia!


Luciano de Souza

Eric Chiesse

unread,
Aug 7, 2022, 1:15:30 AM8/7/22
to python...@googlegroups.com
Use filter em vez de map. E para a sua função is comfortable passe a posição que você quer testar e o array inteiro em si. Assim vc vai ter todo o contexto necessário para fazer os testes.

Vc ainda pode fazer com que is_comfortable seja uma closure que já contem o array nela e só recebe a posição para testar.

A ideia geral seria esta:

def comfortable_predicate(seats):
    def is_comfortable(index):
        # Toda a lógica para testar se o assento index dentro de seats

    return is_comfortable

is_comfortable = comfortable_predicate(seats)
comfortable_seats = list(filter(is_comfortable, seats))

Última dica: Acho realmente interessante dar uma olhada em Haskell para aprender programação funcional. 
Em Haskell não tem outro jeito de fazer as coisas e aos poucos vc começa a enxergar coisas que nunca pensou que fosse ver.

---
Eric Chiesse


--
--
------------------------------------
Grupo Python-Brasil
https://wiki.python.org.br/AntesDePerguntar

<*> Para visitar o site do grupo na web, acesse:
    http://groups.google.com/group/python-brasil

<*> Para sair deste grupo, envie um e-mail para:
    python-brasi...@googlegroups.com
---
Você está recebendo esta mensagem porque se inscreveu no grupo "Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasi...@googlegroups.com.
Para ver esta discussão na web, acesse https://groups.google.com/d/msgid/python-brasil/f0e47c75-9a22-e743-4042-a36826e94846%40gmail.com.
Reply all
Reply to author
Forward
0 new messages