Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Python - Detetives e Assassinos

Olá pessoas!

Estou com dificuldade para resolver esse exercício abaixo:

http://www.ic.unicamp.br/~mc102/labs/roteiro-lab06.html

O que eu entendi até agora, é que eu deveria construir um algoritmo para que, quando fosse fornecido os dados, esse algoritmo descobrisse quem é o assassino e quem é o detetive, além da quantidade de crimes que o detetive resolveu.

Se alguém puder dar um exemplo vai me ajudar muito.

Desde já muito obrigado a todos.

2 respostas
solução!

Oi, Rodrigo! Muito bacana esse exercício!

Antes de tudo, vamos entendê-lo. Em resumo, o exercício nos pede um programa que, dada algumas informações sobre n pessoas, imprima um relatório único (com o formato especificado pelo exercício) para cada pessoa indicando seu status/título/papel (se é vítima inocente, assassino, ou detetive) e informações como se está morta, quantas pessoas (e que tipo de pessoas) matou (se foi assassino(a)) e quantos casos resolveu (se foi detetive).

Como entrada, recebemos um número inteiro indicando a quantidade de casos que há e, para cada caso, uma linha com três nomes, sendo eles, respectivamente, o assassino do caso, a vítima do caso e o detetive que solucionou o caso.

A ideia pode parecer um pouco confusa, mas é bem simples de entender com um exemplo plano - quando temos um caso só. Por exemplo:

Entrada:

Temos um caso apenas, e três nomes nesse caso

1
Francisco Gilberto Karen

Francisco é um assassino e matou uma só pessoa, que era inocente (Gilberto). Gilberto era uma vítima inocente. Karen era a detetive que solucionou o caso. Assim, temos o seguinte resultado:

Saída:

------------------------------------------------------------
Francisco: assassino(a).
  Matou 1 inocente(s).
------------------------------------------------------------
Gilberto (in memoriam): vítima inocente.
------------------------------------------------------------
Karen: detetive.
  Resolveu 1 caso(s).
------------------------------------------------------------

Até aí tudo bem! O problema maior começa quando temos mais casos, porque podemos ter um assassino em um caso que é também uma vítima em outro! Nesse caso, ele deve ser identificado como assassino, mas sua morte deve ser indicada também com o complemento (in memoriam).

Também podemos ter uma pessoa que é detetive em um caso, assassina em outro e ainda morre em um terceiro! Nesse caso, essa pessoa deve ser identificada como detetive, mas sua morte e seus assassinatos devem ser identificados.

Com isso em mente, tenho algumas dicas extras:

  • Tenha uma lista para todos os detetives de todos os casos e outra para todas as vítimas de todos os casos;
  • Use um dicionário para identificar o tipo de cada pessoa assassinada;
  • Use o tipo set para iterar por cada pessoa uma única vez

Vou mandar o link de uma solução que eu fiz no GitHub, mas acho legal que você tente resolver mais um pouco (pensando nas dicas que o próprio exercício passa e nas que passei nesse post) antes de vê-la :D!

Minha solução: GitHub

Algumas observações sobre essa solução:

O bloco de código do último loop for poderia ficar dentro do bloco do for anterior, o que pouparia escrita, processamento (apesar de que processamento não é uma preocupação, considerando o limite de 100 casos) e talvez até um dicionário hahahah. Deixei separado porque achei que talvez ficasse mais simples de entender cada parte (espero que fique!). Tentei deixar o mais claro possível, mas tenho consciência de que nem sempre fica :( (cabe aqui um espaço para qualquer um dar sugestões para melhorar o código/sugerir um outro código! :D), então qualquer dúvida que se mantiver, pode falar!

Abraços e bons estudos!

Yan Orestes, sensacional, nem sei como agradecer!

Sua explicação foi fantástica e abriu muito a minha mente. Muito obrigado por ter dedicado seu precioso tempo para me ajudar nesse exercício, eu já tinha gastado muitas horas tentando resolver, mas só conseguia chegar em um resultado razoável quando tinha apenas uma linha de entrada de dados. Quando eu imputava duas ou mais linhas com três nomes cada linha, não conseguia o resultado esperado. Mas com a sua dica eu consegui chegar. Muito obrigado mesmo!