Seria possível representar digitalmente o problema das duas portas, uma saída correta, um segurança mentiroso e um segurança sincerão que só fala a verdade?
Se você curtir esse artigo, não esqueça de dar uns cliques nos anúncios para ver o que os anunciantes tem para te oferecer. Vou ficar muito contente.
Tem um teste que volta e meia aparece nos testes de RH, meio manjado, que é mais ou menos assim:
O teste:
Um candidato está em uma sala com duas duas portas. Se o candidato abrir a porta da direita, um monstro irá devorar o candidato. Se o candidato abrir a porta da esquerda, ela é a porta de saída e o candidato poderá ir embora, ileso.
Dentro dessa sala também há dois seguranças, sendo que um deles só fala a verdade e o outro só fala mentira.
O desafio:
Para conseguir sair da sala, o candidato só pode fazer uma pergunta para um dos seguranças a fim de descobrir qual é a porta correta e o candidato não sabe qual segurança fala a verdade e nem qual segurança só fala mentira.
A saída:
Aqui não é o RH, caso queira pensar um pouco, não continue lendo porque vou escrever a resposta no próximo parágrafo.
A saída correta é obtida mandando a seguinte pergunta para qualquer um dos dois seguranças:
Senhor segurança, qual é a porta que o seu colega de serviço irá me indicar como sendo a saída correta?
Uma vez que o segurança responda, basta o candidato fazer exatamente o contrário do que o lhe foi informado. Pense um pouco.
A lógica:
O segurança que só fala a verdade vai responder corretamente o que o segurança mentiroso responderia, a porta errada
O segurança que só fala mentira, vai responder o contrário do que o segurança sincero irá falar. Como o segurança sincero vai indicar a porta correta, o mentiroso irá responder que o segurança sincero irá indicar a porta errada.
Ambos seguranças sempre responderão que o colega irá indicar a porta errada.
Dito isso, após a resposta, basta o candidato fazer exatamente o contrário, para conseguir sair ileso.
Representando digitalmente esse problema:
Quando a gente apresenta esse tipo de problema, com entradas e saídas bem definidas, normalmente é possível representar esse tipo de problema em um sistema digital, com relativa facilidade e sem precisar pensar muito além de inserir os dados no sistema.
Uma tabela verdade é o que precisamos
Para equacionar esse problema, precisamos levantar uma tabela verdade que nada mais é que a representação de como os dados digitais devem se comportar. Nessa tabela devemos listar as entradas possíveis, e as saídas requeridas, como no exemplo abaixo da tabela 1:
Explicando a tabela e escovando bits:
Conforme indicado na linha 1, quando não há perguntas sendo feitas para o segurança mentiroso ou para o segurança sincero, ambas as colunas “Pergunta para mentiroso” e “Pergunta para sincero” tem nível lógico “0”. Obviamente o indicador de “Aguardando pergunta” assume nível lógico “1” e demais colunas são ignoradas.
Conforme indicado na linha 2, quando é feita a pergunta para o segurança sincero, a coluna “Pergunta para sincero” assume nível lógico “1”, “Aguardando pergunta” vai para nível lógico “0” e a coluna “Resposta do sincero” indica qual seria a resposta que o segurança mentiroso irá falar. O segurança sincero está dizendo aqui que o segurança mentiroso irá indicar a porta da direita, pois temos o nível lógico “1”, que é a porta errada. Basta inverter essa informação e se obtém o valor da “Porta correta”, que é a porta da esquerda, correspondente ao nível lógico “0”.
Conforme indicado na linha 3, quando é feita a pergunta para o segurança mentiroso, a coluna “Pergunta para mentiroso” tem nível lógico “1”, “Aguardando pergunta” vai para nível lógico “0” e a coluna “Resposta do mentiroso” indica qual seria a resposta que o segurança sincero iria falar. Só que aqui, quem está respondendo a pergunta é mentiroso. Enquanto o sincero está indicando a porta certa (vide tabela), o mentiroso inverte a resposta, indicando a porta da direita, que corresponde ao nível lógico “1”. Basta inverter essa informação e se obtém o valor da “Porta correta”, que é a porta da esquerda, correspondente ao nível lógico “0”.
Conforme indicado na linha 4, quando a pergunta é feita para os dois seguranças, ambas as colunas “Pergunta para mentiroso” e “Pergunta para sincero” tem nível lógico “1” e o indicador “Aguardando perguntas” deve ir ao nível lógico “1”, indicando que as demais colunas não tem um significado válido.
Da tabela para o circuito lógico:
Montada a tabela, basta abrir o software Logisim, ir no menu Projeto -> Analisar Circuito. Na tela que abrir, selecionar a aba “Entradas e Saídas”, digitar as entradas e sáidas da tabela, conforme figura 1 abaixo:
Em seguida a gente vai na aba “Tabela” e lá insere os dados de como o sistema deve funcionar, conforme indicado na figura 2 abaixo:
Feito isso, basta clicar no botão “Construir circuito”, o Logisim fará algumas perguntas e montara o circuito lógico digital equivalente, conforme indicado na figura 3, abaixo, na condição de repouso:
Na figura 4 abaixo, temos o circuito lógico simulando a pergunta para o segurança mentiroso. Note que a “RespostaDoMentiroso” é “1”, porta da direita, ao contrário do que o segurança sincero está informando. O candidato deve escolher o contrário da resposta do mentiroso, que é o sinal que está no indicador PortaCorreta (0).
Na figura 5 abaixo, temos o circuito lógico simulando a pergunta para o segurança sincero. Note que o sincero responde corretamente o que o mentiroso está falando. Como o sincero falou “1”, porta da direita, logo o candidato deve escolher a porta da esquerda que está indicado na saída “Portacorreta” (0).
Por último, na figura 6 abaixo temos o circuito lógico simulando a pergunta para ambos os seguranças. Nesse caso o sinal lógico “AguardandoPergunta” vai ao nível lógico “1”, indicando que as demais saídas são inconsistentes.
O software ainda permite a consulta das expressões geradas em diversas notações, bem como a visualização do mapa de Karnaugh para cada uma das saídas do programa.
Esse tipo de lógica, embora aqui esteja representada por blocos lógicos que podem ser implementados em circuitos digitais, pode muito bem ser exportada para a linguagem de programação, bastando implementar as expressões matemáticas no formato da linguagem de programação escolhida.
É uma ferramenta, que estamos nos esquecendo que existe.
O que está por traz desse programa, são as técnicas da álgebra de boole, muito popular na década de 70 e que vem sendo paulatinamente esquecida. Ela serve para nos auxiliar a simplificar os ifs e elses que eventualmente possamos enfrentar no dia a dia da programação e talvez valha a pena revisitarmos esse assunto.
Para saber mais:
TOCCI, Ronald J.; WIDMER, Neal S.; MOSS, Gregory L.. Sistemas Digitais: Princípios e aplicações. 11. ed. São Paulo: Pearson, 2015. 818 p. ISBN13: 978-85-7605-922-6.
NAGLE JUNIOR, H. Troy; CARROLL, E. D.; IRWIN, J. David. An Introduction to Computer Logic: computer application in electrical engineering series. Englewood Cliffs, New Jersey: Prentice Hall, 1975. 529 p.