天秤測りを3回だけ使って、重さの違う玉を見つける手順

http://anond.hatelabo.jp/20160629132908

9つの玉があります。

ひとつだけ重さの違う玉があります。

天秤測りを3回だけ使って、重さの違う玉を見つける手順を示しなさい。

うっかり寝る前に見たら考え始めてしまった。面白かったので起き出して解いた。
睡眠時間が減ってしまった。反省。

#include <iostream>
#include <vector> 
using namespace std; 

int right_hand_is_greater(int a, int b){
	if(a>b) return -1;
	if(a<b) return 1;
	return 0;
}

int solve(vector<int> v){
	int firstone=right_hand_is_greater(v[0]+v[1]+v[2],v[3]+v[4]+v[5]);
	
	if(firstone==0){
		// answer is 6 or 7 or 8
		if(v[6]!=v[7]){
			// answer is 6 or 7
			if(v[6]!=v[8]) return 6;
			else return 7;
		} else {
			return 8;
		}
	} else {
		// answer is between 0 to 5
		
		int secondone=right_hand_is_greater(v[0]+v[1]+v[2],v[6]+v[7]+v[8]);
		if(secondone==0){
			// answer is between 3 to 5
			int thirdone=right_hand_is_greater(v[3],v[4]);
			if(thirdone==0){
				return 5;
			} else {
				// answer is 3 or 4
				if(firstone>0){// false ball is heavy
					if(thirdone>0) return 4;
					else return 3;
				} else {
					if(thirdone>0) return 3;
					else return 4;
				}
			}
		} else {
			// answer is between 0 to 2
			int thirdone=right_hand_is_greater(v[0],v[1]);
			if(thirdone==0){
				return 2;
			} else {
				// answer is 0 or 1
				if(firstone>0){// false ball is light
					if(thirdone>0) return 0;
					else return 1;
				} else {
					if(thirdone>0) return 1;
					else return 0;
				}
			}
		}
	}
	return -1;
}


int main(void){
	int ret=0;
	// heavy ball test
	for(int i=0; i<9; ++i){
		vector<int> v(9,100);
		v[i]=101;
		int ans=solve(v);
		cout<<"ground_truth="<<i<<", your_answer="<<ans<<endl;
		if(i!=ans) ++ret;
	}
	// light ball test
	for(int i=0; i<9; ++i){
		vector<int> v(9,100);
		v[i]=99;
		int ans=solve(v);
		cout<<"ground_truth="<<i<<", your_answer="<<ans<<endl;
		if(i!=ans) ++ret;
	}
	cout<<endl;
	if(ret==0) cout<<"All answers were correct!!"<<endl;
	else cout<<ret<<(ret==1?" answer":" answers")<<" were wrong!!"<<endl;
	return 0;
}

追記:お、回答みたら同じ解き方だったっぽい。

追記2:ちなみに10個に増えた場合は

			return 8;

のかわりに

			// answer is 8 or 9
			if(v[6]!=v[8]) return 8;
			else return 9;

でよい。

追記3:ブコメみたら13個までいけるのか!そこまではとても考えられないわ・・・