fundo
O problema das doze moedas é um quebra-cabeça clássico da balança, comumente usado em entrevistas de emprego. O quebra-cabeça apareceu pela primeira vez em 1945 e foi colocado no meu pai por meu avô quando ele pediu para casar com minha mãe! No quebra-cabeça, existem doze moedas, uma das quais é mais pesada ou mais leve que as outras (você não sabe qual). O problema é usar uma balança escalada três vezes para determinar a moeda única. Em algumas variações, também é necessário identificar se a moeda é mais pesada ou mais leve.
A tarefa aqui envolve resolver o problema geral que envolve n moedas, usando o menor número possível de pesagens no pior dos casos. Não é necessário identificar se a moeda é mais pesada ou mais leve, apenas qual é. Além disso, você não tem acesso a moedas adicionais fora do conjunto especificado (o que, curiosamente, faz a diferença).
Acontece que k pesagens são suficientes para até (3 ^ k-1) / 2 moedas (portanto, 4 pesagens nessa variação podem realmente lidar com 13 moedas). Além disso (e surpreendentemente), é possível (mas não exigido aqui) selecionar antecipadamente o conjunto completo de pesagens, em vez de as pesagens futuras dependerem dos resultados anteriores. Para descrições de duas soluções possíveis, consulte este documento e esta resposta do Quora .
Tarefa
Escreva uma função ou programa, usando um número inteiro n como entrada via STDIN, argumento de linha de comando ou argumento de função, que resolve o problema de n moedas usando o menor número possível de pesagens no pior dos casos. O programa deve:
- Imprima as pesagens para STDOUT no formato
1,2,3-4,5,6
para indicar as listas de moedas em cada lado da balança. Quaisquer moedas que não estejam sendo pesadas não devem ser mencionadas. As moedas são numeradas implicitamente de 1 a n e não precisam ser impressas em ordem numérica (2,1-3,4
o mesmo ocorre com1,2-3,4
). - Após cada pesagem, o programa deve aguardar uma entrada via STDIN, que deve ser
<
,=
ou>
, indicando se o lado esquerdo da balança é mais claro, igual ou mais pesado que o lado direito. - Após o último resultado da pesagem, o programa deve imprimir ou retornar o número da moeda única.
- O programa não precisa manipular entradas de resultados inconsistentes do usuário.
- O programa não precisa manipular n menos de 3.
Saídas de exemplo
>> 3
1-2
>> =
1-3
>> <
3
# using Quora algorithm
>> 13
1,2,3,4-5,6,7,8
>> <
1,2,5-3,4,6
>> >
3-4
>> <
3
# using paper algorithm
>> 13
1,2,3,4-5,6,7,8
>> <
2,6,7,9-3,8,10,11
>> >
6,8,10,12-4,5,7,11
>> =
3
Pontuação
O menor código vence. Aplicam-se regras padrão.