Hello Galaxy! Mais um exercício resolvido da categoria Ad-Hoc no Beecrowd. A solução desse exercício é bem simples, bora conferir?
Plataforma: Beecrowd (antiga URI)
Atualmente, no ano de 2114, o conhecimento de que não estamos sozinhos no universo não é novidade, porém um século atrás isto ainda era um mistério. Diversas civilizações na Via Láctea já emitiram algum tipo de sinal provando sua existência, e outras até estabeleceram um contato aberto com a Terra em busca de informações sobre a tal Árvore Hexagonária (afinal, estamos em 2114).
Rafael tem muito interesse pelo assunto, e em um trabalho para a escola se encarregou de descobrir qual foi a civilização mais antiga que enviou um Hello Galaxy para toda a galáxia. Hello Galaxy nada mais é que o primeiro dos passos do Protocolo de Iniciação na Sociedade Via Láctea, PISVL, garantindo que a nova civilização possa entrar em contato com as demais caso necessário.
A mensagem Hello Galaxy traz consigo duas informações básicas: o texto “Hello Galaxy”, que faz parte da tradição, e o nome do planeta da civilização que enviou a mensagem. O CMSVL, Centro de Monitoramento da Sociedade Via Láctea, instalado, por algum motivo, na Terra, recebe tais mensagens, armazenando em um registro o ano em que foi recebida a mensagem e a quantidade de anos que tal mensagem levou para chegar até ali.
A tarefa de Rafael é simples: descobrir quem foi a primeira civilização a enviar a mensagem Hello Galaxy.
Linguagens: C, C++ e Haskell
Solução:
Basta remover o tempo do ano de chegada e verificar qual das entradas resulta em menor valor.
Código em C++:
Coloquei uma variável menor com um número bem grande, de forma que comparada com qualquer valor, na primeira comparação ela vai obter o primeiro valor informado pelo usuário (ano de chegada menos o tempo). Assim, basta fazer o mesmo procedimento de remover o tempo do ano de chegada a cada linha informada e comparar com o valor que está na variável menor. Sempre que essa variável for atualizada, o nome do planeta também precisa ser, pois a resposta será o nome do planeta.
#include <iostream>
#include <string>
using namespace std;
int main() {
int n;
while (cin >> n) {
int menor = 99999;
int anoChegada;
int tempo;
int resultado;
string planeta;
string resposta;
if (!n)
break;
for (int i = 0; i < n; i++) {
cin >> planeta >> anoChegada >> tempo;
resultado = anoChegada - tempo;
if (resultado < menor) {
menor = resultado;
resposta = planeta;
}
}
cout << resposta << endl;
}
return 0;
}
Código em C:
Aqui a mesma lógica foi aplicada.
#include <stdio.h>
#include <string.h>
int main() {
int n;
int i;
int anoChegada;
int tempo;
int resultado;
char planeta[55];
char resposta[55];
int menor;
while (scanf("%d", &n) != EOF) {
menor = 99999;
if (!n)
break;
for (i = 0; i < n; i++) {
scanf("%s %d %d", planeta, &anoChegada, &tempo);
resultado = anoChegada - tempo;
if (resultado < menor) {
menor = resultado;
strcpy(resposta, planeta);
}
}
printf("%s\n", resposta);
}
return 0;
}
Código em Haskell:
main :: IO ()
main = do
n <- readLn
if n == 0
then return ()
else do
obtemResposta n 99999 ""
main
obtemResposta :: Int -> Int -> [Char] -> IO ()
obtemResposta 0 _ p = putStrLn p
obtemResposta n menor p = do
linha <- getLine
let [planeta, anoChegada, tempo] = words linha
let resultado = read anoChegada - (read tempo) :: Int
if resultado < menor
then obtemResposta (n-1) resultado planeta
else obtemResposta (n-1) menor p
Chave PIX (chave aleatória) para doações: 6d8bc7a8-5d74-493a-ab7a-3515baf35956
Ajude o blog mais uma vez!
Nenhum comentário:
Postar um comentário