Ir para conteúdo
Fórum Script Brasil
  • 0

Solução ao teste da Folha de São Paulo


marmion

Pergunta

O jornal Folha de São Paulo propôs um teste para seleção de programadores PHP:

Sabe-se que por trás de cada cometa há um OVNI. Esses OVNIs frequentemente buscam bons desenvolvedores aqui na Terra. Infelizmente só têm espaço para levar um grupo de devs por vez. Para a seleção, há um engenhoso esquema, da associação do nome do cometa ao nome do grupo, que possibilita a cada grupo saber se será levado ou não.
Os dois nomes, do grupo e do cometa, são convertidos em um número que representa o produto das letras do nome, onde "A" é 1 e "Z" é 26. Assim, o grupo "LARANJA" seria 12 * 1* 18 * 1 * 14 * 10 * 1 = 30240. Se o resto da divisão do número do grupo por 45 for igual ao resto da divisão do número do cometa por 45, então o grupo será levado.
Para os cometas e grupos abaixo, qual grupo NÃO será levado?
Cometa Grupo
Halley Amarelo
Encke Vermelho
Wolf Preto
Kushida Azul

Para se candidatar, você deve enviar a solução do problema .....

Exemplo: AMARELO.

Eis minha solução (não me candidatei):

<?php
$dados = array ();
$dados ["Halley"] = "Amarelo";
$dados ["Encke"] = "Vermelho";
$dados ["Wolf"] = "Preto";
$dados ["Kushida"] = "Azul";
foreach ($dados as $cometa => $grupo)
{
$valorCometa = calcularValor ($cometa);
$valorGrupo = calcularValor ($grupo);
if ($valorCometa !== $valorGrupo)
{
echo $grupo;
break; //se há um só para que continuar?
}
}

function calcularValor ($string)
{
$letras = str_split (strtoupper($string));
$valor = 1;
foreach ($letras as $letra) $valor = $valor * (ord ($letra) - 64);
return $valor % 45;
}
?>

Nota: seria bem melhor inicializar o array com os nomes já em maíusculo, para evitar o strtoupper na função calcularValor, mas deixei assim para ser fiel ao problema original. Em calcularValor poderia ter usado while (isset ($string [$index])), obviamente incrementando $index a cada ciclo, mas preferi o str_split (acho o foreach mais elegante). Note ainda que usar a função ord me livrou de criar um array com o valor de cada letra ($valor ["A"] = 1; $valor ["B"] = 2, e assim por diante).

E, por último, poderia ter feito

if (calcularValor ($cometa) !== calcularValor ($grupo)) die ($grupo);

mas acho extremista demais; prefiro código compreensível.

Editado por marmion
Link para o comentário
Compartilhar em outros sites

0 respostass a esta questão

Posts Recomendados

Até agora não há respostas para essa pergunta

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,2k
    • Posts
      652k
×
×
  • Criar Novo...