Luciano de Souza
unread,Aug 6, 2022, 7:04:29 PM8/6/22Sign in to reply to author
Sign in to forward
You do not have permission to delete messages in this group
Sign in to report message
Either email addresses are anonymous for this group or you need the view member email addresses permission to view the original message
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