Desafio Intermediário - Animal - sem usar Ifs - Resolvendo de duas formas distintas: Estruturada e OO
- #Estrutura de dados
- #Orientação a objetos, classes e métodos
- #Python
Eu não tinha interesse e muito menos intenção de escrever um artigo aqui na DIO.
Essa falta de interesse vinha justamente de não saber o que compartilhar com a comunidade.
Porém, como sou um Dev de linguagens fortemente tipadas e orientadas a objetos como Java, C# e C++... decidi aprender Python porque sempre tive interesse e aí surgiu aquela oportunidade - baseada em pressão - e estou aqui há um mês e me deparei com esse desafio, bem bacana por sinal, o desafio dos "Animais".
Se o sofrimento faz o poeta, a dificuldade faz um escritor de artigos.
Para quem não lembra de como é esse desafio, deixa eu recapitular:
"Neste problema, você deverá ler 3 palavras que definem o tipo de animal possível segundo o esquema abaixo, da esquerda para a direita. Em seguida conclua qual dos animais seguintes foi escolhido, através das três palavras fornecidas..."
Daí, surge aquela hierarquia muito louca de animais que dá vontade de você sair correndo:
E fiquei ainda mais desmotivado quando vi a "carcaça" da solução usando "ifs":
a = input()
b = input()
c = input()
if a == "invertebrado"
...
...
...
Olhei para aquela Árvore de hierarquia de animais e me deu um desânimo:
-- "Ah, não, véi... vou criar um calhamaço de ifs pra chegar no final... no way! Pelo amor"
Pow, desde 1996 nessa área... não vou me render aos Ifs, para resolver esse problema em questão, vou tentar criar algo menos complicado de lidar, ou seja, com menos linhas de código.
Lembrando de umas frases aqui, lembrei de uma de um professor que tive, ele dizia assim, me lembro como se fosse o Cid Moreira falando: "Se você estiver programando muitas linhas de código para resolver um problema, está programando errado". Quem não conhece o Cid Moreira... favor deixar pra lá.
De fato, essa frase deveria ser o Lema de nossa Bandeira Nacional, sem mais.
Vendo essa imagem assustadora, imaginei logo um objeto json, mas, sendo neófito em Python, pensei: "como vou montar um objeto json aqui???"
Aí me lembrei da aula sobre estruturas de dados da Formação Python Developer aqui da DIO: "Dicionário".
Eureka, diante disso, cheguei e montei a minha "árvore", usando dicionários com o Python:
arvore = {
"vertebrado": {
"ave": {"carnivoro": {"aguia": None}, "onivoro": {"pomba": None}},
"mamifero": {"onivoro": {"homem": None}, "herbivoro": {"vaca": None}},
},
"invertebrado": {
"inseto": {"hematofago": {"pulga": None}, "herbivoro": {"lagarta": None}},
"anelideo": {"hematofago": {"sanguessuga": None}, "onivoro": {"minhoca": None}},
},
}
Ahhhhhhhhhhhhhhhhhhhhhhhhh! Bem melhor! Imagina só quantos Ifs!!!
Agora, como vamos iterar esse negócio?
Parceirins... se liga nas gambiarras do pai, Go Horse total:
to_aqui = arvore
for no in entradas:
if no in to_aqui:
to_aqui = to_aqui[no]
else:
if to_aqui:
print(list(to_aqui.keys())[0])
Poxa, na moral! Aquelas entradas de 3 inputs em sequência me causaram certa preocupação, aí depois dessa gambiarra das trevas que fiz acima, decidi ficar mais corajoso e joguei os 3 inputs em uma linha só e o compilador que lute:
entradas = [input().lower() for _ in range(3)]
Diante disso, temos a nossa La Giocconda (Monalisa), sem o Jorge Vercilo gado, é claro:
arvore = {
"vertebrado": {
"ave": {"carnivoro": {"aguia": None}, "onivoro": {"pomba": None}},
"mamifero": {"onivoro": {"homem": None}, "herbivoro": {"vaca": None}},
},
"invertebrado": {
"inseto": {"hematofago": {"pulga": None}, "herbivoro": {"lagarta": None}},
"anelideo": {"hematofago": {"sanguessuga": None}, "onivoro": {"minhoca": None}},
},
}
entradas = [input().lower() for _ in range(3)]
to_aqui = arvore
for no in entradas:
if no in to_aqui:
to_aqui = to_aqui[no]
else:
if to_aqui:
print(list(to_aqui.keys())[0])
Salvei, pra ficar pra história lá no painel do desafio...
Mandei testar e ele aceitou! Enviei e só vi o foguetinho - que não dá ré - aparecendo: 60 XP pra conta! mas... não acabou!
Eu poderia ter ido para o próximo fazendo Moonwalker! Porém, se é um "desafio", bora se desafiar ainda mais!
Decidi então converter o Go Horse anterior em Orientação a Objetos pra ficar bonito pra minha dopamina!
Tem gente que pula de paraqueda, nóis sobe aplicação em produção em uma sexta-feira!
Tem gente que adora palavras cruzadas, nóis cria várias gambiarras que deveriam ser temporárias mas que seguram um Legadão da massa, só não mexa no meu comentário em uma sexta-feira de tarde!
Aqui é coragem!
Segue o código refatorado como OO:
class PlanetaAnimal:
def __init__(self, caracteristicas: list[str]) -> None:
self._caracteristicas = caracteristicas
self._arvore = {
"vertebrado": {
"ave": {"carnivoro": {"aguia": None}, "onivoro": {"pomba": None}},
"mamifero": {"onivoro": {"homem": None}, "herbivoro": {"vaca": None}},
},
"invertebrado": {
"inseto": {
"hematofago": {"pulga": None},
"herbivoro": {"lagarta": None},
},
"anelideo": {
"hematofago": {"sanguessuga": None},
"onivoro": {"minhoca": None},
},
},
}
def busca(self):
nivel = self._arvore
for no in self._caracteristicas:
nivel = nivel.get(no)
if isinstance(nivel, str):
return nivel
else:
return list(nivel.keys())[0]
class DesafioController:
def __init__(self):
pass
@staticmethod
def run():
entradas = [input().lower() for _ in range(3)]
animal = PlanetaAnimal(entradas)
print(animal.busca())
DesafioController.run()
Tenho mais de 26 anos de profissão, comecei aos 13 anos empreendendo: convertendo sistemas do Clipper para o Delphi 1.0/2.0 e depois pro FoxPro e de lá pra cá... aprendi muita coisa e desaprendi outras, mas nunca parei de estudar e estar sempre em sintonia com o mercado.
Hoje, com 42 anos de idade, tendo uma empresa desde os 13 anos, parece que não aprendi nada, com os meus certificados já posso construir uma cabana!
Cade degrau que eu subo, vejo que tenho mais 30 pra subir!
Estudo, informação e sabedoria são a tríade para o sucesso!
Dêem uma moral pro tio dando um upvote!
Qualquer coisa, dêem um alô!
Humildade sempre!