sfondo
Il problema delle dodici monete è un classico puzzle di equilibrio comunemente usato nelle interviste di lavoro. Il puzzle apparve per la prima volta nel 1945 e fu proposto a mio padre da mio nonno quando chiese di sposare mia madre! Nel puzzle ci sono dodici monete, una delle quali è più pesante o più leggera delle altre (non sai quale). Il problema è usare una bilancia tre volte per determinare la moneta unica. In alcune varianti, è anche necessario identificare se la moneta è più pesante o più leggera.
Il compito qui consiste nel risolvere il problema generale che coinvolge n monete, usando il minor numero possibile di pesature nel caso peggiore. Non è necessario identificare se la moneta è più pesante o più leggera, solo quale sia. Inoltre, non hai accesso a monete aggiuntive al di fuori del set dato (che, curiosamente, fa la differenza).
Si scopre che k pesate sono sufficienti per un massimo di (3 ^ k-1) / 2 monete (quindi 4 pesate in questa variazione possono effettivamente gestire 13 monete). Inoltre (e sorprendentemente), è possibile (ma non richiesto qui) selezionare in anticipo l'intero set di pesature, piuttosto che le future pesate dipendono dai risultati passati. Per le descrizioni di due possibili soluzioni, vedere questo documento e questa risposta Quora .
Compito
Scrivi una funzione o un programma, prendendo un numero intero n come input tramite STDIN, argomento della riga di comando o argomento della funzione, che risolve il problema per n monete usando il minor numero possibile di pesature nel caso peggiore. Il programma dovrebbe:
- Stampa le pesate su STDOUT nel formato
1,2,3-4,5,6
per indicare gli elenchi di monete su ciascun lato della bilancia. Le monete non pesate non devono essere menzionate. Le monete sono implicitamente numerate da 1 a n e non devono essere stampate in ordine numerico (quindi2,1-3,4
è uguale a1,2-3,4
). - Dopo ogni pesata, il programma dovrebbe attendere un ingresso tramite STDIN, che dovrebbe essere
<
,=
o>
, indicando se il lato sinistro della bilancia è più leggero, uguale o più pesante del lato destro. - Dopo l'ultimo risultato di pesatura, il programma dovrebbe stampare o restituire il numero della moneta unica.
- Il programma non deve gestire input di risultati incoerenti da parte dell'utente.
- Non è necessario che il programma gestisca n meno di 3.
Esempi di output
>> 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
punteggio
Il codice più corto vince. Si applicano le regole standard.