Antecedentes
El problema de las doce monedas es un clásico rompecabezas de equilibrio comúnmente utilizado en entrevistas de trabajo. ¡El rompecabezas apareció por primera vez en 1945 y fue presentado a mi padre por mi abuelo cuando él pidió casarse con mi madre! En el rompecabezas hay doce monedas, una de las cuales es más pesada o más ligera que las otras (no sabes cuál). El problema es usar una balanza tres veces para determinar la moneda única. En algunas variaciones, también es necesario identificar si la moneda es más pesada o más ligera.
La tarea aquí consiste en resolver el problema general que involucra n monedas, utilizando la menor cantidad de pesajes posible en el peor de los casos. No es necesario identificar si la moneda es más pesada o más ligera, solo cuál es. Además, no tiene acceso a ninguna moneda adicional fuera del conjunto dado (que, curiosamente, hace la diferencia).
Resulta que k pesas son suficientes para hasta (3 ^ k-1) / 2 monedas (por lo que 4 pesadas en esta variación en realidad pueden manejar 13 monedas). Además (y sorprendentemente), es posible (pero no es obligatorio aquí) seleccionar el conjunto completo de pesajes por adelantado, en lugar de que las pesadas futuras dependan de resultados pasados. Para obtener descripciones de dos posibles soluciones, consulte este documento y esta respuesta de Quora .
Tarea
Escriba una función o programa, tomando un entero n como entrada a través de STDIN, argumento de línea de comando o argumento de función, que resuelve el problema para n monedas usando la menor cantidad de pesajes posible en el peor de los casos. El programa debe:
- Imprima los pesos en STDOUT en el formato
1,2,3-4,5,6
para indicar las listas de monedas en cada lado de la báscula. No se debe mencionar ninguna moneda que no se pese. Las monedas están numeradas implícitamente del 1 al ny no necesitan imprimirse en orden numérico (por lo que2,1-3,4
es lo mismo que1,2-3,4
). - Después de cada pesaje, el programa debe esperar una entrada a través de STDIN, que debe ser
<
,=
o>
, indicando si el lado izquierdo de la báscula es más ligero, igual o más pesado que el lado derecho. - Después del último resultado de pesaje, el programa debe imprimir o devolver el número de la moneda única.
- El programa no necesita manejar entradas de resultados inconsistentes del usuario.
- El programa no necesita manejar n menos de 3.
Salidas de ejemplo
>> 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
Puntuación
El código más corto gana. Aplican reglas estándar.